안녕하세요. 이번 포스팅에서는 메모리 기반 실행 방지 기술에 대하여 알아보겠습니다.
대표적인 프로그램 취약점 공격 방법으로 Stack, Heap과 같은 버퍼에 할당된 메모리 공간의 크기보다 더 많은 데이터를
저장하여 버퍼 공간을 망가뜨리는 Buffer Overflow와 Heap Spray 등과 같은 방법이 있습니다.
이 공격 방법들의 공통점은 모두 메모리 기반에서 특정 코드가 실행된다는 것입니다.
결론
따라서 결론을 먼저 말하면 DEP와 NX는 메모리에서 코드가 실행되지 않도록 방어하는 기술입니다.
Data Execution Prevention(DEP)
윈도우 플랫폼에서 사용되는 보안 기술입니다. 특정 프로그램이 사용하고 있는 메모리를 코드 실행 불가 영역으로 표시
하고, 이후 코드 실행이 이루어질 경우 프로그램을 종료시키는 기술입니다.
No-Execute(NX)
실행이 가능한 바이너리 파일을 빌드할 때 특정 코드가 실행되지 않는 영역에는 코드 실행 불가 영역이라는 것을 명시적으로 표시하고 이러한 영역에서 코드 실행이 이루어질 때는 예외처리 등을 거쳐 프로그램을 종료시키는 기술입니다.
따라서, NX와 DEP 기술은 같은 코드 실행 방지 기능이지만 DEP는 윈도우에서 표현되는 기술이라고 생각하면 될 것 같습니다.
오버플로우
잠깐 오버플로우가 무엇인지 알아보겠습니다.
우리가 일반적으로 C 언어 개발을 해보았다면 "버퍼" 라는 개념을 접해보았을 겁니다.
컴퓨터는 메모리라는 공간을 프로세스간 나누어 사용합니다.
자 바로 이 RAM의 공간을 사용하여 프로그램을 실행하고 저장하는 기능을 수행합니다.
RAM은 주기억 장치입니다. CPU 와 보조기억장치(하드디스크) 사이에 존재합니다.
우리가 흔히 C언어를 통해 아래와 같은 프로그램을 개발한다고 생각해봅시다.
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
void main() {
char buffer1[10] = "123456789";
char *buffer2 = null;
buffer2 = (char *)malloc(10);
if (buffer2) {
memset(buffer2, 0, 10);
memcpy(buffer2, "12345678901", 11);
} else return;
printf("buffer1 : %s\n", buffer1);
printf("buffer2 : %s\n", buffer2);
}
Buffer1은 10 Byte 만큼의 공간의 변수이고 "123456789" 총 9개의 글자를 저장합니다.
Buffer2는 10 Byte 만큼의 공간의 변수이고 "12345678901" 총 11개의 글자를 저장합니다.
이처럼 우리는 프로그램을 개발하면서 버퍼의 크기를 10으로 고정시켜놨지만, 외부의 공격이나 어떠한 알 수 없는 이유
로 저 10의 버퍼에 11과 같이 더 큰 내용을 저장할 때를 Overflow라고 말합니다.
아주 단순한 예제이지만 buffer1과 buffer2는 아래와 같은 취약점이 존재합니다.
buffer1 : main이라는 함수의 지역변수이기 때문에 Stack 영역에 메모리 공간이 할당됩니다. 그리고 이런 공간에서 Overflow 현상이 발생했기 때문에 Stack Overflow 라고 말합니다.
buffer2 : malloc 함수를 통해 동적으로 메모리 공간을 포인터 변수에 할당하였습니다. 동적으로 할당된 메모리 공간은 모두 Heap 영역에 존재합니다. 그리고 이런 공간에서 Overflow 현상이 발생했기 때문에 Heap Overflow 라고 말합니다.
Stack 영역은 이미 빌드할 때 고정된 메모리 공간의 크기를 가지고 있기 때문에 이런 공간이 망가지면 많은 예기치 못한
프로그램 오류가 발생할 수 있습니다.
이러한 Overflow 현상이 왜 심각한 취약점인지는 나중에 Stack Overflow 포스팅에서 다루도록 하겠습니다.