GCC memory protection options (Updating)
이번 글에서는 GCC(GNU C Compiler)에서 메모리 보호기법을 enable, disable하는 옵션들에 대해서 정리한다.
NX bit
NX bit는 데이터 영역(e.g., stack)에서 실행 권한을 제거하는 보호기법이다.
gcc -z execstack
`-z execstack` 옵션을 통해 NX bit를 disable 할 수 있다.
Stack Smashing Protector (Stack Canary)
SSP는 SFP(Saved Frame Pointer) 전에 Canary라고 하는 랜덤 값을 삽입해두어 오버플로우를 탐지하는 보호기법이다.
gcc -fno-stack-protector
`-fno-stack-protector` 옵션을 통해 SSP를 disable 할 수 있다.
해당 보호기법을 명시적으로 적용하기 위해서는
gcc -fstack-protector
`-fstack-protector` 옵션을 사용한다.
ASLR(Address Space Layout Randomization)
ASLR은 주소공간을 랜덤화하는 보호기법이다.
sudo cat /proc/sys/kernel/randomize_va_space
명령어를 통해 `/proc/sys/kernel/randomize_va_space` 파일을 읽어들여 ASLR 적용 여부를 확인할 수 있다.
`/proc/sys/kernel/randomize_va_space`가 0이면 ASLR 해제
1이면 stack과 library가 랜덤
2이면 stack, heap, library가 랜덤이다.
sudo bash -c "echo 0 > /proc/sys/kernel/randomize_va_space"
명령어를 통해 ASLR을 disable 할 수 있다.
RELRO(RELocation Read Only)
RELRO는 GOT overwrite 처럼 메모리가 변경되는 것을 방어한다.
NO RELRO
gcc -z norelro
NO RELRO는 본 헤더, 코드 영역등을 제외한 거의 모든 부분에 read, write 권한을 준다.
PARTIAL RELRO
gcc -z relro
PARTIAL RELRO는 .ctors, .dtors, .jcr, .dynamic 섹션이 ready-only 즉, 쓰기 권한이 없어진다.
FULL RELRO
gcc -z relro -z now
FULL RELRO는 BSS영역을 제외한 모든 부분에서 write권한이 없다.
PIE(Position Independent Executable)
PIE는 모든 심볼 주소를 상대적으로 작성하고 base address를 랜덤화해서 함수들의 주소를 실행할 때마다 랜덤화하는 보호기법이다.
gcc -no-pie
`-no-pie` 옵션은 PIE를 disable 하는 옵션이다.
gcc -fpie
`-fpie`는 .text 영역을 랜덤화한다.
gcc -fpie -pie
`-fpie -pie`옵션은 PIE를 명식적으로 적용한다.