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

标签 c++ c linux memory stack

我正在尝试粉碎堆栈并尝试从下面的链接中读取 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;
}

上述代码的信息框架 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 "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) 

如何从缓冲区地址计算返回地址?

[编辑]

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

像这样我想放置我的缓冲内存

最佳答案

call汇编指令将指令指针压入堆栈,然后将call指令中的地址放入指令指针中。 正常的函数入口如下:

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 *) 就是返回地址的位置

关于c++ - 从缓冲区指针计算堆栈中的返回地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28393863/

相关文章:

c - malloc 将 errno 设置为 EAGAIN

c - 一维和二维数组的时间复杂度

linux - 如何输出shell脚本的开始和停止日期时间(但不输出其他日志)?

c++ - 我如何找出我的 3D 容器的元素是什么类型?

c++ - 如何指定Qt插件构造函数?

c++ - QOpenGLWidget 的 resizeGL 不是调用 glViewport 的地方?

使用 gcc 编译 cuda 结果为 : error: ‘threadIdx’ undeclared

linux - shell 编程或 SED/AWK

c++ - 从一个目录中读取许多小文件会有多大问题?

c++ - 如何在不抽取 WM_PAINT 的情况下在 STA 中抽取 COM 消息?