在bash中使用NULL字节(用于缓冲区溢出)

时间:2017-06-12 09:30:01

标签: python c linux bash

我编写了一个易受缓冲区溢出影响的小程序。一切都按预期工作,但我现在遇到了一个小问题:

我想调用一个位于地址0x00007ffff7a79450的函数,因为我通过bash终端传递缓冲区溢出的参数(如下所示:

./a "$(python -c 'print "aaaaaaaaaaaaaaaaaaaaaa\x50\x94\xA7\xF7\xFF\x7F\x00\x00"')" )

我收到一个错误,bash忽略了nullbytes。

/bin/bash: warning: command substitution: ignored null byte in input

因此,我最终在内存中使用了错误的地址(0x7ffff7a79450而不是0x00007ffff7a79450)。

现在我的问题是:我怎样才能产生领先的0并将它们作为我的程序的参数?

1 个答案:

答案 0 :(得分:2)

我会采取大胆的行动并断言你想要做的事情在POSIX环境中是不可能的,因为参数的传递方式。

使用execve系统调用运行程序。

int execve(const char *filename, char *const argv[], char *const envp[]);

还有一些其他功能,但所有功能最终都包含execve,或者使用扩展系统调用,具有以下属性:

  • 程序参数使用NUL终止字符串数组传递。

这意味着当内核接受你的参数并将它们放在一边供新程序使用时,它只会将它们读取到第一个NUL字符,并丢弃后面的任何内容。

因此,如果必须包含空字符,则无法使您的示例正常工作。这就是为什么我建议从stdin读取,而没有这样的限制:

char buf[256];
read(STDIN_FILENO, buf, 2*sizeof(buf));

您通常需要检查read的返回值。对于玩具问题,它应该足以触发您的漏洞利用。只需将恶意输入传输到您的程序中即可。