0

我想在给定的二进制文件(最好在实际的系统调用/系统输入级别(x86-64和x86)进行调用)中检测syscall brk(和其他调用,但这是第一顺序,这对我来说最重要)。sys_brk

主要目标:

  • 沙盒的一部分,为被监禁的进程提供固定数量的内存
  • 因此,我想摆脱brk系统调用(最好是下一个顺序的其他系统调用)并在fixed limit下模拟内存分配。固定限制是可用于编程的内存空间。(你可以把它想象成一种具有固定可用内存量的沙箱)

如何实施(其中之一)一些示例可能的解决方案(或您的解决方案):

  • 只是将指令更改为NOP
  • brk成功返回 0 时,通过设置内存(寄存器)状态的设置操作来模拟它的成功,就像brk成功调用的那样。
  • 更复杂的......带有代码(或函数调用)的工具,可在固定限制下模拟成功的内存分配。
  • 最灵活(在我的情况下可能是矫枉过正)将此系统调用更改为函数调用并将提供的函数添加到二进制文件中。

给定的二进制代码可以是以下两种形式之一(最好是两种形式)恶意代码:

  • 共享库 - 在这里我可以在函数调用之前设置环境(例如以受控方式调用 brk)
  • 程序二进制 - 在这种情况下,我们需要给程序固定数量的内存(由调用者,或在程序“一个系统调用”开始时),因为它无法分配。调用此类程序的示例应包含在答案中。

由于问题与许多其他方面密切相关,我尽力将其作为问题分开,但如果我应该或多或少地指定一些内容,请给我建议。

欢迎提供实施答案、资源链接(书籍、教程)。

(我对Linux和可靠的解决方案最感兴趣,因此即使在汇编程序中准备二进制文件的人也不必担心他们的代码的执行)

4

2 回答 2

1

LD_PRELOAD 将捕获对 brk() 的 C 调用,但不会捕获实际的系统调用(int/syscall 指令)。没有可移植的方法来捕获这些,但在 Linux 上,ptrace会做到这一点。内存也可以通过 mmap() 分配给程序,因此您也需要拦截该调用。

当然,看起来你真正要找的是rlimit ()。

于 2011-11-06T04:48:42.407 回答
0

Yeah, I don't think you want valgrind for this.

You can use LD_PRELOAD or linker tricks to capture brk(2): see these other discussions:

Function interposition in Linux without dlsym

Overriding 'malloc' using the LD_PRELOAD mechanism

Code might look like this:

#include <unistd.h>
#include <dlfcn.h>

/* prototype int brk(void *addr); */

static int (*real_brk)(void *addr) = NULL;

int brk(void * addr) {

    real_brk = dlsym(RTLD_NEXT, "brk");
    if (real_brk == NULL) {
            fprintf(stderr, "error mapping brk: %s\n", dlerror());
            return -1;
    }
    printf("calling brk(2) for %p\n", addr);
    return (real_brk (addr));
}`   

and then LD_PRELOAD that to intercept brk(2)

于 2011-11-03T13:05:51.483 回答