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