2008-11-13 33 views
7

Câu hỏi thực sự là về sự tràn ngăn xếp trong C. Tôi có một sự đảm bảo rằng tôi không thể làm được cho cuộc đời của tôi, tôi đã xem xét mọi thứ trong gdb và tôi không thể đoán được .Stack Overflow Exploit trong C

Câu hỏi đặt ra là như sau:

int i,n; 

void confused() 
{ 
    printf("who called me"); 
    exit(0); 
} 

void shell_call(char *c) 
{ 
    printf(" ***Now calling \"%s\" shell command *** \n",c); 
    system(c); 
    exit(0); 
} 

void victim_func() 
{ 
    int a[4]; 
    printf("[8]:%x\n", &a[8]); 
    printf("Enter n: "); scanf("%d",&n); 
    printf("Enter %d HEX Values \n",n); 
    for(i=0;i<n;i++) scanf("%x",&a[i]); 
    printf("Done reading junk numbers\n"); 
} 

int main() 
{ 
    printf("ls=736c --- ps = 7370 --- cal = 6c6163\n"); 
    printf("location of confused %x \n", confused); 
    printf("location of shell_call %x \n", shell_call); 
    victim_func(); 
    printf("Done, thank you\n"); 

} 

Ok, vì vậy tôi quản lý để có được những câu hỏi đầu tiên một cách chính xác, mà là để tùy tiện gọi một trong hai chức năng không rõ ràng gọi trong đường dẫn chính. Bằng cách này, điều này phải được thực hiện trong khi chạy chương trình mà không có bất kỳ sửa đổi nào. Tôi đã thực hiện điều này bằng cách chạy chương trình, thiết lập N thành 7, đưa tôi đến Con trỏ chức năng của khung victim_func, tôi viết a[7] với địa chỉ bộ nhớ bị nhầm lẫn hoặc shell_call và hoạt động. (Tôi có một máy 64 bit, đó là lý do tại sao tôi phải lấy nó đến 7, vì con trỏ EBI là 2 ints rộng, thay vì 1)

Câu hỏi của tôi là như sau, làm cách nào để kiểm soát đối số nào được chuyển đến shell_code funcion? I E. làm cách nào để viết một số string đến char* c. Toàn bộ điểm đang thực hiện các lệnh unix như ps v.v. bằng cách chỉ chạy chương trình.

Tôi đã tìm ra con trỏ EBI với biểu diễn hex của ps và đặt danh sách arg là shell_call cho điều đó, nhưng điều đó không hiệu quả. Tôi cũng đã thử nhập các đối số argsv và đặt danh sách arg là shell_call thành số arg_list chính, nhưng không hoạt động.

Tôi nghĩ rằng phiên bản thứ hai sẽ hoạt động, nhưng tôi tin rằng tôi không đặt danh sách arg của khung ngăn xếp mới một cách chính xác (tôi đã làm điều đó bằng cách viết a[8] to 0, vì phần đầu tiên của con trỏ hàm và viết a[9]=736ca[10]=0000, nhưng có lẽ nó không đúng bởi vì đó là các thông số của victim_func vì vậy, làm thế nào để truy cập vào các thông số của shell_call

+7

lưu ý rằng đây là tràn _buffer_, không phải là tràn _stack_. –

+1

@Greg Rogers thực sự có, đây là một ngăn xếp tràn. Trong thực tế, heap không được sử dụng trong ứng dụng này. – rook

+0

@Rook: Bộ đệm nằm trên ngăn xếp. Nhưng tràn bộ đệm là lỗ hổng. Một tràn ngăn xếp không thể khai thác được - nếu không thì mọi trình phân tích cú pháp XML trên trái đất sẽ dễ bị tổn thương;) –

Trả lời

8

tôi có lẽ không nên làm bài tập ở nhà của bạn cho bạn nhưng về cơ bản:.?.

Bạn cần lấy bộ đệm ký tự ở đâu đó trong bộ nhớ để lưu chuỗi bạn wa nt để thực thi. Rõ ràng, bạn có thể làm điều này giống như cách bạn đang nhận các hàm khác được gọi (tức là bạn cũng đặt văn bản trên ngăn xếp). Sau khi bạn đã có văn bản đó, bạn cần phải viết một con trỏ tới nó trên stack ở vị trí mà hàm shell_code mong đợi tìm các đối số của nó.

Cách tốt nhất để tìm ra điều này mà không cần tôi làm tất cả của tác phẩm dành cho bạn là ghi lại nội dung ngăn xếp/bộ nhớ của bạn trên một mảnh giấy/bảng trắng. Viết ra nó trông như thế nào nếu bạn gọi shell_code bình thường từ bên trong chương trình. Sau đó, viết ra những gì chồng giống như bên trong victum_func và tìm ra những thứ để thay đổi để làm cho nó trông giống như nó sẽ trông "tự nhiên" (tất nhiên ghi nhớ một số điều là "không quan tâm" như địa chỉ trả lại).

Đó là tất cả các tổ chức từ thiện bạn sẽ nhận được từ tôi hôm nay! :-P

1

Bạn cần phải thao tác stack-frame của người gọi (main()), và sắp xếp nó theo cách như vậy mà trở về shell_call() từ Epilog của tràn victim_func() sau này có thể tìm thấy một chồng định cư như nó đã được được gọi bởi chính.

Khi làm như vậy bạn có thể phải mangle con trỏ khung trong ngăn xếp của nạn nhân, sẽ được khôi phục trong% ebp bằng phương tiện leave.

+2

Wow Tôi đã khai thác tràn bộ đệm và tôi không biết bạn vừa nói gì. – rook

+0

@Rook Trông giống như @Nicola đã sử dụng một trong những thiết bị tạo chuỗi văn bản Markov ưa thích này. : P –

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