← 목록으로

Full RELRO 환경에서의 GOT Overwrite와 우회

[Pwn] Pwnable · 작성: 2026-07-20 03:10:34 · 수정: 2026-07-20 03:11:15 · 조회 7

용어 정리 글에서 RELRO를 "GOT를 읽기 전용으로 바꿔서 GOT overwrite를 막는 보호기법"이라고 짧게 설명했는데, 실제로는 Partial RELRO와 Full RELRO가 방어 강도에서 완전히 다르다. 이 차이를 실제 익스플로잇 관점에서 뜯어본다.

GOT(Global Offset Table)가 공격 대상이 되는 이유

동적 링킹된 바이너리는 외부 함수(printf, system 등)의 주소를 프로그램 시작 시점에 다 정하지 못해서, GOT라는 테이블에 "이 함수의 실제 주소"를 나중에 채워 넣는다. 이 테이블 엔트리를 임의 쓰기 취약점(format string, heap overflow 등)으로 덮어쓰면, 그 함수가 호출될 때 공격자가 지정한 주소로 실행 흐름이 넘어간다.

Partial RELRO vs Full RELRO

checksec --file=./binary
# RELRO           STACK CANARY   NX     PIE
# Full RELRO      Canary found   NX enabled   PIE enabled

Full RELRO일 때는 뭘 노리는가

GOT를 못 건드리니 다른 쓰기 가능한 함수 포인터를 찾는다.

정리

RELRO 등급만 보고 "GOT 공격이 안 통하는구나"로 끝내면 안 된다. Partial RELRO라면 아직 호출 안 된 함수들의 GOT 엔트리가 남아있는지 objdump -R로 직접 확인해보는 습관이 필요하다.

Pwnable 카테고리의 글 (13/14)

  1. 메모리 구조 기초: 스택, 힙, 레지스터부터 이해하기
  2. 스택 버퍼 오버플로우: 가장 기본적인 메모리 손상 공격
  3. Format String 취약점: printf가 위험해지는 순간
  4. Stack Canary: 원리와 우회 방법
  5. NX/DEP 우회와 Return-to-libc
  6. ASLR과 정보 유출(Leak)
  7. ROP (Return-Oriented Programming) 완전 정복
  8. 힙 익스플로잇 기초: Use-After-Free와 Double Free
  9. pwntools 실전 활용법
  10. UDF(User-Defined Function) 기반 DB 권한 상승: 원리부터 실전까지
  11. Pass-the-Hash / Pass-the-Ticket: 원리와 실전
  12. eBPF 기반 지속성(Persistence) 기법
  13. Full RELRO 환경에서의 GOT Overwrite와 우회
  14. ret2dlresolve: 심볼 정보 없이 임의 함수 호출하기
← eBPF 기반 지속성(Persistence) 기법 ret2dlresolve: 심볼 정보 없이 임의 함수 호출하기 →