【问题标题】:Reading gdb values correctly after movmov 后正确读取 gdb 值
【发布时间】:2023-03-23 04:17:01
【问题描述】:

这是我在 gdb 中调试的两行二进制文件。这是 gcc 为 IA32 编译的 C 代码:

8049345:    8b 45 08                mov    0x8(%ebp),%eax
8049348:    89 04 24                mov    %eax,(%esp)

我设置了display $eax,因此它会在每一步之后显示值。在第一行之后,display 表示:6: $eax = 134527652

我可以x 134527652x $eax 我看到0x804baa4 <input_strings+100>: "1 1 1 1 1 1" 为什么 display 和 x 给我不同的结果?

我相信下一行是说将 eax 移动到 esp 存储的地址中?我有一个display $esp 设置,上面写着:2: $esp = (void *) 0xffffd540

在第二个mov之前,我x 0xffffd540看到:0xffffd540: ""在mov之后我重复看到:

0xffffd540:  "\244\272\004\bY\233\004\b\210\325\377\377\214\325\377\377\220\325\377\377\224\325\377\377\230\325\377\377\234\325\377\377\001"

我以为这条线会将 eax 移动到这个地址,但我显然不明白这里的东西?如果您想查看二进制文件中的任何其他行,请告诉我。

【问题讨论】:

  • 我认为您对 eax 的值与它指向的地址的数据感到困惑。 134527652 是 0x804baa4。 “1 1 1 1 1 1”是该地址的数据(解释为字符)。

标签: c linux assembly gdb x86


【解决方案1】:

我认为您的困惑可能是由于x 命令将地址 0xffffd540 处的数据打印为字符串。大概在存储到该地址之前,0xffffd540 处的第一个字节是 0 字节,被视为终止字符串,因此您看到的是空字符串 ""。将值 0x804baa4 写入此地址后,您会看到它的字节表示:

\244\272\004\b

其中\244(八进制转义)为 0xa4,\272 为 0xba,\004 为 0x04,\b(退格字符的转义,U+0008)为 0x08。

你会在打印的字符串中看到更多的垃圾,因为不再有空终止符了。

【讨论】:

  • 谢谢@R..,我肯定明白答案的第一部分。但是在第二个 mov 之后,为什么它会以字节为单位显示奇怪的表示?有没有办法让我在 gdb 中以有用的方式打印出来?看到\244\272\004\b 对我的帮助不如看到0x804baa4
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-07
  • 2016-03-06
  • 2021-09-07
  • 2021-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多