카테고리 없음

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의 위치 계산 후 덮어쓰기 → 임의 코드 실행 가능