Ptrace和内存分配

时间:2012-11-11 11:41:26

标签: memory-management system-calls ptrace

我和ptrace玩了一段时间。我按照了this onethis one这样的教程。到目前为止,当我有一个ptrace - d子进程时,我能够:

  • 检测系统调用并浏览寄存器。
  • 感谢寄存器指向的地址中包含的字符串,这要归功于PTRACE_PEEKDATA的{​​{1}}选项。
  • 由于ptrace的{​​{1}}选项,更改这些寄存器的值并更改子流程用户空间中的内存值。

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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