【发布时间】:2010-09-24 05:35:31
【问题描述】:
如何使用 GDB 调试在 32 位 x86 处理器上没有调试符号的程序?检查函数参数、局部变量、解析指针对于知道如何做很有用。 其目的并不是真正将其用于逆向工程,因为我有时只是懒得安装调试符号,并且知道如何从 gdb 中获取一些基本信息会很棒。
【问题讨论】:
标签: debugging gdb breakpoints symbols
如何使用 GDB 调试在 32 位 x86 处理器上没有调试符号的程序?检查函数参数、局部变量、解析指针对于知道如何做很有用。 其目的并不是真正将其用于逆向工程,因为我有时只是懒得安装调试符号,并且知道如何从 gdb 中获取一些基本信息会很棒。
【问题讨论】:
标签: debugging gdb breakpoints symbols
嗯,最重要的是你能够展开堆栈。可以通过三种方式确保这一点:
使用-g构建调试符号
在通过表执行 C++ 异常展开的系统上(现在可能是任何 ELF使用 x86 linux 可以)。
或者,如果失败了,至少要确保 -fomit-frame-pointer 未启用
【讨论】:
一开始,你可以做;
gdb "whatever"
break __libc_start_main
r
这将在 libc 的 crt0 代码中设置一个断点,并允许您在 main 之前中断,即使目标二进制文件被完全剥离。
这将使您在大多数用户代码之前的断点处进入运行状态。然后,您可以随心所欲地单步执行、拆卸、转储内存等。
这适用于所有平台,您询问 IA-32 / x86 的事实并不重要。
【讨论】:
您所能做的就是查看寄存器和堆栈的内容 - 正如 Draemon 所提到的,您必须通过推断事物的用途来完成所有工作。
【讨论】:
如果没有调试符号,则只能在 ASM 级别进行调试。好的,您会获得bit 更多信息,但除非您了解一点 ASM 和编译器生成的代码,否则您不会走得太远。这将让您对局部变量等进行简单检查如果您知道自己在做什么。
如果你有源代码,重新编译它会容易得多。
【讨论】: