Memory management Ptrace与内存分配

Memory management Ptrace与内存分配,memory-management,system-calls,ptrace,Memory Management,System Calls,Ptrace,我一直在玩ptrace。我学习了一些教程,比如or。到目前为止,当我有一个ptrace-d子进程时,我能够: 检测系统调用并浏览寄存器 由于PTRACE的PTRACE\u PEEKDATA选项,获取寄存器所指向地址中包含的字符串 通过PTRACE的PTRACE\u POKEDATA选项,更改这些寄存器的值并更改子进程用户空间中的内存值 我的问题如下:例如,我刚刚检测到一个open系统调用。由于ebx寄存器中存储的地址,我可以修改要打开的文件的文件名。但是,我想知道是否可以将文件名更改为我想要

我一直在玩
ptrace
。我学习了一些教程,比如or。到目前为止,当我有一个
ptrace
-d子进程时,我能够:

  • 检测系统调用并浏览寄存器
  • 由于
    PTRACE
    PTRACE\u PEEKDATA
    选项,获取寄存器所指向地址中包含的字符串
  • 通过
    PTRACE
    PTRACE\u POKEDATA
    选项,更改这些寄存器的值并更改子进程用户空间中的内存值
我的问题如下:例如,我刚刚检测到一个
open
系统调用。由于ebx寄存器中存储的地址,我可以修改要打开的文件的文件名。但是,我想知道是否可以将文件名更改为我想要的任何大小。如果我要更改的名称非常大(比方说是原始文件名长度的50倍),我会不会弄乱一些我不应该写的内存?我应该在孩子的内存空间中“分配”一些内存吗?如果是这样,将如何做到这一点


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

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

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

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

谢谢你,这帮了我的忙!最后,我代表孩子们分配内存,注入了一些代码:-)