0

所以我最近尝试了一个 CTF,我需要在标准输入中输入一些非打印字符以覆盖堆栈变量。我决定将printf命令的输出通过管道传输到程序中,这可以覆盖变量,但是当程序遇到阻塞调用并且输入不足时,会产生意外的副作用,即终止程序。

我可以编写的最短的 C 程序来演示这个问题是

#include <stdlib.h>

main()
{
    system("/bin/sh");
}

运行它通常会产生预期的结果

~$ ./a.out
> ls
. .. Documents etc etc
> _

但是如果我在这个程序上使用管道,我会得到

~$ echo "ls" | ./a.out
. .. Documents etc etc
~$

看到不同?如果我使用管道,system("/bin/sh")则在输入用完后返回,程序通常会阻塞/等待输入。也许管道正在发送导致system()返回的 EOF?如何通过改变我使用 bash 的方式使它不这样做(就像我正常输入一样)?(我无法更改 CTF 中的程序)。有没有更好的方法来输入非打印字符?

4

0 回答 0