이번엔 메모리 보호 기법중 PIE와 RelRO에 대하여 글을 써보고자 한다.
PIE(Position-Independent-Executable)
보통 ASLR이 적용되면, 스택, 힙, 공유라이브러리 등의 주소가 무작위 주소로 매핑된다.
그런데 실행파일(ELF)가 매핑된 영역은 항상 고정된다는 취약점이 발생한다. 즉, 전역변수나 main의 주소는 항상 고정될 수 있다는 말이다.
PIE 보호 기법이 적용되면 ASLR을 바이너리가 매핑된 영역까지 적용되도록 한다.
PIE가 적용되지 않았을 때는 ROPgadget이나 사용자 정의 함수등의 주소를 그대로 사용해도 된다.
하지만 PIE가 적용된다면 바이너리가 매핑된 주소를 leak한 다음, PIE base주소를 구한 다음 offset을 더해 사용이 가능하다.

PIE가 적용되지 않은 바이너리의 경우, 위와 같이 전체 주소가 보통 출력되게 되는데, PIE가 적용된 바이너리를 보면,

이처럼 offset만 나오게 된다.
만약 pie_base주소를 leak 할수 있으면 해당 offset을 더해 실행 중 사용이 가능하다.
RELRO(RELocation Read-Only)
RELRO 보호 기법은 프로세스의 Data 영역을 보호하는 기법으로, 쓰기 권한이 불필요한 Data영역의 쓰기 권한을 제거한다.
GOT, got.plt가 이 Data영역에 속한다.
NO RELRO : .init_array, .fini_array(시작, 종료시 실행하는 함수들이 저장되어있는 배열)를 포함한 data영역 w권한 유지
Partial RELRO : .init_array, .fini_array에 쓰기 권한이 사라지지만, GOT Overwrite 가능
Full RELRO : GOT 영역이 read-only가 되며 overwrite불가능, hook overwrite등의 공격이 가능(libc내의 data영역)
뭐 문제를 얼마 풀어보진 않았지만 지금까지 NO RELRO인 문제는 거의 없었고
Partial RELRO나 Full RELRO인 바이너리가 많았다. NO RELRO인 바이너리는 data영역에 속한 모든 곳에 쓰기권한이 있다고만 알아두고 넘어가자.


Partial RELRO가 적용된 바이너리의 모습을 보면, GOT가 매핑된 영역에 쓰기 권한이 존재하는 것을 확인할 수 있다.


Full RELRO가 적용된 바이너리를 보면, got 영역에 쓰기 권한이 사라진 것을 볼 수 있다.
'PWN > 개념' 카테고리의 다른 글
| ptmalloc2 - Memory Allocator in Linux (1) | 2025.07.24 |
|---|---|
| one_gadget (0) | 2025.07.23 |
| Return Oriented Programming(ROP) 공격 기법 (0) | 2025.07.23 |
| PLT, GOT (0) | 2025.06.26 |
| NX(No-eXecute) & ASLR(Address Space Layout Randomization) (1) | 2025.06.26 |