what is ASLR & PIE
pwnalble 문제를 풀다보면 가장 자주 맞대는 보안이 있다.
바로 ASLR 과 PIE 이다. 이 둘은 가장 기초적인 보안으로 바이너리를 보호한다.
ASLR 은 운영체제에서 제공하는 보안이다. 즉, 모든 서버에서 제공한다고 보면 된다.
디버깅을 위해서 ASLR 이 꺼지기도 하지만 이는 어디서나 자신의 파일에 대해 끄는 것이지 운영체제의 ASLR 을 끄지는 못한다.
ASLR 의 벡터는 다음과 같다.
- Stack
- Heap
- Libc ( Shared Library )
- 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 의 영향을 받을까? 다음과 같다.
- .text
- .data / .bss / .rodata
- GOT, PLT
정말 중요한 부분들을 모두 PIE 가 보호하고 있음을 알 수 있다.
다음글에서 어떻게 PIE를 bypass 할 수 있는지 그 첫번째 방법을 알아보자