如何写入正在运行的程序的stdin

时间:2018-03-24 19:37:13

标签: c linux pipe fork buffer-overflow

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

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

如果没有详细介绍赋值,我想溢出这个缓冲区,而不必手动输入Unicode字符,并且复制/粘贴对某些特殊字符没有用。

我尝试了什么

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

写入/ proc // fd / 0 这种方式有效,因为它在那里打印了我想要的字符串,但是如果我在上面的代码中添加了printf,它就不会打印任何内容。我已经尝试使用终端和正在运行的程序的pid并获得相同的结果。

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

有什么方法可以让我失踪吗?或者我在上述方法中做错了什么?

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

1 个答案:

答案 0 :(得分:2)

您可以将命令的输出传递到程序中。发送100' X'的简单方法字符后面跟一个新行进入你的程序(我将调用./prog):

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

替换上面的100以更改' X'换行符前的字符