tôi có chương trình ví dụ sau:execve ("/ bin/sh", 0, 0); trong một ống
#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);
}
tôi và khi tôi chạy mà không có bất kỳ ống nó hoạt động như mong muốn và trả về một sh
Promt:
bash$ ./a.out
Please enter your name: warning: this program uses gets() which is unsafe.
testName
Hello "testName"
$ exit
bash$
Nhưng điều này không làm việc trong một đường ống, tôi nghĩ rằng tôi biết tại sao đó là, nhưng tôi không thể tìm ra một giải pháp. Ví dụ chạy dưới đây.
bash$ echo -e "testName\npwd" | ./a.out
Please enter your name: warning: this program uses gets() which is unsafe.
Hello "testName"
bash$
tôi con số này có cái gì để làm với thực tế rằng gets
đổ stdin
theo cách như vậy mà /bin/sh
nhận EOF và promtly bỏ mà không có một thông báo lỗi.
Nhưng làm cách nào để tránh được điều này (mà không sửa đổi chương trình, nếu có thể và không xóa gets
, nếu không) để tôi nhận được lời hứa ngay cả khi tôi cung cấp đầu vào thông qua đường ống?
P.S. Tôi đang chạy trên một máy FreeBSD (4.8) DS
*** KHÔNG BAO GIỜ *** sử dụng 'get'. Nó ** luôn luôn ** mở một lỗ hổng bảo mật tràn bộ đệm. – ThiefMaster
Tôi biết;) ...đây là một phần của nỗ lực tràn bộ đệm trên máy tính tại phòng thí nghiệm bảo mật tại trường đại học của tôi. Hoàn toàn học tập. = D –