如何使用GDB调试32位x86处理器上没有调试符号的程序?检查函数参数,局部变量,解析指针对知道如何操作很有用。 目的并不是将它用于逆向工程,因为我有时懒得安装调试符号,并且很高兴知道如何从gdb中获取一些基本信息。
答案 0 :(得分:22)
首先,你可以这样做;
gdb "whatever"
break __libc_start_main
r
将在libc的crt0代码中设置一个断点,并允许你在main之前断开,即使目标二进制文件被完全剥离。
这将使您在大多数用户代码之前到达断点处的运行状态。然后你可以单步,消解,转储等等......直到你的内心。
这适用于所有平台,您询问IA-32 / x86无关紧要。
答案 1 :(得分:7)
如果没有调试符号,则只能在ASM级别进行调试。好的,您可以获得位更多信息,但除非您了解一些ASM和编译器生成的代码,否则您不会走得太远。这将让你对局部变量等进行简单的检查如果你知道你在做什么。
如果你有源代码,那么重新编译它会容易得多。
答案 2 :(得分:1)
所有你能做的就是查看寄存器和堆栈的内容 - 你必须通过推断用于什么东西来做所有事情,正如Draemon所提到的那样。
答案 3 :(得分:0)
嗯,最重要的是你能够解开堆栈。有三种方法可以确保:
使用-g
在通过表进行C ++异常展开的系统上(现在可能是ELF的任何东西?),-funwind-tables
标志将告诉它生成这样的表而不管语言如何,GDB可以使用这些表(在至少,使用x86 linux它可以)。
或者,如果失败,至少要确保-fomit-frame-pointer
未启用