我想用仪器syscall brk http://www.kernel.org/doc/man-pages/online/pages/man2/brk.2.html(和其他电话,但这是第一顺序,这对我来说最重要)给定二进制(最好是在实际的系统调用/系统输入级别(x86-64 和 x86)sys_brk http://lxr.linux.no/#linux+v3.4.3/include/linux/syscalls.h#L455 call).
主要目标:
- 沙箱的一部分,它提供固定值被监禁进程的内存
- 所以,我想摆脱brk http://www.kernel.org/doc/man-pages/online/pages/man2/brk.2.html系统调用(最好是下一个顺序的其他调用)并模拟内存分配固定限额. 固定限额是可用于编程的内存空间。 (你可以把它想象成制作一种具有固定可用内存量的沙箱)
如何实施(其中之一)一些示例可能的解决方案(或您的解决方案):
- 只是将指令更改为NOP http://en.wikipedia.org/wiki/NOP
- As
brk
成功时返回 0,通过设置内存(寄存器)状态的设置操作来模拟它的成功,如下brk http://www.kernel.org/doc/man-pages/online/pages/man2/brk.2.html将被成功调用。
- 更复杂...带有代码(或函数调用)的工具,可在固定限制下模拟成功的内存分配。
- 最灵活(在我的情况下可能有点过分)将此系统调用更改为函数调用并将提供的函数添加到二进制文件。
给定二进制是可能以两种(最好是两种:))形式之一构成恶意的代码:
- 共享库 - 在这里我可以在函数调用之前设置环境(例如以受控方式进行 brk 调用)
- 程序二进制 - 在这种情况下我们需要给出程序固定值内存(由调用者或在程序“一个系统调用”开始时),导致它无法分配。调用此类程序的示例应包含在答案中。
由于问题与许多其他方面密切相关,我尽力将其作为问题分开,但如果我应该或多或少地指定一些内容,请给我建议。
欢迎提供实施答案、资源链接(书籍、教程)。
(我最感兴趣的是Linux,解决方案是reliable,这样人们准备二进制文件,即使是在汇编程序中,也不必担心代码的执行)
LD_PRELOAD 将捕获对 brk() 的 C 调用,但不会捕获实际的系统调用(int/syscall 指令)。没有可移植的方法来捕获这些,但在 Linux 上,ptrace http://www.linuxjournal.com/article/6100会做的。内存也可以通过 mmap() 分配给程序,因此您也需要拦截该调用。
当然,您真正想要的似乎是rlimit http://linux.die.net/man/2/setrlimit().
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)