【问题标题】:Ptrace and memory allocationPtrace 和内存分配
【发布时间】:2012-10-31 02:42:00
【问题描述】:

我和ptrace 玩了一段时间。我遵循了一些教程,例如 this onethis one。到目前为止,当我有一个ptrace-d 子进程时,我能够:

  • 检测系统调用并浏览寄存器。
  • 借助ptracePTRACE_PEEKDATA 选项,获取寄存器指向的地址中包含的字符串。
  • 借助ptracePTRACE_POKEDATA 选项,更改这些寄存器的值并更改子进程用户空间中的内存值。

我的问题如下:假设我刚刚检测到一个open 系统调用。由于存储在 ebx 寄存器中的地址,我可以修改要打开的文件的文件名。但是,我想知道是否可以将文件名更改为任何我想要的任何大小。如果我要更改的名称非常大(假设是原始文件名长度的 50 倍),我不会弄乱一些我不应该写的内存吗?我应该在孩子的记忆空间中“分配”一些记忆吗?如果是这样,该怎么做?

请注意,子进程是用execve执行的某个程序,我无法访问它的源代码。

【问题讨论】:

    标签: memory-management system-calls ptrace


    【解决方案1】:

    传递给 open 的路径名可以由程序动态分配(因此它在堆或堆栈的某处),或者如果它是编译时常量,它可以在只读部分中。无论哪种情况,您都不知道程序的其他部分可能正在使用它,因此更改其内容可能不是一个好主意。如果您写入超过当前长度,您肯定会覆盖相邻的内存(这可能会导致一些微妙的问题,例如损坏堆元数据或损坏其他随机分配对象)。

    以下是一些关于如何在子进程中分配内存的随机想法(完全未经测试):

    • 代表它调用 mmap 系统调用(这可能会非常棘手),但会为您提供一页(或更多)内存供您使用
    • 在当前堆栈中分配一些空间(不要更改孩子的寄存器,但使用您对孩子使用堆栈的哪一部分的了解将临时对象放入未使用的部分)。从技术上讲,子进程做同样的事情是合法的(因此您最终可能会破坏该数据),但这种可能性很小。
    • 在堆栈的远端隐藏东西,(再次假设孩子没有也在玩这个把戏)。
    • 我认为调用 malloc 并不容易,但我在谷歌上搜索“ptrace child allocate memory”时发现:http://www.hick.org/code/skape/papers/needle.txt(它会找到 ELF 动态链接器使用的 malloc 例程并构造一个调用来分配内存记忆)。

    【讨论】:

    • 谢谢你,这对我有帮助!我最终代表注入一些代码的孩子分配内存:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-13
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    相关资源
    最近更新 更多