我有一个程序要求输入两次,但是在每个输入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
[这将导致第二行直到program
运行后才发送到__fpurge
,因此它可用于第二次调用read_user_input
。
当然,这有些脆弱而且容易破解,因此,如果这是您自己的程序,而不是您无法编辑其源代码的CTF,则应该对其进行重新设计以使其不起作用__fpurge
。