심심해서 하는 블로그 :: [버퍼 오버플로우] 개요

1. Buffer Overflow

가장 기본이 되는 예제로 보면 변수 c는 char형 8개를 담을 수 있는 공간이다. 이 곳에 8개 이하의 데이터를 보관하는 것은 문제가 되지 않는다. 근데 9개의 데이터를 넣는 순간 c의 영역을 넘어 다른 공간까지 데이터가 저장되는 것을 알 수 있다. 이처럼 버퍼 오버플로우는 입력의 한계를 충분히 확인하지 않은 API 사용으로 버퍼에 근접한 메모리 주소에 있는 데이터 값을 변경할 때 발생한다. 대표적인 API로는 scanf(), gets(), strcat(), strcpy() 등이 있다. 최근에 나온 컴파일러는 취약한 API에 대하여 사용을 제한하거나 경고하고 있다.


2. 공격 방법(Stack overflow)


메모리에서 스택은 고드름처럼 위에서 성장하는 하며 함수가 호출되면 매게변수 - 리턴 주소 - 지역 순으로 스택에 쌓인다. 반면에 버퍼는 거꾸로 위로 타고 올라가면서 성장한다. 따라서 일정 수준 이상을 입력하게 되면 리턴 주소가 변경된다. 이 특성을 이용하여 공격자는 메모리상에 악성 코드를 주소 A에 두고 리턴 주소를 버퍼 오버플로우를 활용하여 A로 변경하여 원하는 프로그램을 수행시킨다. 이러한 악성코드는 시스템 콜로 구성되어 있다.


3. 예방법

범위를 확인하지 않는 API 사용은 하지 않는다.

대표적인 strcat(), strcpy(), scanf()는 입력의 범위를 확인하지 않고 입력시키는 특징 때문에 버퍼 오버플로우에 취약한 모습을 보여준다. strlcat(), strlcpy(), scanf_s() 등으로 대체하여 사용하는 것이 중요하다.


최신의 운영체제를 사용한다.

운영체제가 발전함에 따라 스택 가드, 스택 쉴드, Non-Executable 스택 등 다양한 방어 장치를 이용해 공격자의 공격을 막는다. 또한 컴파일러도 발전함에 따라 범위 밖의 입력에 대하여는 예외로 처리하여 주며 불완전한 API 사용에 대하여 경고나 금지를 하는 등 최신의 컴파일러를 사용하는 것도 좋은 방법이다. 

,