5

为了更多地了解 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

但是在分叉后单步执行指令后,这似乎不起作用。

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

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

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

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

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

对于那些有兴趣直接查看二进制文件的人,所有游戏二进制文件都有一个torrent 。

4

1 回答 1

3

在这里寻找答案。简而言之,看起来 GDB 仅在 HP-UX 和 Linux 上支持子调试模式。

于 2009-10-07T17:21:25.343 回答