Post

System Hacking - ASLR & NX

ASLR

ASLR(Address Space Layout Randomization)은 공격자가 임의 버퍼의 메모리 주소를 알지 못하게 하는 보호 기법이다.

Return to Shellcode 공격에서 shellcode가 삽입된 버퍼의 메모리 주소를 알아야했다. ASLR이 적용되면 바이너리를 실행 할 때마다 이 주소가 바뀔 것이다. 이처럼, ASLR은 바이너리가 실행 될 때마다 스택, 힙, 공유 라이브러리 등을 임의 주소에 할당함으로써 메모리 주소를 쉽게 알지 못하게한다.

ASLR은 커널에서 지원하는 기술인데, 다음 명령어로 확인할 수 있다.

1
2
3
4
$ cat /proc/sys/kernel/randomize_va_space
# 0 : No ASLR
# 1 : Conservative Randomization
# 2 : Conservative Randomization + brk

ASLR은 다음 특징을 갖는다.

  1. 스택, 힙, 공유 라이브러리 영역등의 주소들은 매 실행마다 변경된다. 따라서, 실행 전에 주소들은 예측 불가능하다.
  2. 그러나 바이너리 자체의 Code Segment와 Data Segment(data + rodata)의 주소는 변경하지 않는다.
  3. 라이브러리의 베이스 주소와 라이브러리 함수의 주소 하위 12비트는 변경되지 않는다.
    1. 리눅스는 ASLR이 적용 되었을 때, 파일을 페이지 단위로 임의 주소에 매핑하는데 이때 페이지의 크기가 12비트 이므로 하위 12비트는 변경되지 않는다.
  4. 라이브러리 베이스 주소와 라이브러리 함수의 주소의 차이는 바이너리의 반복 실행에 상관없이 일정하다. 라이브러리 파일을 그대로 매핑하는 것이기 때문에 Offset이 일정하다.

NX

NX(No-eXecute)는 메모리 영역에서 불필요한 실행 권한을 제거하는 보호 기법이다.

인텔은 XD(eXecute Disable)라 부르고, 윈도우에서는 DEP(Data Execution Prevention), ARM 아키텍쳐에서는 XN(eXecute Never)라 부른다.

NX가 적용된 바이너리는 실행 될 때 각 메모리 영역에 필요한 권한만을 부여한다. 예를들어, 스택에 실행 권한이 있을 경우에 Return to Shellcode 공격이 stack에서 이루어 질 수 있지만, 스택에 실행 권한이 없다면 shellcode를 stack에서 실행할 수 없으므로 공격이 실패할 것이다. 일반적으로 스택에는 실행 권한이 있을 필요가 없으므로 NX는 스택에서 실행 권한을 제거한다.

일반적으로 이와같은 권한을 부여받는다.

1
2
Code Segment : r-x
Others : rw-
This post is licensed under CC BY 4.0 by the author.