시스템 해킹/DreamHack으로 해커를 꿈꾸며

NX & ASLR 이란?

0x6b6569 2023. 2. 27. 10:06

Address Space Layout Ramdomization(ASLR)

공격자가 메모리에서 임의 버퍼의 주소를 알기 어렵게 한다.

 

ASLR은 바이너리가 실행될 때마다 스택, 힙, 공유 라이브러리등을 임의의 주소에 할당하는 보호 기법입니다.

 

ASLR은 커널에서 지원하는 보호기법이며, 다음의 명령어로 확인 가능

cat /proc/sys/kernel/randomize_va-space

 

리눅스에서 이 값은 0, 1, 2의 값을 가질 수 있다.

 

No ASLR(0) : ASLR을 적용하지 않는다.

Conservative Randomization(1) : 스택, 힙, 라이브러리 ,  vdso  등

Conservative Randomization(2) + brk(2) : (1)의 영역과 brk로 할달한 영역

 

 

ASLR 예제 코드

 

gcc addr.c -o addr -no-pie -fno-PIE

 

실행하면 위와 같이 결과화면이 나온다. 

코드영역의 main addr을 제외한 다른 영역의 주소들은 실핼할 때마다 변경된다.  즉 실행할 때마다 주소가 변경되기 때문에 바이너리를 실행하기 전에 예측할 수 없습니다.

 

중요한 사실 3가지

 

1. 바이너리를 반복해서 실행해도 libc_base 주소 하위 12비트 값과 printf 주소 하위 12비트 값은 변경되지 않습니다.

 

2.리눅스는 ASLR이 적용되었을 때, 파일을 page 단위로 임의 주소에 매핑합니다. 따라서 페이지의 크기인 12비트 이하로는 주소가 변경되지 않는다. 

 

3. libc_base와 printf의 주소의 차이는 항상 같습니다.

ASLR이 적용되면, 라이브러리는 임의 주소에 매핑됩니다. 그러나 라이브러리 파일을 그대로 매핑하는 것이므로 매핑된 주소로부터 라이브러리의 다른 심볼까지의 거리(Offset)는 항상 같다.

 

No-eXexute(NX)

메모리 영역에서 불필요한 실행 권한을 제거하는 보호기법

NX는 실행에 사용되는 메모리 영역과 쓰기에 사용되는 메모리 영역을 분리하는 보호 기법이다.

어떤 메모리 영역에 대해 쓰기 영역과 실행 권한이 함께 있다면 시스템이 취약해지기 쉽다.

 

CPU가 NX를 지원하면 컴파일러 옵션을 통해 바이너리에 NX를 적용할 수 있으며, NX가 적용된 바이너리는 실행될 때 각 메모리 영역에 필요한 권한만을 부여받습니다. GDB의 vmmap을 통해 NX 적용 전후의 메모리 맵을 비교하면, 다음과 같이 NX가 적용되지 않은 바이너리에는 스택, 힙, 데이터 영역에 실행 권한이 존재하는 것을 확인할 수 있습니다. 

 

NX를 인텔은 XD(eXecute Disable), AMD는 NX, 윈도우는 DEP(Data Execution Prevention), ARM에서는 XN(eXecute Never)라고 칭하고 있습니다. 명칭만 다를 뿐 모두 비슷한 보호 기법입니다.