如何在32位x86处理器上使用GDB调试没有调试符号的程序?检查函数参数、本地变量、解析指针将有助于了解如何操作。 这样做的目的并不是为了进行逆向工程,因为我有时懒得安装调试符号,知道如何从gdb中获取一些基本信息会很好。
如何在32位x86处理器上使用GDB调试没有调试符号的程序?检查函数参数、本地变量、解析指针将有助于了解如何操作。 这样做的目的并不是为了进行逆向工程,因为我有时懒得安装调试符号,知道如何从gdb中获取一些基本信息会很好。
首先,你可以执行以下操作:
gdb "whatever"
break __libc_start_main
r
这将在libc的crt0代码中设置断点,并允许你在main函数执行之前中断,即使目标二进制文件完全被剥离了。
这将使你在大多数用户代码之前停在断点处。然后,你可以进行单步调试、反汇编、转储内存等操作,以满足你的需求。
这适用于所有平台,你问的是IA-32 / x86并不重要。
没有调试符号,你只能在汇编级别进行调试。好吧,你可以获得一些更多的信息,但是除非你了解一点汇编语言和编译器生成的代码,否则你不会走得很远。这将让你对本地变量等进行简单检查,如果你知道你在做什么。
如果你有源代码,重新编译它会容易得多。
好的,最重要的是你能够解开堆栈。有三种方法可以确保这一点:
使用-g
构建调试符号
在通过表格进行C++异常解除的系统上(现在可能是任何ELF?),-funwind-tables
标志将告诉它生成这些表格,无论语言如何,GDB可以使用这些表格(至少,在x86 linux上可以)。
或者,如果以上两种方法都不行,至少确保没有启用-fomit-frame-pointer
你所能做的就是查看寄存器和堆栈的内容 - 你必须通过推断使用的东西来完成所有操作,正如Draemon所提到的那样。