[SISS] Lazenca (Protection Tech > NX Bit(MX : DEP))
NX Bit(MX : DEP)
▶ NX Bit(Never eXecute bit, 실행 방지 비트)
: 프로세스 명령어나 코드 또는 데이터 저장을 위한 메모리 영역을 따로 분리하는 CPU의 기술
NX 특성으로 지정된 모든 메모리 구역은 데이터 저장을 위해서만 사용되며, 프로세서 명령어가 그 곳에 상주하지 않음으로써 실행되지 않도록 만들어 준다.
▶ DEP(Data Execution Prevention)
- 마이크로소프트 윈도우 운영 체제에 포함된 보안 기능이며, 악의적인 코드가 실행되는 것을 방지하기 위해 메모리를 추가로 확인하는 하드웨어 및 소프트웨어 기술
- 하드웨어 DEP: 메모리에 명시적으로 실행 코드가 포함되어 있는 경우를 제외하고 프로세스의 모든 메모리 위치에서 실행할 수 없도록 표시 ( 대부분 최신 프로세서는 하드웨어 적용 DEP를 지원)
- 소프트웨어 DEP: CPU가 하드웨어 DEP를 지원하지 않을 경우 사용한다.
ex) 공격자가 Heap, Stack 영역에 Shellcode를 저장해서 실행하기 위해서는 해당 영역에 실행권한이 있어야 한다.
- DEP가 적용되지 않았을 경우 → 쉘코드가 실행되어야 한다.
- DEP가 적용된 경우 → 실행권한이 없으므로 쉘코드가 실행되지 않는다. (프로그램에서 해당 동작에 대한 예외 처리 후 프로세서가 종료된다.
< Example program >
#include <stdio.h>
#include <stdlib.h>
int main(){
char str[256];
char *chare = (char*)malloc(100);
printf("Input: ");
gets(str);
printf("%p\n", str);
}
< Check the protection techniques of binary files >
▶ checksec.sh
- gcc -z execstack -o DEP-disabled DEP.cfh
- gcc -o DEP-enabled DEP.c
▶ Checking Permissions in Memory
다음과 같은 메모리 맵에서 메모리 영역별 설정된 권환을 확인할 수 있다.
- DEP enabled의 경우 실행권환(--x-)을 가지고 있는 영역은 5곳이다.
- DEP disabled의 경우 실행권한(--x-)을 가지고 있는 영역은 17곳이다.
< How to detect NX in the "Checksec.sh" file >
▶ Binary
- 바이너리 NX 설정여부 하기
: readelf 명령어를 이용해 파일의 세그먼트 헤더 정보에서 NX 여부를 확인, 파일의 세그먼트 헤더 정보에서 'GNU_STACK'의 Flg값이 'RWE'이라면 NX가 활성되었다고 판단
▶ Process
- 실행중인 프로세서의 NX 설정 여부 확인하기
: 바이너리 확인 방식과 동일하며, 전달되는 파일의 경로가 다르다. (ex) /proc/<PID>/exe)
▶ CPU
- CPU의 NX 설정여부 확인하기
: "/proc/cpuinfo" 파일에서 'nx'문자가 있는지 확인하기