在mov之后正确读取gdb值

时间:2013-01-26 03:02:40

标签: c linux assembly gdb ia-32

这是我在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"为什么显示和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"

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

1 个答案:

答案 0 :(得分:2)

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

\244\272\004\b

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

你在打印的字符串中看到更多的垃圾,因为它不再是一个空的终结符。