PIE(Position-Independent Executable)은 ASLR이 코드 영역에도 적용되게 하는 기술이다.
PIC & PIE
PIC
리눅스 ELF 파일은 실행파일(Executable)과 공유 오브젝트(Shared Object, so)로 2가지가 존재한다. 공유 오브젝트는 재배치(relocation)가 가능하다. Relocation이 가능하다는 것은 메모리의 어디에 적재되어도 코드의 의미가 훼손되지 않음을 의미한다. 이런 코드를 Position-Independent Code(PIC)라고 부른다.
PIC 코드 분석
PIC가 적용된 바이너리와 그렇지 않은 바이너리를 비교하기 위해 아래의 코드를 컴파일하였다.
// Name: pic.c
// Compile: gcc -o pic pic.c
// : gcc -o no_pic pic.c -fno-pic -no-pie
#include <stdio.h>
char *data = "Hello World!";
int main() {
printf("%s", data);
return 0;
}
main을 비교해보면 main +18에서 "%s" 문자열을 printf에 전달하는 방식이 다른 것을 확인할 수 있다.
PIE가 적용되지 않은 바이너리(no_pie)에서는 0x402011이라는 절대 주소로 문자열을 참조하고, PIE가 적용된 바이너리에서는 문자열의 주소(rip+0xeaf)로 참조하고 있다.
no_pie의 경우 매핑되는 바이너리의 주소가 바뀌면 0x402011의 데이터도 같이 이동하기 때문에, no_pie는 제대로 실행되지 않는다. pie의 경우, rip를 기준으로 데이터를 상대참조하기 때문에, 바이너리 매핑 주소가 바뀌어도 제대로 실행될 수 있다.
PIE
PIE(Position-Independent Executable)는 어느 주소에 매핑되어도 제대로 동작하는 실행 파일을 의미한다. 리눅스의 경우, ASLR을 도입한 후 실행 파일 형식은 재배치 가능하도록 바꾸는 것이 호환성 문제로 어렵기 때문에, 재배치 가능한 공유 오브젝트를 실행 파일로 사용한다. 실행 파일의 헤더를 보면, Type이 공유 오브젝트(DYN, ET_DYN)인 것을 볼 수 있다.
PIE on ASLR
PIE는 재배치가 가능하므로, ASLR이 적용된 시스템에서는 실행파일도 무작위 주소에 적재된다. 하지만, ASLR이 적용되지 않은 시스템에서는 PIE가 적용된 바이너리라도 무작위 주소에 적재되지 않는다.
위의 사진을 보면 PIE가 적용된 바이너리는 매 실행마다 main의 주소가 바뀌는 것을 확인할 수 있다.
PIE bypass
코드 베이스 구하기
ASLR환경에서 PIE가 적용된 바이너리는 실행마다 다른 주소에 적재된다. 따라서 코드영역의 가젯을 사용하거나, 데이터 영역에 접근하려면 바이너리가 적재된 주소, 즉 PIE 베이스(코드 베이스)를 구해야한다. 코드 베이스는 lib base구할 때와 마찬가지로, 코드 영역의 임의 주소를 읽고, 그 주소의 offset을 빼주면 구할 수 있다.
Partial overwrite
코드 베이스를 구하기 어려우면, return address의 일부 바이트만 덮는 공격을 고려해볼 수 있다. 일반적으로 return address는 caller의 내부를 가리킨다. ASLR 특성 상, 코드 영역의 하위 12비트의 값은 항상 같다. 따라서, 사용하려는 코드 가젯의 주소가 return address와 하위 한 바이트만 다르다면, 이 값만 덮어서 원하는 코드를 실행시킬 수 있다. 그러나 두 바이트 이상이 다르면, ASLR로 인해 바뀌는 주소를 맞춰야하므로 브루트 포싱이 필요하다.
'CS > system' 카테고리의 다른 글
[System][Dreamhack] Exploit Tech: Hook Overwrite(1/2) (0) | 2024.01.24 |
---|---|
[System][Dreamhack] RELRO - RELocation Read-Only (1) | 2024.01.02 |
[System][Dreamhack] Exploit Tech : Return Oriented Programming(ROP) - ret2main (0) | 2023.12.22 |
[System][Dreamhack] Exploit Tech : Return Oriented Programming(ROP) (0) | 2023.12.22 |
[System][Dreamhack] Exploit Tech : Return to Library(RTL) (0) | 2023.02.01 |