是否可以通过管道传输到使用 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
。
我有一个程序要求输入两次,但是在每次输入之间 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
。