PIE

: 위치 독립 코드로 이루어진 실행 가능한 바이너리 

 

< Example >

▶ Source code

#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);
}

 

▶ Build PIE file

 

< Check the protection techniques of binary files >

▶ checksec.sh

 

< Compare PIE and NonPIE >

▶ Address

  NoPIE 파일에는 PIE가 적용되지 않았기 때문에 프로그램을 실행할 때마다 전역 변수와 사용자 정의 함수의 주소가 변경되지 않는다.

  PIE 파일에는 PIE가 적용되었기 때문에 프로그램을 실행할 때마다 전역 변수와 사용자 정의 함수의 주소가 매번 달라진다.

 

▶ Code

NoPIE : 코드 영역의 값이 고정된 주소값이다.

PIE : 고정된 주소값이 아닌 offset 값이다. (해당 offset 값을 이용해 할당된 메모 영역에 동적으로 위치할 수 있다.)

- ex) 할당받은 메모리 영역(0x555555554000) + .text 영역의 main함수 코드의 offset 값(0x7c3) = main 함수의 시            작 주소(0x00005555555547c3)

< How to detect PIE in the "Checksec.sh" file >

▶ Binary

  • 'readelf' 명령어를 이용해 해당 파일의 ELF Header 정보를 가져와 PIE 설졍여부를 확인한다.
  • "Type:"의 값이 "EXEC"일 경우 PIE가 적용되지 않았다고 판단한다.
  • "Type:"의 값이 "DYN"일 경우 PIE가 적용되었을 가능성이 있다고 판단한다. ('readelf' 명령어를 이용해 해당 파일의 "Dynamic section" 정보를 가져와 "DEBUG" section이 있으면 PIE가 적용되었다고 판단한다.)

 

▶ Process

다음과 같은 방법으로 프로세서의 Canary 설정여부를 확인한다.

 

+ Recent posts