Lazy binding을 하는 바이너리는 실행 중에 GOT 테이블을 업데이트할 수 있어야 하므로 GOT에 쓰기 권한이 부여된다
👉 취약점 발생! 👉 RELRO 등장
프로세스의 데이터 세그먼트를 보호하는 기법
쓰기 권한이 불필요한 데이터 세그먼트에 쓰기 권한을 제거한다.
RELRO는 RELRO를 적용하는 범위에 따라 두 가지로 구분된다.
VS Full RELRO
실습 환경의 gcc는 Full RELRO를 기본 적용하며, PIE를 해제하면 Partial RELRO를 적용한다.

.got.plt, .data, .bss와 .init_array, .fini_array의 권한을 살펴봅시다! 👇
.got.plt, .data, .bss만 쓰기권한 있음!full relro를 적용한 것의 메모리맵과 섹션 헤더 정보도 살펴보면
.got에는 쓰기 권한이 제거되어 있으며 .data와 .bss에만 쓰기 권한
Partial RELRO의 경우
.got.plt영역에 쓰기 권한이 존재하므로 GOT Overwrite 공격을 활용할 수 있다.
Full RELRO의 경우
.pot영역에도 쓰기 권한이 제거되어있어 라이브러리에 위치한 hook과 같은 함수 포인터를 조작하는 공격을 활용하여야 한다!
라이브러리 함수의 대표적인 hook : malloc hook, free hook
동적 메모리의 할당과 해제 과정에서 발생하는 버그를 디버깅하기 쉽게 하려고 만들어진 아이
malloc 함수의 코드를 살펴보면, 함수의 시작 부분에서 __malloc_hook이 존재하는지 검사하고, 존재하면 이를 호출한다.
__malloc_hook은 libc.so에서 쓰기 가능한 영역에 위치한다.
따라서 libc가 매핑된 주소를 안다면 이 변수를 조작하고 malloc을 호출하여 실행흐름을 조작할 수 있다. 이와 같은 공격기법을 HOOK Overwrite이라 한다.