PIE
기본 정보
PIE로 컴파일된 이진 파일은 Position Independent Executable의 약자로, 프로그램이 실행될 때마다 다른 메모리 위치에 로드될 수 있어 하드코딩된 주소를 방지합니다.
이진 파일을 이용한 공격의 핵심은 상대 주소를 이용하는 데 있습니다. 프로그램의 부분 간 오프셋은 절대 위치가 변경되더라도 동일하게 유지됩니다. PIE 우회를 위해서는 보통 스택을 이용한 형식 문자열 공격과 같은 취약점을 이용해 하나의 주소를 노출시키면 됩니다. 한 번 주소를 얻으면 고정된 오프셋을 통해 다른 주소를 계산할 수 있습니다.
PIE 이진 파일을 공격할 때 유용한 팁은 메모리 페이지가 0x1000 바이트 크기로 무작위화의 단위인데, 이로 인해 기본 주소가 일반적으로 000으로 끝난다는 것입니다. 이 정렬은 올바른 기본 주소가 식별되었는지를 나타내는 중요한 검사가 될 수 있습니다.
또는 이를 이용하여 공격할 수도 있습니다. 주소가 **0x649e1024
**에 위치한다는 것을 노출하면 **기본 주소가 0x649e1000
**임을 알 수 있고 거기서부터 함수와 위치의 오프셋을 계산할 수 있습니다.
우회 방법
PIE를 우회하기 위해서는 로드된 이진 파일의 주소를 노출해야 합니다. 이를 위한 몇 가지 옵션이 있습니다:
ASLR 비활성화: ASLR이 비활성화되어 있다면 PIE로 컴파일된 이진 파일은 항상 동일한 주소에 로드될 것이므로 PIE는 쓸모가 없어집니다. 객체의 주소는 항상 동일한 위치에 있을 것입니다.
노출된 주소를 제공받음 (쉬운 CTF 도전 과제에서 흔함, 이 예제를 확인하세요)
스택에서 올바른 값을 노출할 때까지 EBP 및 EIP 값을 무차별 대입:
형식 문자열과 같은 임의 읽기 취약점을 사용하여 이진 파일의 주소를 노출 (예: 이전 기술에서와 같이 스택에서)하고 거기서부터 오프셋을 사용합니다. 여기에서 예제를 찾을 수 있습니다.
참고 자료
Last updated