GDB没有停止在第一个带有break _start或info文件入口点地址的机器代码指令

时间:2013-04-16 01:18:25

标签: debugging gdb reverse-engineering

我想调试一个我没有符号文件的应用程序。我知道如果我缺少必要的调试信息,就必须在汇编级别进行调试。由于我没有调试符号,因此无法直接在方法名称上设置断点,但我仍然可以在地址上设置断点。

所以我只是试着在入口地址上设置一个断点,这就是我所做的:

user@MacBookAir$ gdb
(gdb) file someexecutable
(gdb) info file

最后一个命令返回以下入口点: enter image description here

收到地址后,我只是说:

(gdb) break *0x0000000100119ec8
(gdb) run

不幸的是,目标应用程序在入口点没有突破时启动,所以我再次尝试了,但这次我在入口点地址后面的几个地址上设置了断点 - 没有成功。

下一次尝试是尝试Igor Skochinsky的解决方案,他在此问题(Stopping at the first machine code instruction in GDB)中发布以设置断点:

(gdb) b _start
(gdb) b start

但是这两个命令都导致了同样的错误:

  

未加载符号表。使用“file”命令。

好吧,显然我需要调试符号才能正常工作。然后我想也许它只显示了一个不正确的入口点地址,所以我用命令验证它:

user@MacBookAir$ otool -l someexecutable

并收到以下输出: enter image description here

所以它似乎与GDB返回的入口点相同。现在我不知道还能尝试什么。 :) 也许你们知道我还能尝试什么。任何帮助将非常感谢。如果某些事情不清楚,或者我错过了一些重要信息,请留下简短的评论。

1 个答案:

答案 0 :(得分:1)

这看起来像GDB中的一个错误。我猜测ASLR将二进制文件重定位到另一个地址,但GDB不会移动断点。我建议以下之一:

  1. 停用ASLR:set disable-aslr on
  2. 设置env var DYLD_NO_PIE=1
  3. 从可执行文件的标题中删除MH_PIE标志
  4. 将入口点修补为0xCC。一旦中断,您可以将其修补回原始字节。