【问题标题】:GDB Patching results in "Cannot access memory at address 0xGDB 修补导致“无法访问地址 0x 处的内存”
【发布时间】:2013-04-15 23:06:42
【问题描述】:

我有一个需要使用 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 中的工作方式略有不同)

标签: gdb patch


【解决方案1】:

Cannot access memory at address 0x7ffff7acb377

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

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

运行程序到main那么你应该可以写信给地址了。但是,您需要对库具有写入权限才能使您的写入“坚持”。

【讨论】:

  • 谢谢,这解决了我的问题。我最终需要写一个不属于共享库的不同地址,但这让我找到了我需要在哪里/如何更改内容。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-08
  • 2013-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-06
相关资源
最近更新 更多