본문 바로가기

보안

[시스템해킹] PIE

ASLR이 적용되면서 바이너리 실행 시마다 스택, 힙, 공유 라이브러리 등이 무작위 주소에 매핑되었지만 main의 주소는 항상 동일했음

-> 고정된 주소의 코드 가젯을 활용한 ROP 공격이 가능했음

 

PIE(Position-Independent Executable): ASLR이 코드 영역에도 적용되게 해주는 기술
  • PIC(Position-Independent Code)

- 리눅스에서 ELF는 실행 파일(executable)과 공유 오브젝트(shared object, SO)로 두 가지 존재

- 공유 오브젝트는 기본적으로 재배치가 가능하도록 설계 -> 메모리의 어느 주소에 적재되어도 코드의 의미가 훼손되지 않음

  => 이런 성질의 코드를 PIC라 함

 

  • PIE(Position-Independent Executable)

- 무작위 주소에 매핑돼도 실행 가능한 실행 파일

- PIE는 재배치가 가능하므로, ASLR이 적용된 시스템에서는 실행 파일도 무작위 주소에 적재

- 반대로, ASLR이 적용되지 않은 시스템에서는 PIE가 적용된 바이너리라도 무작위 주소에 적재되지 않음

 

  • PIE 우회; 코드 베이스 구하기

- 코드 영역의 가젯을 이용하거나, 데이터 영역에 접근하려면 바이너리가 적재된 주소(=PIE 베이스, 코드 베이스)를 알아야 함

- 코드 베이스를 구하려면 라이브러리의 베이스 주소를 구할 때처럼 코드 영역의 임의 주소를 읽고, 그 주소에서 오프셋을 빼야 함

 

예시>

gdb로 disassemble 해서 함수의 복귀 주소의 offset(1)을 알아낸 다음 프로그램 실행 시 리턴 주소(2)를 leak하고

(2) - (1) 하면 pie_base 구할 수 있음

 

드림핵 시스템해킹 로드맵 참고