是否可以通过管道传输到使用 fpurge 清除标准输入的 C 程序?

Is it possible to pipe to a C program that uses fpurge to clear stdin?

我有一个程序要求输入两次,但是在每次输入之间 fpurge(stdin) 被调用。

因此,如果我想输入“3”然后 "Hello World",我会尝试 echo "3\nHelloWorld" | program,但程序只会读取“3”,然后在读取 "Hello World" 之前刷新标准输入。我试过将程序输入重定向到命名管道,并在关闭管道之前一个接一个地写入命名管道两次,但没有成功。

这是部分程序的一些伪代码。

num = read_user_input("Insert number: ");
__fpurge(stdin);
name = read_user_input("Insert name: ");

有什么想法吗?谢谢。

您的程序将最终读取比解决对 read_user_input 的第一次调用(如果可用)所需的数据更多的数据,这将导致 __fpurge 丢弃其余数据。避免这种情况的快速破解是 sleep:

(echo 3; sleep 1; echo HelloWorld) | program

这将导致第二行在 __fpurge 运行后才发送到 program,因此它可用于对 read_user_input.[=18= 的第二次调用]

当然,这有点脆弱和 hacky,所以如果这是您自己的程序而不是您无法编辑其源代码的 CTF,您应该对其进行修改以不这样做 __fpurge