मैं निम्न उदाहरण कार्यक्रम है:निष्पादित करें ("/ 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
इस तरह से कि /bin/sh
एक EOF प्राप्त करता है और promtly एक त्रुटि संदेश के बिना इस्तीफा में stdin
खाली के साथ कुछ है।
लेकिन मैं इस बारे में कैसे प्राप्त करूं (यदि संभव हो तो कार्यक्रम को संशोधित किए बिना, और gets
को हटा नहीं रहा है), ताकि मुझे एक पाइप के माध्यम से इनपुट की आपूर्ति करने के बावजूद एक प्रोमेट मिल जाए?
पीएस मैं एक FreeBSD (4.8) मशीन डी एस
*** कभी नहीं *** 'प्राप्त' का उपयोग करें। यह ** हमेशा ** एक बफर ओवरफ्लो सुरक्षा छेद खोलता है। – ThiefMaster
मुझे पता है;) ...यह मेरे विश्वविद्यालय में सुरक्षा प्रयोगशाला में एक कंप्यूटर पर एक बफर ओवरफ्लो प्रयास का हिस्सा है। शुद्ध रूप से अकादमिक। = डी –