原理
(注: push ebp,esp 应该改成 mov ebp,esp)
例题
buuctf的pwn1_sctf_2016
NX保护开启,栈中数据没有执行权限。
ida打开,主程序如下:
可以看到原函数没有溢出点,输入进行了限制。比如fgets(&s, 32, edata);
s的长度为0x3c,但限制32位输入。
但是26行位置进行了替换,当输入”I”的时候会被替换为you, 所以就可以用 20 个 ”I“ (小于 32) 得到 60 (0x3c)个字符造成溢出,再随便填一个返回地址就可以完成溢出。
后门地址如上,因为没有经过地址随机化措施,所以地址为0x8048f0d
脚本如下:
1 | from pwn import * |
(payload组成为20个‘I’覆盖s,4个‘A’覆盖上一函数的ebp,在加上后门地址覆盖返回地址)