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 구할 수 있음
드림핵 시스템해킹 로드맵 참고
'보안' 카테고리의 다른 글
[자동차해킹] 1. UNDERSTANDING THREAT MODELS (0) | 2024.06.12 |
---|---|
[시스템해킹] Return Oriented Programming(ROP); ret2main (0) | 2024.04.26 |
[시스템해킹] Return Oriented Programming(ROP); GOT Overwrite (0) | 2024.04.24 |
[시스템해킹] Return to Library (0) | 2024.04.23 |
[시스템해킹] Background: Library (0) | 2024.04.23 |