这是我在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 134527652
或x $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终止符了。