what is ASLR & PIE

pwnalble 문제를 풀다보면 가장 자주 맞대는 보안이 있다.

바로 ASLR 과 PIE 이다. 이 둘은 가장 기초적인 보안으로 바이너리를 보호한다.

ASLR 은 운영체제에서 제공하는 보안이다. 즉, 모든 서버에서 제공한다고 보면 된다.

디버깅을 위해서 ASLR 이 꺼지기도 하지만 이는 어디서나 자신의 파일에 대해 끄는 것이지 운영체제의 ASLR 을 끄지는 못한다.

ASLR 의 벡터는 다음과 같다.

  1. Stack
  2. Heap
  3. Libc ( Shared Library )
  4. mmap() 의 호출

그렇다면 PIE 는 뭘까?

PIE 는 ASLR의 DLC라고 생각하면 된다. 좀더 많은 백터에 랜덤성을 부여한다.

특히 code 섹션이 바뀌는 것이 가장 중요 할텐데

PIE 가 없는 바이너리의 경우

Python
(pwn) amemoyoi ~$ objdump -t hook | grep main
0000000000000000       F *UND*	0000000000000000              __libc_start_main@@GLIBC_2.2.5
000000000040094a g     F .text	00000000000000ec              main
(pwn) amemoyoi ~$ 

다음과 같이 바로 주소가 알아낼 수 있지만

PIE 가 있다면,

Python
(pwn) amemoyoi ~$ objdump -t fsb_overwrite | grep main
0000000000000000       F *UND*	0000000000000000              __libc_start_main@GLIBC_2.34
0000000000001293 g     F .text	000000000000007e              main
(pwn) amemoyoi ~$ 

다음과 같이 오프셋만 알 수 있다.

그렇다면 어는 벡터가 PIE 의 영향을 받을까? 다음과 같다.

  1. .text
  2. .data / .bss / .rodata 
  3. GOT, PLT

정말 중요한 부분들을 모두 PIE 가 보호하고 있음을 알 수 있다.

다음글에서 어떻게 PIE를 bypass 할 수 있는지 그 첫번째 방법을 알아보자