카테고리 없음
PIE & RELRO 우회
qkrdldks04
2025. 5. 28. 14:42
PIC (Position-Independent Code)
정의: 재배치가 가능한 코드. 즉, 어느 주소에 적재되어도 실행 가능.
목적: 공유 오브젝트(SO, ex. libc.so)처럼 다양한 위치에 적재되더라도 코드가 제대로 동작하게 하기 위함.
특징: 일반 실행파일은 고정 주소 기반으로 동작, PIC는 RIP 상대 주소 참조 방식으로 실행 가능, gcc는 -fPIC 옵션으로 PIC 지원.
PIE (Position-Independent Executable)
정의: 무작위 주소에 매핑되어도 실행 가능한 실행파일 → PIE는 내부 코드가 PIC로 작성되어 있음.
특징: 공유 오브젝트처럼 생성되어 실행파일도 ASLR의 영향을 받음. file 명령어로 확인 시, **"shared object"**로 표시됨. ex) ELF 64-bit LSB shared object → PIE 실행파일, ELF 64-bit LSB executable → 일반 실행파일
PIE 우회 기법
1. Code Base 추출
- PIE 바이너리는 매번 다른 위치에 적재되므로, 실행 중 적재된 주소를 계산해야 함.
- 예: 임의 주소를 메모리에서 읽은 뒤, 고정 offset을 빼서 base 계산.
2. Partial Overwrite
- Code base 계산이 어려울 때 사용.
- ASLR의 특성: 코드 주소의 하위 12비트는 고정됨.
- 반환 주소의 일부(1~2 byte)만 덮어 원하는 가젯(gadget) 실행 유도 가능.
- 하위 한 바이트만 다르면 공격 성공률 ↑
- 두 바이트 이상 다르면 brute force 필요.
RELRO (RELocation Read-Only)
정의: ELF 데이터 세그먼트 중 쓰기 불필요한 영역에 쓰기 권한 제거해 데이터 보호
목적: 프로세스 시작과 종료 관련 함수 주소 저장하는 .init_array, .fini_array 등 보호 목적
종류: Partial RELRO, Full RELRO
RELRO 우회 방법
1. Partial RELRO
- .init_array, .fini_array: 쓰기 금지
- .got.plt: 쓰기 가능 → GOT Overwrite 공격 가능
2. Full RELRO
- 모든 주요 영역 쓰기 금지
- libc 내부의 hook 함수 포인터(예: __malloc_hook, __free_hook) 이용
📌 Hook Overwrite
- __malloc_hook:
- malloc 호출 전, 해당 변수 존재 시 이를 먼저 호출
- 이 변수는 libc 내 쓰기 가능한 영역에 존재
- 공격자는 libc base 주소 + offset으로 이 hook의 위치 계산 후 덮어쓰기 → 임의 코드 실행 가능