IT/시스템 보안

[PIE] PIC와 PIE의 개념, 상대 참조, PIE의 우회

kykyky 2024. 5. 15. 16:20

PIC와 PIE의 개념

 

PIC(Position-Independent Code)

: 재배치(Relocation)가 가능하여, 메모리의 어느 주소에 적재(매핑)되어도 코드의 의미가 훼손되지 않고 제대로 실행될 수 있는 코드 

 

- rip를 기준으로 데이터를 상대 참조(Relative Addressing)하기 때문

PIE가 아닌 경우: 절대적 주소를 참조함
PIE인 경우: 상대 참조

 

 

PIE(Position-Independent Executable)

: 메모리의 어느 주소에 적재(매핑)되어도 실행 가능한 실행 파일

   

- PIE의 모든 코드는 PIC이다.

- ASLR이 적용되면, 바이너리가 실행될 때마다 스택, 힙, 공유 라이브러리 뿐만 아니라 코드 영역까지도 무작위 주소에 적재됨 (↔ PIE가 아니면, 코드 영역은 랜덤이 아님)

- 다만 ASLR이 안 적용되면, 무작위 주소에 적재되지 않음

Linux의 ELF:
i) 실행 파일(Executable. 일반적 실행 파일)
ii) 공유 오브젝트(Shared Object (so). 라이브러리 파일. eg - libc.so) → PIE임!

 

 

 

PIE 우회

 

코드 베이스 구하기 

ASLR 환경에서 PIE가 적용된 바이너리는 실행될 때마다 무작위 주소에 적재되므로,

코드 영역의 가젯을 사용하거나, 데이터 영역에 접근하려면

PIE 베이스 (= 코드 베이스 = 바이너리가 적재된 주소)를 알아야 함.

 

코드 베이스 = 코드 영역에서 읽어온 임의의 주소 - 오프셋

 

Partial overwrite

: 반환 주소의 일부 바이트만 덮는 공격.


ASLR의 특성 상, 코드 영역의 주소도 하위 12비트 값은 항상 같으므로

사용하려는 코드 가젯의 주소가 반환 주소와 하위 한 바이트만 다르다면

→ 이 값만 덮어서 원하는 코드를 실행시킬 수 있음

 

BUT 두 바이트 이상이 다른 주소로 실행 흐름을 옮기고자 한다면

ASLR로 뒤섞이는 주소를 맞춰야 함

→ 브루트 포싱을 통해 확률적으로 공격 성공