这是我在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

在第二个 Action 之前,我x 0xffffd540并看到:在 Action 之后的0xffffd540: ""我重复并看到:
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"

我以为这行代码会把地址挪到这个地址,但是我显然不明白这里的内容吗?让我知道您是否想查看二进制文件中的其他任何行。

最佳答案

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

\244\272\004\b

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

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

07-28 10:31