Можно ли подключиться к программе C, которая использует fpurge для очистки stdin? - PullRequest
1 голос
/ 07 мая 2020

У меня есть программа, которая дважды запрашивает ввод, но между каждым вводом вызывается fpurge(stdin).

Итак, если бы я хотел ввести «3», а затем «Hello World», я бы попробовал echo "3\nHelloWorld" | program, но программа будет читать только "3", затем flu sh stdin перед чтением "Hello World". Я попытался перенаправить ввод программы в именованный канал и дважды написал в именованный канал, прежде чем закрыть канал, но безуспешно.

Вот какой-то псевдокод части программы.

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

Есть идеи? Спасибо.

1 Ответ

2 голосов
/ 07 мая 2020

Ваша программа в конечном итоге прочитает больше данных, чем необходимо для разрешения первого вызова read_user_input, если он доступен, что приведет к __fpurge отбрасыванию остальных. Чтобы избежать этого, попробуйте sleep:

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

. Это приведет к тому, что вторая строка не будет отправлена ​​на program до тех пор, пока не выполнится __fpurge, поэтому она будет доступна для второго вызова. на read_user_input.

Конечно, это несколько agile и хакерское, так что если бы это была ваша собственная программа, а не CTF, исходный код которой вы не можете редактировать, вам следовало бы ее переработать не делать __fpurge.

...