在x86上如何使用没有调试符号的GDB?

20

如何在32位x86处理器上使用GDB调试没有调试符号的程序?检查函数参数、本地变量、解析指针将有助于了解如何操作。 这样做的目的并不是为了进行逆向工程,因为我有时懒得安装调试符号,知道如何从gdb中获取一些基本信息会很好。

4个回答

29

首先,你可以执行以下操作:

gdb "whatever"
break __libc_start_main
r

这将在libc的crt0代码中设置断点,并允许你在main函数执行之前中断,即使目标二进制文件完全被剥离了。

这将使你在大多数用户代码之前停在断点处。然后,你可以进行单步调试、反汇编、转储内存等操作,以满足你的需求。

这适用于所有平台,你问的是IA-32 / x86并不重要。


非常好。提一下“disassemble”是一个gdb命令,可以转储汇编代码。现在你可以阅读(或者像我一样看)汇编代码了!耶! - Lotus
2
这里有一篇关于使用GDB调试剥离二进制文件的好教程:http://felix.abecassis.me/2012/08/gdb-debugging-stripped-binaries/。 - patryk.beza

7

没有调试符号,你只能在汇编级别进行调试。好吧,你可以获得一些更多的信息,但是除非你了解一点汇编语言和编译器生成的代码,否则你不会走得很远。这将让你对本地变量等进行简单检查,如果你知道你在做什么。

如果你有源代码,重新编译它会容易得多。


在没有符号(甚至是足够优化)的情况下编译的二进制文件上,使用GDB作为汇编级别的调试器效果最佳 - 这是它相当擅长的任务。 - Falaina

1

好的,最重要的是你能够解开堆栈。有三种方法可以确保这一点:

  • 使用-g构建调试符号

  • 在通过表格进行C++异常解除的系统上(现在可能是任何ELF?),-funwind-tables标志将告诉它生成这些表格,无论语言如何,GDB可以使用这些表格(至少,在x86 linux上可以)。

  • 或者,如果以上两种方法都不行,至少确保没有启用-fomit-frame-pointer


1

你所能做的就是查看寄存器和堆栈的内容 - 你必须通过推断使用的东西来完成所有操作,正如Draemon所提到的那样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接