【问题标题】:Using GDB without debugging symbols on x86?在 x86 上使用 GDB 而不调试符号?
【发布时间】:2010-09-24 05:35:31
【问题描述】:

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

【问题讨论】:

    标签: debugging gdb breakpoints symbols


    【解决方案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 最适合作为汇编级调试器 - 这是一项相当胜任的任务。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-14
        • 1970-01-01
        相关资源
        最近更新 更多