在 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 而不调试符号?的主要内容,如果未能解决你的问题,请参考以下文章

使用 GDB 在堆栈上打印符号

如何包含 GDB 调试符号“破坏包”?

需要在 GDB 中加载共享库的调试符号

即使使用 -g 标志编译,gdb 中也没有调试符号

GDB - 未找到调试符号 -

gdb调试开启PIE且去掉符号表的程序