System Hacking/Basics

NX 와 ASLR

hanbunny 2025. 3. 20. 17:53

NX

NX(No-execute)는 실행에 사용되는 메모리 영역과 쓰기에 사용되는 메모리 영역을 분리하는 보호 기법.

일반적으로 코드 영역에는 읽기와 실행, 나머지 영역에는 읽기와 쓰기 권한 부여.

 

intel - XD(excute disable)

windows - DEP(Data Execution Prevention)

ARM - XN(excute Never)

명칭이 다 다르지만 비슷한 보호기법임.

 

ASLR

ASLR(Address Space Layout Randomization)은 바이너리가 실행될 때마다 스택 , 힙, 공유 라이브러리 등을 임의의 주소에 할당하는 보호 기법임. 메모리를 무작위 주소에 할당해서 보호한다. 최신 커널에는 대부분 적용되어 있는데 리눅스에서는 페이지 단위로 할당이 이루어져 하위12비트는 변하지 않는 다는 특징이 있음.

 

#ASLR확인 명령어
$ cat /proc/sys/kernel/randomize_va_space

이 명령어를 통해 ASLR을 확인할 수 ㅣㅇㅆ는데

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

  • No ASLR(0): ASLR을 적용하지 않음
  • Conservative Randomization(1): 스택, 라이브러리, vdso 등
  • Conservative Randomization + brk(2): (1)의 영역과 brk로 할당한 영역

 

ASLR 특징

 

 

- 메모리 주소를 출력하는 코드로 주소를 확인해보면,

main함수를 제외한 다른 영역의 주소들은 실행마다 변함.

 

- libc_base와 printf 주소의 하위12비트 값은 변하지 않음.

(리눅스는 ASLR이 적용됐을 때, 파일을 페이지(12비트)단위로 임의주소에 매핑하기 때문.)

 

- libc_base와 printf의 주소차이는 항상 같음.(라이브러리 파일을 그대로 매핑하는 것이기 때문에 오프셋은 항상 같음)

 


바이너리의 코드가 존재하는 영역은 여전히 실행 권한이 존재하며, 할당되는 주소도 고정되어 있음.

코드 영역에는 유용한 코드 가젯들과 함수가 포함되어 있습니다. 반환 주소를 셸 코드로 직접 덮는 대신, 이들을 활용하면 NX와 ASLR을 우회하여 공격가능함.

-> Return-to-Libc(RTL)과 Return Oriented Programming(ROP)가 대표적인 공격 방법