GDB x64:替换指令时无法访问内存

时间:2013-01-01 16:02:57

标签: assembly gdb x86-64

(我在Debian 7,arm64)

为了强制vmware-networks输出日志而不是转储日志,我想修改日志记录功能。在我的Windows机器上使用IDA,我在.text:0000000000068900 jz loc_689A4找到了指令。

运行gdb /usr/bin/vmware-networks时,会出现指令:

(gdb) x 0x68900
0x68900:        0x009e840f
(gdb) x/i 0x68900
0x68900:     je     0x689a4

但是当试图断点时,我得到了

(gdb) break *0x68900
Breakpoint 1 at 0x68900
(gdb) run --start
Starting program: /usr/bin/vmware-networks --start
Warning:
Cannot insert breakpoint 1.
Error accessing memory address 0x68900: Input/output error.

在尝试热线连接指令然后进行"运行"时,我得到了     (gdb)设置* 0x68900 = 0x009e850f     无法访问地址0x68900

的内存

为什么会这样,我该如何解决?是的,我在root上运行,所以(通常)不应该有任何问题。

1 个答案:

答案 0 :(得分:0)

问题是这个二进制文件是可重定位的。 break main后跟run会为您提供旧的main位置以及重新定位的位置:

(gdb) break main
Breakpoint 1 at 0x1e990
(gdb) run --start
Starting program: /usr/bin/vmware-networks --start
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Breakpoint 1, 0x00007ffff7f1a990 in main ()

=>瞧,我们的重定位偏移量为0x7FFFF7EFC000。将其添加到任何“旧”偏移量,并且您有重新定位的偏移量用于检查,编辑等:

(gdb) x/i 0x7FFFF7F64900
0x7ffff7f64900:      je     0x7ffff7f649a4

在IDA中重新定位整个二进制文件,以便在那里获得正确的偏移量,如果你愿意,你也可以在那里完成。