Debugging 在x86上使用GDB而不调试符号?

Debugging 在x86上使用GDB而不调试符号?,debugging,gdb,breakpoints,symbols,Debugging,Gdb,Breakpoints,Symbols,如何使用GDB调试在32位x86处理器上没有调试符号的程序?检查函数参数、局部变量和解析指针将有助于了解如何操作。 我的意图并不是真正将其用于逆向工程,因为我有时懒得安装调试符号,如果知道如何从gdb中获取一些基本信息,那就太好了。如果没有调试符号,您只能在ASM级别进行调试。好的,您会得到更多的信息,但是除非您了解一点ASM和编译器生成的代码,否则您不会走得很远。如果您知道自己在做什么,这将让您对局部变量等进行简单检查 如果您有源代码,只需重新编译它就会容易得多。您所能做的就是查看寄存器和堆栈

如何使用GDB调试在32位x86处理器上没有调试符号的程序?检查函数参数、局部变量和解析指针将有助于了解如何操作。
我的意图并不是真正将其用于逆向工程,因为我有时懒得安装调试符号,如果知道如何从gdb中获取一些基本信息,那就太好了。

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


如果您有源代码,只需重新编译它就会容易得多。

您所能做的就是查看寄存器和堆栈的内容-您必须通过推断东西的用途来做一切,就像Draemon提到的那样。

开始时,您可以这样做

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

这将使您在大多数用户代码之前的断点处进入运行状态。然后,您可以单步执行、解除同步、转储内存等操作。。。让你心满意足


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

好吧,最重要的是您能够解开堆栈。有三种方法可以确保这一点:

  • 使用
    -g

  • <> LI> < P>对通过表进行C++异常解开的系统(可能是最近的ELF),该标志将告诉它不管语言如何生成这样的表,GDB可以使用这些表(至少,用X86 Linux可以)。
  • 或者,如果失败,至少要确保未启用
    -fomit帧指针


+1,在无符号编译的二进制文件(甚至是充分优化的二进制文件)上的GDB作为汇编级调试器工作得最好——这是一项相当胜任的任务。非常好。提到“反汇编”是一个转储ASM的gdb命令会很酷。现在您可以阅读(或者,在我的例子中,查看)ASM代码了!耶!关于使用GDB调试剥离的二进制文件。