【问题标题】:objdump and gdb spits different assembly resultsobjdump 和 gdb 吐出不同的汇编结果
【发布时间】:2014-05-06 09:59:18
【问题描述】:

您需要保存图片才能阅读图片中的说明

好吧,问题来了。

我正在做一个炸弹实验室,只是为了消磨时间,我一直被这个问题困扰

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

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

我已经安装了 32 位 glibc 以在 bomblab 上工作。(因为它是在 32 位环境中编译的)

嗯,首先符号没有显示,我真的不明白 gdb 吐出什么。

谁能解释一下这是怎么回事?

【问题讨论】:

  • 如果你在运行代码之前反汇编phase_2,你会进入gdb吗?
  • @mofoe 其实我在运行代码之前无法得到反汇编结果
  • 哦。知道为什么吗?如果你打开 gdb 并输入 > disas phase_2 会发生什么?
  • phase_2被击中后删除断点,然后disass代码,看看它是否看起来更像你期望的那样。 int3 是调试器放在那里的断点指令,后面的一些反汇编指令会出错,直到这一系列指令“重新同步”。
  • 好点!给这条评论投票!

标签: gdb executable objdump


【解决方案1】:

当您在phase_2 放置断点时,gdb 修补了正在运行的映像以将int3 指令放置在 0x8048b50 处,即在 phase_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 正在显示的内容。最终,事情得到同步备份,disassemble 命令开始显示正确的指令系列。

显示内容的不同不会影响程序的正确执行;在从断点继续之前,gdb 要么将该 8b 字节放回映像中,要么综合执行 mov 指令,然后在 0x8048b53 处继续执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-09
    • 2012-05-14
    • 2016-06-02
    • 1970-01-01
    • 1970-01-01
    • 2019-08-07
    • 1970-01-01
    相关资源
    最近更新 更多