Security 🔒/> Protection Tech

GCC memory protection options (Updating)

neutrinox4b1 2024. 10. 13. 22:18

이번 글에서는 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를 명식적으로 적용한다.