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