일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
- 영상처리
- PCA
- rao
- MDP
- C++
- llm을 활용 단어장 앱 개발일지
- BFS
- 파이토치 트랜스포머를 활용한 자연어 처리와 컴퓨터비전 심층학습
- Kaggle
- DART
- bloc
- BAEKJOON
- Flutter
- fastapi를 사용한 파이썬 웹 개발
- Widget
- MATLAB
- Dreamhack
- system hacking
- Got
- Algorithm
- Image Processing
- BOF
- Computer Architecture
- FastAPI
- Stream
- 백준
- ARM
- ML
- study book
- pytorch
- Today
- Total
Bull
[System Hacking] NX & ASLR 본문
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'
'Computer Science > System Hacking' 카테고리의 다른 글
[System Hacking] Return To Library(RTL) with ROPgadget (0) | 2024.04.10 |
---|---|
[System Hacking] PLT & GOT (0) | 2024.04.10 |
[System Hacking] Stack Canary (0) | 2024.04.06 |
[System Hacking] Return Address Overwrite (0) | 2024.04.05 |
[System Hacking] Shell Code 및 syscall (2) | 2024.03.31 |