관리 메뉴

Bull

[System Hacking] NX & ASLR 본문

Computer Science/System Hacking

[System Hacking] NX & ASLR

Bull_ 2024. 4. 9. 22:55

NX (No eXecute)

NX는 실행 금지 비트라고도 하며, 특정 메모리 영역에 실행 권한을 부여하지 않아 공격자가 악의적인 코드를 그 영역에 삽입하고 실행하는 것을 방지하는 기술이다.

 

스택이나 힙과 같이 데이터를 저장하는 용도로 사용되는 메모리 영역에서 코드 실행을 금지하여, 버퍼 오버플로우 공격을 통한 악성 코드 실행을 막는다.

위 사진과 같이 vmmap을 통해 어느 스택 주소에 실행권한이 있는지 없는지 판별할 수 있다.

NX의 또다른 명칭

인텔 AMD ARM 윈도우
XD(eXecute Disable) NX DEP(Data Execution Prevention XN(eXecute Never

명칭만 다를 뿐 모두 비슷한 보호 기법이다.


5.4.0 미만 버전

스택 영역 뿐만 아니라 힙, 데이터 영역 등 읽기(r) 권한이 있는 모든 페이지에 실행(x) 권한을 부여한다.

 

NX 미적용 시, 프로세스의 Personality에 읽기 권한이 있는 모든 페이지에 실행 권한을 부여하는 READ_IMPLIES_EXEC 플래그를 설정하기 때문이다.

5.4.0 이상 버전

READ_IMPLIES_EXEC를 설정하지 않고, 로더가 따로 스택 영역([stack])에만 실행 권한을 부여한다.

ASLR (Address Space Layout Randomization)

ASLR은 운영 체제가 프로그램을 메모리에 로드할 때, 실행 파일, 스택, 힙, 공유 라이브러리 등의 주소를 무작위로 배치하는 기술이다.

 

예를 들어, 버퍼 오버플로우나 ROP와 같은 공격에서는 공격자가 특정 함수나 라이브러리의 위치를 알아야 하는데, ASLR은 이러한 위치 정보를 예측하기 어렵게 만든다.

 

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

cat /proc/sys/kernel/randomize_va_space

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

 

 

ASLR 특징

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

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

 

예시)
libc_base addr: 0x7fd7504cd000
libc_base addr: 0x7ffad9e1b000
libc_base addr: 0x7fed2664b000

여기서 하위 12비트는 오른쪽 16진수 세 자리를 나타낸다.(16진수에서 3자리 = 4비트 * 3 →  12비트)


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

 

따라서 페이지의 크기인 12비트 이하로는 주소가 변경되지 않는다.

2. libc_base와 printf의 주소 차이는 항상 같다.

ASLR이 적용되면, 라이브러리는 임의 주소에 매핑되는데

 

라이브러리 파일 전체를 그대로 매핑하는 것이므로 매핑된 주소로부터 라이브러리의 다른 심볼들 까지의 거리(Offset)는 항상 같다.

 

예시)

>>> hex(0x7fd7504cd000 - 0x7fd750531f00) # libc_base addr - printf addr
'-0x64f00'
>>> hex(0x7ffad9e1b000 - 0x7ffad9e7ff00)
'-0x64f00'

참고자료


[DreamHack 강의]

[출처]: https://dreamhack.io/lecture/courses/85