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선
'IT 그리고 정보보안 > Knowledge base' 카테고리의 다른 글
CSS (Cascading Style Sheet) 개념 (0) | 2021.04.15 |
---|---|
HTML (Hyper Text Markup Language) 개념 (0) | 2021.04.15 |
SSP (Stack Smashing Protection) (0) | 2021.04.15 |
스택 가드 (Stack Guard) (0) | 2021.04.15 |
스택 쉴드 (Stack Shield) (0) | 2021.04.15 |