objdump和gdb吐出不同的组装结果

objdump和gdb吐出不同的组装结果,gdb,executable,objdump,Gdb,Executable,Objdump,您需要保存图像以阅读图像中的说明 好吧,问题来了 我在一个炸弹实验室工作只是为了消磨时间,我被这个问题困住了 objdump和gdb的不同汇编代码生成 我的笔记本电脑运行64位Ubuntu 14.04 LTS和 我已经安装了32位glibc来处理bomblab(因为它是用32位env编译的) 首先,这些符号没有显示出来,我不太明白gdb到底在说什么 有人能解释一下发生了什么吗?当您在阶段2放置断点时,gdb修补正在运行的映像,将int3指令放置在0x8048b50处,正好在阶段2的函数序言设置完

您需要保存图像以阅读图像中的说明

好吧,问题来了

我在一个炸弹实验室工作只是为了消磨时间,我被这个问题困住了

objdump和gdb的不同汇编代码生成

我的笔记本电脑运行64位Ubuntu 14.04 LTS和

我已经安装了32位glibc来处理bomblab(因为它是用32位env编译的)

首先,这些符号没有显示出来,我不太明白gdb到底在说什么


有人能解释一下发生了什么吗?

当您在
阶段2
放置断点时,
gdb
修补正在运行的映像,将
int3
指令放置在0x8048b50处,正好在
阶段2
的函数序言设置完堆栈帧之后。所以不是

0x8048b50: 8b  mov edx,DWORD PTR [ebp+0x8]
0x8048b51: 55
0x8048b52: 08
你现在有

0x8048b50: cc  int3
0x8048b51: 55  push ebp
0x8048b52: 08  first byte of an 'or' instruction
这就是
gdb
显示的内容。最终,事情会同步备份,
反汇编
命令开始显示正确的指令序列


显示内容的差异不会影响程序的正确执行;在从断点开始之前,
gdb
将把8b字节放回映像中,或者它将综合执行
mov
指令,然后在0x8048b53继续执行。

如果在运行代码之前反汇编
阶段2
,你会在gdb中得到什么,在运行代码之前,我无法得到分解的结果哦。知道为什么吗?如果打开gdb并进入>
disas phase_2
,会发生什么情况?点击后删除
phase_2
处的断点,然后
disass
查看代码是否与您期望的更像。
int3
是调试器放在那里的断点指令,在指令序列“重新同步”之前,下面几个反汇编的指令将是错误的。这一点很好!我投票支持这一评论!