使用gdb和gdbserver远程设置断点

时间:2015-07-15 20:12:16

标签: debugging gdb breakpoints gdbserver

我正在远程主机上调试易受攻击的应用。我在主机上设置了gbserver:

gdbserver host:1234 /my/target/app

在我连接的本地主机上:

$ gdb /same/target/app
gdb$ target extended-remote 192.168.0.100:1234

我成功连接并可以继续在目标指令上设置断点,即:

$gdb disas vuln_function
....
   0x08048e6b <+116>:   ret
End of assembler dump.
gdb$ b *0x08048e6b
Breakpoint 1 at 0x8048e6b

查看反汇编的函数代码并在主机上对此进行了测试,我100%肯定我正在破坏正确的地址,无论如何我都在触发缓冲区溢出,这会导致gdb自行中断

但是没有在我的gdb客户端上获得通常的断点,没有任何反应。 gdbserver在BO上冻结(所以我猜它确实在ret上打破了)而没有抛出段错误。除了没有在断点上给出提示之外,gdb似乎没有崩溃或表现异常。

使用gdbserver调试时是否有一种特殊的方法来设置断点?

2 个答案:

答案 0 :(得分:1)

  

使用gdbserver调试时是否有一种特殊的方法来设置断点?

不,它应该像本地调试一样工作。

首先应该通过在本地主机上进行远程调试(gdb和gdbserver都在本地主机上运行)来说服自己设置是正确的。

如果可行,那么您的问题很可能是本地gdb和远程目标进程使用不同的应用程序二进制文件(或不同的libc.so)。

答案 1 :(得分:0)

使用gdbserver调试时是否有一种特殊的方法来设置断点?

确保使用调试符号-g -O0编译可执行文件 调试远程时,gdb客户端不知道从哪里加载符号。您有两种选择:

1. specify executable when starting gdb

gdb <executable>
(gdb) target remote <IP>:<port>
(gdb) load <executable>
 gdb should know symbols now
(gdb) b main
(gdb) mon reset
(gdb) contnue
 it should break at main
(gdb) bt

2. use file command to tell about the symbols.

gdb
(gdb) target remote <IP>:<port>
(gdb) load <executable>
(gdb) file <executable>
 gdb should know symbols now
(gdb) b main
(gdb) mon reset
(gdb) contnue
 it should break at main
(gdb) bt