2017-03-18 42 views
3

我试图附加gdbsocat启动这样的程序不能插入断点:GDB当连接到进程

socat TCP-LISTEN:5678,reuseaddr,fork EXEC:./test 

在另一端,

sudo gdb 
attach `pidof socat` 
br *0x080487D4 

时在gdb中执行continue命令,它显示如下错误:

Warning: 
Cannot insert breakpoint 1. 
Cannot access memory at address 0x80487d4 

Command aborted. 

0x08 0487D4在test程序的.text中。 gdb的follow-fork-modechild,我在网上搜索,但仍无法解决它。

我在一个月前以这种方式成功地调试了程序,并且不知道为什么它现在不起作用。但没关系,如果直接使用gdb调试程序就像这样:

gdb -q ./test 

但是,上面的方式并不符合我的需要。

通过调试,我认为gdb预计该地址是在socat而不是test程序中的有效地址。那么我怎样才能在test程序中设置断点呢?在test程序中没有断点时,执行continue命令时,它将直接运行到最后。在socat程序中设置断点是没用的。

有什么建议吗?提前致谢。

+0

你如何确定该地址是正确的地址?我没有看到你正在做什么来确定'socat'在内存中的映射位置。你是否编译为PIE代码? –

+0

你为什么觉得你需要sudo? – sigjuice

+0

@DavidHoelzer,谢谢你的回复。当反编译'test'程序时,地址是从Ida pro获得的,与'socat'无关。当一个进程与socat分离时,gdb会遵循子进程'test',所以我在那个地址设置了一个断点。我应该在'socat'而不是'test'程序中设置断点吗? – cq674350529

回答

0

我已经想出了如何在test程序中设置断点。

当启动test程序使用socat时,它将不会分叉test进程,直到套接字连接到来。所以试图直接在test程序中设置断点失败。

我使用一个工具(为了我的目的,选择pwntools)来连接并暂停它,然后使用gdb附加到分叉test进程。接下来,我可以正常调试。

有什么更好的点子?提前致谢。