PIE(Position Independent Executable)는 위치 독립 실행이라는 뜻으로 바이너리가 실행될 때 마다 바이너리의 주소가 랜덤화 된다. 

다음의 소스코드를 컴파일 하여 PIE를 테스트 할 것이다.

#include <stdio.h>
  
char *gBuf = "Lazenca.0x0";
  
void lazenca() {
    printf("Lazenca.0x1\n");
}
  
void main(){
    printf("[.data]    : %p\n",gBuf);
    printf("[Function] : %p\n",lazenca);
}

다음과 같이 컴파일 하여 하나는 PIE를 적용하지 않고, 다른 하나는 PIE를 적용하도록 하였다.

PIE보호기법을 적용하려면 gcc에서 -fPIE와 -pie 옵션을 적용하면 된다.

PIE가 적용되지 않은 파일은 다음과 같이 실행할 때 마다 전역변수와 사용자 정의 함수의 주소가 변경되지 않는다.

PIE가 적용된 파일은 실행할 때 마다 전역변수와 사용자 정의 함수의 주소가 변경된다.

PIE 보호기법이 적용되어 있지 않다면 다음과 같이 코드 영역의 값이 고정된 주소값이다.

PIE 보호기법이 적용된 바이너리는 코드 영역의 값이 offset 값이여서 할당된 메모리 영역에 동적으로 위치한다.

+ Recent posts