2013-01-03 42 views
5

Tôi đã cố gắng thực hiện tràn bộ đệm (tôi đang sử dụng Linux) trên một chương trình đơn giản yêu cầu mật khẩu. Dưới đây là mã chương trình:Lỗi tràn bộ đệm không hoạt động

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int check_authentication(char *password){ 

int auth_flag = 0; 
char password_buffer[16]; 

strcpy(password_buffer, password); 

if(strcmp(password_buffer, "pass1") == 0) 
    auth_flag = 1; 
if(strcmp(password_buffer, "pass2") == 0) 
    auth_flag = 1; 

return auth_flag; 

} 

int main(int argc, char **argv) 
{ 

if(argc < 2){ 

    printf("\t[!] Correct usage: %s <password>\n", argv[0]); 
    exit(0); 

} 

if(check_authentication(argv[1])){ 

    printf("\n-=-=-=-=-=-=-=-=\n"); 
    printf(" Access granted.\n"); 
    printf("-=-=-=-=-=-=-=-=\n"); 

} else { 

    printf("\nAccess Denied.\n"); 

} 


    return 0; 

} 

OK, bây giờ tôi đã biên soạn, không có lỗi và lưu nó dưới dạng tràn.

Bây giờ tôi mở Terminal, tôi chuyển vào thư mục tập tin (Desktop) và sau đó đã viết:

./overflow.c AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 

The Terminal cho biết: "Stack đập phát hiện" (hoặc một cái gì đó như thế) và sau đó thoát khỏi chương trình chấp hành.

Bây giờ, tôi đang đọc một cuốn sách, được gọi là "Hacking - Nghệ thuật khai thác" của Jon Erickson. Trong một chương, ông giải thích loại khai thác này (tôi lấy mã từ cuốn sách) và thực hiện cùng một lệnh mà tôi đã làm. Bộ nhớ tràn và chương trình in "Truy cập được cấp". Bây giờ, tại sao hệ điều hành của tôi phát hiện tôi đang cố gắng khai thác chương trình? Tôi đã làm gì sai?

Tôi cũng đã thử khai thác trên Mac OS X. Cùng một điều đã xảy ra. Xin vui lòng ai có thể giúp tôi? Cảm ơn trước.

Trả lời

9

Trong tràn bộ đệm phân phối Linux hiện đại được phát hiện và quá trình này bị hủy. Để tắt chế độ mà chỉ đơn giản biên dịch ứng dụng của bạn với lá cờ như vậy (gcc):

-fno-stack-protector -fno-stack-protector-all

+0

Ok, cảm ơn bạn đã trả lời và để được trợ giúp! – jndok

+0

Bạn được chào đón :) –

+0

Bài đăng hay, bạn đời! Bạn có thể biết một giải pháp cho môi trường Cygwin không? '-fno-stack-protector' dường như không tạo ra bất kỳ sự khác biệt nào. – Powerslave

0

Hầu hết các hệ điều hành hiện đại đã cơ chế bảo vệ được xây dựng trong Hầu như bất kỳ hệ điều hành tốt không cho phép truy cập bộ nhớ ở mức độ thấp trực tiếp đến bất kỳ chương trình. . Nó chỉ cho phép các chương trình truy cập vào không gian địa chỉ được cấp phát cho chúng. Linux dựa trên hệ điều hành tự động giết chết các quá trình cố gắng truy cập vượt ra ngoài không gian bộ nhớ được phân bổ của họ.

Ngoài điều này, hệ điều hành còn có cơ chế bảo vệ ngăn chương trình không đâm vào hệ thống bằng cách cấp phát lượng bộ nhớ lớn, trong nỗ lực làm cạn kiệt tài nguyên sẵn có cho hệ điều hành.

3

Nếu biên dịch bằng gcc, hãy thêm -fno-stack-protector cờ. Tin nhắn bạn nhận được có nghĩa là bảo vệ bạn khỏi mã xấu của bạn :)

1

Lý do ngăn xếp đập thực sự là cơ chế bảo vệ được một số trình biên dịch sử dụng để phát hiện các cuộc tấn công tràn bộ đệm. Bạn đang cố gắng đặt 29 A vào một mảng ký tự ngắn hơn (16 byte).

Các vấn đề liên quan