我编写了一个易受缓冲区溢出影响的小程序。一切都按预期工作,但我现在遇到了一个小问题:
我想调用一个位于地址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并将它们作为我的程序的参数?
答案 0 :(得分:2)
我会采取大胆的行动并断言你想要做的事情在POSIX环境中是不可能的,因为参数的传递方式。
使用execve系统调用运行程序。
int execve(const char *filename, char *const argv[], char *const envp[]);
还有一些其他功能,但所有功能最终都包含execve,或者使用扩展系统调用,具有以下属性:
这意味着当内核接受你的参数并将它们放在一边供新程序使用时,它只会将它们读取到第一个NUL字符,并丢弃后面的任何内容。
因此,如果必须包含空字符,则无法使您的示例正常工作。这就是为什么我建议从stdin读取,而没有这样的限制:
char buf[256];
read(STDIN_FILENO, buf, 2*sizeof(buf));
您通常需要检查read
的返回值。对于玩具问题,它应该足以触发您的漏洞利用。只需将恶意输入传输到您的程序中即可。