[Pwn] Pwnable · 작성: 2026-07-20 03:10:34 · 수정: 2026-07-20 03:11:15 · 조회 7
용어 정리 글에서 RELRO를 "GOT를 읽기 전용으로 바꿔서 GOT overwrite를 막는 보호기법"이라고 짧게 설명했는데, 실제로는 Partial RELRO와 Full RELRO가 방어 강도에서 완전히 다르다. 이 차이를 실제 익스플로잇 관점에서 뜯어본다.
동적 링킹된 바이너리는 외부 함수(printf, system 등)의 주소를 프로그램 시작 시점에 다 정하지 못해서, GOT라는 테이블에 "이 함수의 실제 주소"를 나중에 채워 넣는다. 이 테이블 엔트리를 임의 쓰기 취약점(format string, heap overflow 등)으로 덮어쓰면, 그 함수가 호출될 때 공격자가 지정한 주소로 실행 흐름이 넘어간다.
mprotect). GOT overwrite가 사실상 불가능해진다.checksec --file=./binary
# RELRO STACK CANARY NX PIE
# Full RELRO Canary found NX enabled PIE enabled
GOT를 못 건드리니 다른 쓰기 가능한 함수 포인터를 찾는다.
.data/.bss의 함수 포인터 변수 (콜백 함수를 저장해두는 구조체 등)__free_hook, __malloc_hook 같은 libc 후크 — 다만 최신 glibc 2.34+에서는 이 후크들이 아예 제거됐다는 점이 중요하다 (버전에 따라 통하지 않을 수 있다)FILE 구조체의 vtable 위조 (House of ~ 계열 힙 기법들과 결합)RELRO 등급만 보고 "GOT 공격이 안 통하는구나"로 끝내면 안 된다. Partial RELRO라면 아직 호출 안 된 함수들의 GOT 엔트리가 남아있는지 objdump -R로 직접 확인해보는 습관이 필요하다.