
第三届阿里云CTF - runes

Show me your runes.
hint:
- No intended vulnerability in the bzImage/kernel, please exploit the userspace chal binary.
- As the challenge's name implies, you need to focus on the
syscall
aka rune in this challenge. Find a way to weaken the dark dragon's power once your character becomes strong enough.- All syscall numbers(系统调用号) used in the intended solution are under 200 and relatively well used.
本题由 hkbin 和 haraniN 和我一起合作解决!
文件属性
属性 | 值 |
---|---|
Arch | amd64 |
RELRO | Full |
Canary | on |
NX | on |
PIE | on |
strip | yes |
解题思路
题目是运行在虚拟机中的,内存256M,内核版本6.6。
chal
实现了一个小游戏,基础等级是1
,可以执行任意syscall,并且可以控制前三个参数,
但是这3个参数必须小于等级*100
。小游戏中可以升级,但是不可能超过7,
而指针对应的无符号数非常大,看到如果打败dark dragon可以升级到0x7ffffffffff
,
然后就可以输入指针了。为了打败dark dragon,需要把它的血量打到1,
也就是需要让预期的mmap
调用失败,如果成功,人物血量会直接归零。
mmap了什么
程序向memfd
中写入了一串shellcode,并通过mmap
包含fd来将其映射到rwx
内存中,随后执行,反汇编后结果是:
1 | mov rax,rdi |
而输入的地址rdi是&hp
,hp会直接降到0以下,并被随后的代码归零。
寻找符合条件的syscall,先筛掉所有包含指针的syscall,由于程序打开的 memfd
被dup到了1023
,而等级不可能在正常情况下大于10,因此也无法关闭 memfd
。
如果使内存不足以分配0x1000大小的内存的话,也可以阻止mmap,但是256M实在难以企及,
就算fork
,增加的内存也是沧海一粟。最后选择了prctl
,在Linux 6.3加入了PR_SET_MDWE
,
开启这个security bit
后可以禁止mmap一段?wx
的内存,并且不会影响到execve后的新程序。
在因此设置后就能成功升级,实现任意syscall调用。
由于Arch Linux滚动更新的特性,我的内核保持最新,可以直接把chal
拖出来在本地调试;
而一些使用Ubuntu的小伙伴,由于内核老,是没有这个特性的,在本地只能盲调。
剩下的问题是保护全开,没有泄露任何指针。可以通过brk
调用申请堆内存,
在上面写数据。由于sh链接到了busybox,因此还需要设置argv。最后
execve(“/bin/sh", {“sh", NULL}, NULL)
拿shell。
官方wp中使用了shmget + shmat
来申请一片内存。
EXPLOIT
1 | from pwn import * |
参考
- 标题: 第三届阿里云CTF - runes
- 作者: RocketDev
- 创建于 : 2025-02-24 23:11:00
- 更新于 : 2025-02-24 23:51:00
- 链接: https://rocketma.dev/2025/02/24/runes/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。