[시스템 해킹] 메모리 보호 기법(Memory Mitigation)
시스템 해킹을 하다 보면 메모리 보호 기법이 걸려 있는 경우가 발생하는데,
메모리 보호기법의 종류와 그에 대한 우회 방법이 있는 것을 정리해 보았다.
참고)
1. ASLR (Address Layout Randomization)
📌 실행파일과 관련된 스택, 힙, 라이브러리 등의 주소를 랜덤 하게 배치하여서 실행할 때마다 변경하도록 하는 기법.
✔ 설정 값 확인 및 변경 방법
- cat /proc/self/maps
- cat /proc/sys/kernel/randomize_va_space
- randomize_va_space=0 : ASLR 해제
- randomize_va_space=1 : 랜덤 스택, 라이브러리 활성화
- randomize_va_space=2 : 랜덤 스택, 라이브러리 활성화, 힙 활성화
* 임시로 설정하는 것이기 때문에, 재부팅하면 기본값인 2로 변경이 됨.
📌 우회 방법 :
1) Brute-force : x86에서는 예측해야할 길이가 적기 때문에 모든 경우의 수의 주소를 대입하여서 예측하는 방법
2) Memory Leak : 매모리 영역이 매번 변경되는 것이기 때문에, Memory Leak 취약점으로 특정 위치의 주소를 알게 된다면 offset 계산을 하여서 다른 주소들의 위치도 예측
2. NX bit / DEP (Non-Executable / Data Execution Protection)
📌 data, heap, stack 영역에서 실행권한을 부여하지 않아서 메모리 공간에 있는 쉘코드가 실행되지 않도록 하는 기법.
✔ 윈도우에서는 DEP 이라고 부르고, 리눅스에선 NX bit라고 부른다.
✔ 메모리 맵을 통해서 어떻게 적용이 되었는지 확인할 수 있다.
👉 메모리 맵을 보면 stack 영역에 x(실행) 권한이 없는 것을 확인할 수 있다.
📌 우회 방법 : ROP(Return Oriented Programming) - 실행가능한 코드 영역의 gadget을 이용하여 메모리 영역에 실행권한이 없어도 원하는 실행 흐름을 만들 수 있다.
3. Stack Canary
📌 스택에서 변수들과 SFP(Strack Frame Pointer) 사이에 임의의 값(Canary)을 삽입하여 함수 복귀 시 해당 값이 변조되었는지 여부를 확인하는 기법이다. Buffer Overflow로 SFP나 RET가 변조되지 못하도록 한다.
📌 우회 방법 : Info Leak - Canary도 메모리에 저장되기 때문에 이 값을 leak할 수 있다면, canary가 변조되지 않은 것처럼 속여서 RET값을 변조하도록 한다.
4. ASCII Armor
📌 공유 라이브러리를 매핑할 때, 주소값의 상위 1바이트가 NULL(0x00)가 되도록 하는 기법. 그러면 공격자가 라이브러리를 호출해도 NULL로 인해서 접근이 불가하게 된다. RTL(Return-To-Library) 공격에 대응하기 위한 방법이다.
✔ strcpy()와 같은 함수는 NULL bytes를 만나면 종료하기 때문
✔ 예) 라이브러리 주소가 0x00801234 이면, 함수가 0x00을 만나서 종료 되버림.
5. PIE(Position Independence Executable)
📌 독립 코드로 이루어진 실행파일을 의미하며, 코드가 매핑된 주소와 상관없이 실행되기 때문에 코드가 매핑되는 메모리 영역이 매번 달라지는 기법. 기존 절대주소로 plt와 got 영역에 접근해서 공격하는 것이 어려워 짐.
.✔ code, bss, data 영역의 주소를 랜덤화
👉 PIE가 설정되지 않았을 때 : plt, got를 이용해서 함수를 호출
👉 PIE가 설정되었을 때 : 위치에 독립적이기 때문에 프로그램을 실행할 때마다 매핑되는 주소가 변경
📌 우회 방법 : Memory Leak
6. RELRO (Relocation Read-Only)
📌 쓰기 권한을 제거하는 보호 기법으로 Partial RELRO와 Full RELRO가 존재한다. 프로세스가 시작될 때 링커에 의해 재배치 작업이 진행되는데 시간이 오래 걸리기 때문에 Full보다는 Partial을 더 많이 사용.
- Partial RELRO : .dynamic 영역의 쓰기 권한이 존재하지 않음. 👉 GOT Overwrite 가능
- Full RELRO : .bss 영역을 제외한 모든 영역의 쓰기 권한이 존재하지 않음. 👉 GOT Overwrite 불가
Relocation table은 프로그램이 실행되기 위해 어느 부분에 relocation이 필요한지 보관하고 있는 영역이다.
📌 우회 방법 : Partial RELRO 의 경우 GOT Overwrite
메모리 보호기법 확인 방법 : checksec
Reference :
https://core-research-team.github.io/2020-05-01/memory
https://whitel0tus.tistory.com/29