IT 그리고 정보보안/Knowledge base

PIE (Position Independant Executable)

plummmm 2021. 4. 15. 21:39
반응형

PIE는 Position Independant Executable 의 약자, 한글로 해석해보자면

위치 독립적 실행가능? 이런 말이다. 

PIE를 공부하기 이전에 일단 PIC(Position Independant Code) 와 유사하다는 것을 알고계세요.

 

PIC는 공유 라이브러리 파일을 생성할 때 이 라이브러리 파일이 어떤 파일과 링크가 될지 알 수 없기 때문에

-fPIC 옵션을 주어 다른 파일과 동적 링크가 가능하도록 해주게 된다. 

 

이와 비슷한 맥락으로.. PIE는 위치 독립적으로 실행 가능한 코드 형태로 컴파일 한다.. 그런 뜻이다.

예제를 보면서 이해해봅시다.

----------------------------------

#include <stdio.h>

void foo(){

        printf("hello\n");

}

 

int main(){

        foo();

        return 0;

}

 

이런 기본적인 코드가 있다. 

이 파일을 -fPIE 라는 옵션과 -pie라는 옵션을 이용하여 PIE를 생성할 수 있다.

-----------------------------------------------------------------------------------------

root@s2uid-virtual-machine:~/dongwoo# vim pie_ex.c 

root@s2uid-virtual-machine:~/dongwoo# gcc -c -fPIE pie_ex.c

root@s2uid-virtual-machine:~/dongwoo# ls

memleak1  memleak1.c  pie_ex.c  pie_ex.o

root@s2uid-virtual-machine:~/dongwoo# gcc -o pie_ex -pie pie_ex.o

root@s2uid-virtual-machine:~/dongwoo# ./pie_ex

 

hello

 

 

그냥 쉽게 말해서 독립적으로 실행가능 하니까 다 상대주소로 되어 있다.

그냥 gcc로 default 옵션으로 컴파일 한 것과 PIE 옵션 주고 컴파일한것과 차이를 보겠다.

 

(default 기준 환경은 Ubuntu 14.04.01 32bit 에 gcc 4.8.1 이다.)

pie_ex 가 PIE 모드가 켜진 상태

pie_ex2 가 PIE 모드가 꺼진 상태 이다.

---------------------------------------------------------------------------------------------------

root@s2uid-virtual-machine:~/dongwoo# objdump -d pie_ex | grep main -A3

00000490 <__libc_start_main@plt>:

 490: ff a3 18 00 00 00     jmp    *0x18(%ebx)

 496: 68 18 00 00 00        push   $0x18

 49b: e9 b0 ff ff ff        jmp    450 <_init+0x24>

--

 4cc: e8 bf ff ff ff        call   490 <__libc_start_main@plt>

 4d1: f4                    hlt    

 4d2: 8b 1c 24              mov    (%esp),%ebx

 4d5: c3                    ret    

--

00000631 <main>:

 631: 55                    push   %ebp

 632: 89 e5                 mov    %esp,%ebp

 634: 83 e4 f0              and    $0xfffffff0,%esp

----------------------------------------------------------------------------------------------------

root@s2uid-virtual-machine:~/dongwoo# objdump -d pie_ex2 | grep main -A3

08048310 <__libc_start_main@plt>:

 8048310: ff 25 14 a0 04 08     jmp    *0x804a014

 8048316: 68 10 00 00 00        push   $0x10

 804831b: e9 c0 ff ff ff        jmp    80482e0 <_init+0x30>

--

 804833c: e8 cf ff ff ff        call   8048310 <__libc_start_main@plt>

 8048341: f4                    hlt    

 8048342: 66 90                 xchg   %ax,%ax

 8048344: 66 90                 xchg   %ax,%ax

--

08048431 <main>:

 8048431: 55                    push   %ebp

 8048432: 89 e5                 mov    %esp,%ebp

 

 8048434: 83 e4 f0              and    $0xfffffff0,%esp

 

주소 부분을 보면 PIE가 켜진 상태에서는 상대주소로 나타나있는 걸 볼 수 있다. (숫자가 작다)

PIE는 결론적으로 말해 공유 라이브러리와 비슷한 형태로 나타나지만 실행이 가능한 파일이다.

현재는 잘 안쓰인다고 하지만.. 보안 강화를 위해 얼마든지 사용될 수 있는 범위가 확장 가능하니

알아두면 좋을 것 같다.

 

 

참고 도서 : Binary Hacks - 해커가 전수하는 테크닉 100선

반응형