代码之家  ›  专栏  ›  技术社区  ›  Jacob H

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

  •  0
  • Jacob H  · 技术社区  · 6 年前

    我试图利用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 回复  |  直到 6 年前
        1
  •  2
  •   One Guy Hacking    6 年前

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

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

    替换上面的100以更改换行符之前的“X”字符数