18

如何使用 GDB 调试在 32 位 x86 处理器上没有调试符号的程序?检查函数参数、局部变量、解析指针对于知道如何做很有用。其目的并不是真正将其用于逆向工程,因为我有时只是懒得安装调试符号,并且很高兴知道如何从 gdb 中获取一些基本信息。

4

4 回答 4

26

首先,您可以这样做;

gdb "whatever"
break __libc_start_main
r

这将在 libc 的 crt0 代码中设置一个断点,并允许您在 main 之前中断,即使目标二进制文件被完全剥离。

这将使您在大多数用户代码之前的断点处进入运行状态。然后,您可以随心所欲地单步执行、分解、转储内存等。

这适用于所有平台,您询问 IA-32 / x86 的事实并不重要。

于 2009-07-14T01:56:50.787 回答
6

如果没有调试符号,则只能在 ASM 级别进行调试。好的,您可以获得更多信息,但除非您了解一点 ASM 和编译器生成的代码,否则您不会走得太远。如果您知道自己在做什么,这将让您对局部变量等进行简单的检查。

如果你有源代码,重新编译它会容易得多。

于 2008-11-26T20:22:23.940 回答
1

您所能做的就是查看寄存器和堆栈的内容 - 正如 Draemon 所提到的,您必须通过推断事物的用途来完成所有事情。

于 2008-11-27T00:43:53.210 回答
1

嗯,绝对最重要的是你能够展开堆栈。可以通过三种方式确保这一点:

  • 构建调试符号-g

  • 在通过表进行 C++ 异常展开的系统上(这些天可能是任何 ELF?),该-funwind-tables标志将告诉它生成此类表而不管语言如何,并且 GDB 可以使用这些表(至少,对于 x86 linux 可以)。

  • 或者,如果失败了,至少确保-fomit-frame-pointer没有启用

于 2010-12-06T04:59:51.273 回答