【问题标题】:gdb not hitting breakpointsgdb 没有遇到断点
【发布时间】:2010-12-03 16:37:59
【问题描述】:

为了更多地了解 FreeBSD 和 *nix 系统,我开始查看来自 DEFCON 17 Capture The Flag 游戏的二进制文件。现在,我正在反转 tucod 二进制文件。以下是关于 tucod 的一些可能有用的信息:

tucod: ELF 32-bit LSB executable, Intel 80386, version 1 (FreeBSD), for FreeBSD 7.2, dynamically linked (uses shared libs), FreeBSD-style, stripped

从一些简短的静态分析中获得的其他一些可能有用的信息是 tucod 绑定在端口 0xDEAD 上(可爱,是吗?),如果你给它一个特定的密码(“HANGEMHIGH!”),它会玩一个刽子手游戏和你一起。

我遇到的问题是我没有在 gdb 中遇到断点。 具体来说,我试图到达的断点位于处理客户端连接的代码中。如果没有断点,代码将按预期执行。当我在该代码上设置断点时,孩子退出(而不是像预期的那样进入 gdb)。如果我在服务器分叉孩子之前设置断点,我可以很好地点击这些,但是在点击“继续”之后,孩子不会继续处理我的连接(也就是说,它不会要求我输入密码或玩hang-man )。

由于守护进程在收到新连接时会分叉,因此我尝试使用以下命令告诉 gdb 跟随子进程:

(gdb) set follow-fork-mode child

但是在fork之后单步执行指令后,似乎这行不通。

我尝试寻找对 signal 的调用,认为他们实现了自定义 SIGINT 处理程序(或类似处理程序),但我可以看到对 signal 的唯一调用处理 SIGCHLD。

我在 gdb 中的断点目前如下所示:

(gdb) info breakpoints
Num Type           Disp Enb Address    What
1   breakpoint     keep y   0x080497d0

0x080497d0 是我想在客户端处理代码中中断的地址。

我对分析 *nix 系统上的软件有点陌生,可以使用一些指针。 我还应该如何解决为什么 GDB 不会达到我的断点? 还是我忽略了一些重要的事情?

所有游戏二进制文件都有一个torrent,供有兴趣直接查看二进制文件的人使用。

【问题讨论】:

    标签: gdb reverse-engineering breakpoints freebsd


    【解决方案1】:

    查看here 的答案。简而言之,GDB 似乎只在 HP-UX 和 Linux 上支持子调试模式。

    【讨论】:

    • 谢谢!我为此采用的解决方法是只修补二进制文件并让父母执行孩子的部分。对我来说,这比尝试添加睡眠调用更简单,因为我没有来源。但是对正在发生的事情的解释是我真正想要的。再次感谢。
    • @Nikolai 链接断开
    猜你喜欢
    • 2021-01-21
    • 2015-02-26
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 2016-04-23
    • 2013-10-04
    • 2017-11-09
    • 2016-11-15
    相关资源
    最近更新 更多