
L3HCTF 2025 - heack_revenge

Just came back again.
文件属性
属性 | 值 |
---|---|
Arch | amd64 |
RELRO | Full |
Canary | on |
NX | on |
PIE | on |
strip | no |
libc | 2.39-0ubuntu8.4 |
解题思路
看上一题的flag,很明显非预期了,很快啊,revenge就端上来了。这次fight_dragon
只能调用一次了,
而且严格限制了索引的范围,只能修改到返回地址,不能构造rop链了。第一眼看到的是note_system
里在read
返回小于等于0时,只free没清空,可以UAF,但是经多种尝试无法实现。
其次让人在意的就是game
中让人觉得奇怪的两个数字了。
乍一看作者在整烂活,搞两个数字只为异或出一个日期(20250712),还把 Date 写成了
Data,但是结合上一题flag的提示,不难发现其中存在一个0x5d
,即pop rbp
,
如果我们尝试从这里开始执行就会得到:
观察此时的rsp,如果我们已经分配过一个堆块,并且放在堆块数组bufs
中的第0个,
那么pop rbp
就会将这个 chunk 0 的地址pop给rbp,由于game
函数访问数据是基于rbp的,
因此接下来game的操作会影响到tcache_perthread_struct
。
经过计算,bufs[0]
-bufs[15]
对应了0x2e0-0x3d0的堆块的tcache_entry
,
[Combat Power]
对应了0x3f0的堆块的tcache_entry
([HP]
和[Attack]
未使用,可类推),
如果我们释放对应大小的堆块,我们就可以通过view等方式访问堆块,
或者使用status等查看entry上放的值。
我这里首先分配并释放一个小堆块,使释放后的堆块正好被放入bufs[0]
,
这样就可以使用view来泄露堆基址(当然,使其被放入[HP]
等也是可以的)。
要想泄露libc则没这么简单,因为我们不能对释放后的块写入。于是可以借助提升hp、
提升攻击力这样的方式,借提高power的机会,修改tcache_entry。
先后分配chunk 2 (0x3f0
)和chunk 3 (>0x500
,稍后用来释放泄露libc),2在3的低处,
然后将2释放使其进入[Combat Power]
对应的entry,接着将指针抬高到chunk 3,
此时entry和chunk 3指向同一个地址。再申请chunk 5 (0x3f0
) 后释放chunk 3,
这样我们就在保留对chunk 3的访问的情况下将其释放,进入unsorted bin。最后打印chunk
5就可以泄露。
由于我们已经劫持rbp到堆上,且note_system
和game
在返回时都会leave; ret
,
不难想到,退出时会做栈迁移,可以在堆上打rop。有了以上的数据,我们就能构造链子,
最后的问题就是如何将链子写到最开始的chunk 0。由于提升hp、攻击力都是做加法,
因此我们必须伪造一个堆块,构成一条假的tcache链,使我们能分配到chunk 0。
首先分配chunk 6和chunk 7,然后释放,此时在entry上就会变成7 -> 6 -> NULL
的链子,
我们预先在chunk 7上写上chunk 0的加密后的指针,这样在使用提升hp、攻击力后,
可以将entry变成7+ -> 0 -> ?
的链子。此时连续分配两次,
我们就重新获得了对chunk 0的控制权限,可以写入rop链了。最后的最后,退出拿shell。

额外的\0
字符
在设置chunk 7的时候,注意到我使用了ljust(0x30, b'\0')
,之所以要多留一些字节,
最主要是因为在分配chunk后会memset(chunk, 0, malloc_usable_size(chunk))
,
查阅malloc_usable_size
的源码,
当chunk没有mmap位,那么会检查它是否正在被使用。为了检查chunk是否正在被使用,
需要先提取出其大小,然后检查chunk + sizeof(chunk)
处chunk的inuse位。
如果没有设置好chunk的大小,那么就会导致访问一个堆以外的chunk而引发SIGSEGV
。
将size设置为0是最简单的办法,可以通过检查并使函数返回0。
EXPLOIT
1 | from pwn import * |
- 标题: L3HCTF 2025 - heack_revenge
- 作者: RocketDev
- 创建于 : 2025-07-18 15:33:00
- 更新于 : 2025-07-19 00:07:00
- 链接: https://rocketma.dev/2025/07/18/revenge/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。