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

5

我有一个需要使用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

谢谢


你也可以在其他十六进制编辑器中完成此操作(但是在gdb中地址的使用方式略有不同)。 - phil294
1个回答

2

无法访问地址0x7ffff7acb377的内存

您试图写入某个共享库所在的地址。您可以使用info sym 0x7ffff7acb377查找该库。

在您尝试执行补丁时,该共享库尚未被加载,这解释了您收到的消息。

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


谢谢,这解决了我的问题。我最终需要写入一个不属于共享库的不同地址,但这让我找到了需要更改的地方/方式。谢谢! - Eric T

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接