GDB修补导致“无法访问地址0x处的内存

时间:2013-04-15 06:55:32

标签: gdb patch

我有一个程序需要使用GDB进行修补。问题是存在一行代码,使得“小于或等于测试”并且导致程序以分段错误结束失败。该程序已经编译,我没有源代码,因此我无法明显更改源代码。但是,使用GDB,我能够找到< =测试完成的位置,然后我就能找到你可以在下面看到的内存地址。

    (gdb) x/100i $pc
    ... removed extra lines ...
    0x7ffff7acb377:      jle    0x7ffff7acb3b1
    ....

我需要做的就是将测试更改为'大于或等于'测试,然后程序运行正常。 jle的操作码是0x7e,我需要将其更改为0x7d。我的作业如下所示提供了如何执行此操作的说明:

    $ gdb -write -q programtomodify
    (gdb) set {unsigned char} 0x8040856f = 0x7d
    (gdb) quit

所以我试试看......

    $ gdb -write -q player
    (gdb) set {unsigned char} 0x7ffff7acb377 = 0x7d
    Cannot access memory at address 0x7ffff7acb377

我尝试了各种其他内存地址,无论我尝试什么,我都得到相同的响应。这是我唯一的问题,我不关心这是错误的地址还是错误的操作码指令,我只是想能够修改内存。

我正在通过VMware Player运行Linux Mint 14

感谢

1 个答案:

答案 0 :(得分:2)

  

Cannot access memory at address 0x7ffff7acb377

您正在尝试写入某个共享库所在的地址。您可以找到包含info sym 0x7ffff7acb377的库。

当您尝试执行修补程序时,所述共享库尚未尚未加载,这解释了您收到的消息。

将程序运行到main然后您应该能够写入该地址。但是,您需要对库具有写入权限才能使您的写入“坚持”。

相关问题