3

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

  • 检测系统调用并浏览寄存器。
  • 借助. PTRACE_PEEKDATA_ptrace
  • 借助. PTRACE_POKEDATA_ptrace

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

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

4

1 回答 1

3

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

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

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