2015-02-08 90 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 *)是返回地址的位置