У меня есть следующий пример программы:execve ("/ bin/sh", 0, 0); в трубе
#include <stdio.h>
int
main(int argc, char ** argv){
char buf[100];
printf("Please enter your name: ");
fflush(stdout);
gets(buf);
printf("Hello \"%s\"\n", buf);
execve("/bin/sh", 0, 0);
}
я и когда я бегу без трубы он работает, как должно, и возвращает sh
ПРОМТ:
bash$ ./a.out
Please enter your name: warning: this program uses gets() which is unsafe.
testName
Hello "testName"
$ exit
bash$
Но это не работает в трубе, я думаю, я знаю, почему это так, но я не могу найти решение. Пример приведен ниже.
bash$ echo -e "testName\npwd" | ./a.out
Please enter your name: warning: this program uses gets() which is unsafe.
Hello "testName"
bash$
Я полагаю, что это что-то делать с тем фактом, что gets
опустошает stdin
таким образом, что /bin/sh
получает EOF и promtly завершает работу без сообщения об ошибке.
Но как мне обойти это (без изменения программы, если это возможно, и не удалять gets
, если нет), так что я получаю промах, даже если я подаю вход через трубу?
P.S. Я бегу это на FreeBSD (4.8) машины DS
*** НИКОГДА *** использовать 'gets'. Он ** всегда ** открывает отверстие для предотвращения переполнения буфера. – ThiefMaster
Я знаю;) ...это часть попытки переполнения буфера на компьютере в лаборатории безопасности моего университета. Чисто академический. = D –