我正在远程主机上调试易受攻击的应用。我在主机上设置了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调试时是否有一种特殊的方法来设置断点?
答案 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