如何写入 运行 程序的标准输入

How to write to stdin of a running program

我试图利用 C 代码中的缓冲区溢出漏洞,基本上可以归结为:

int main(void) {
    char buf[100];
    gets(buf);
    return 0;
}

无需详细说明赋值,我想溢出此缓冲区而不必手动键入 Unicode 字符,并且 copy/pasting 对某些特殊字符没有解决。

我试过的

Copying/pasting 直接字符串。这似乎对某些角色有奇怪的结果。例如,如果我粘贴字符“\x90”并检查 gdb 中的内存,它显示为“\x90\x21”。

Writing to /proc//fd/0 这有点工作,因为它在终端打印我想要的字符串,但是如果我在上面的代码中添加 printf 它不打印任何东西。我尝试使用终端和 运行 程序的 pid 并得到相同的结果。

使用 pipe()、fork()、dup()、exec() 最后我编写了一个打开管道的程序,将写入流复制到标准输入,执行程序,然后将攻击写入写入管道。这实际上写了字符串,并将打印它。但是,它不会写入所有字节。如果我尝试将 500 字节的 'A' 写入易受攻击的程序,它只会打印 ~120,而且程序甚至不会崩溃。

有什么方法是我遗漏的吗?或者我在上述方法中做错了什么?

我在 VirtualBox 中使用 Ubuntu 12.04。如果需要更多信息,请告诉我。

您可以将命令的输出通过管道传输到您的程序中。将 100 'X' 个字符后跟换行符发送到程序中的简单方法(我称之为 ./prog):

sh -c 'for i in `seq 1 100` ; do echo -n X; done; echo ""' | ./prog

替换上面的100来改变换行符前的'X'个字符