C언어에서의 Buffer의미: 지정된 크기의 메모리 공간
그럼 버퍼 오버플로우 취약점은 그 이름에서 나타나듯이 버퍼가 허용할 수 있는 데이터보다 더 많은 값이 저장되어 버퍼가 넘치게 (Overflow) 취약점이다.
여기서 알아가야 할 개념은 메모리 공간이다.
메모리는 이런 형식으로 이루어져 있는데, 이번에는 버퍼 오버플로우를 설명하기에, 간단한 표를 통해서만 설명하겠다.
위의 공간 중 이번 취약점은 스택 영역과 힙 영역에서 발생된다.
자! 이제 진짜 간단하게 메모리 구조를 살펴 보았으니 버퍼 오버플로우가 어떻게 진행되는지 알아보자.
이렇게 8 바이트 버퍼 A와 8 바이트 데이터 영역 B가 있을때, A에 할당될 비트가 16비트가 된다면, A의 영역을 넘어가서 데이터 버퍼까지 덮어쓰게 되는데, 우리는 이럴때 바로 버퍼 오버플로우가 발생했다고 한다.
또한 이런 상황으로 우리는 프로그램의 정의되지 않은 행동을 이끌어 내게 되는데, 그 예로, 만약 우리가 B영역에 나중에 호출하게 될 함수 포인터를 저장하고 있을 때 현재 처럼 데이터를 뒤 덮게 되면, 오류가 발생하게 된다.
이를 해커가 악용하게 되면, 이 어딘가에 코드를 삽입하고 함수 포인터를 공격자의 코드 주소로 덮어 악의적인 코드를 실행하게 된다.
<드림핵의 예제를 살펴 보자>
#include <stdio.h>
#include <stdlib.h>
int main(void) {
char buf[16];
gets(buf);
printf("%s", buf);
}
위의 코드가 예제 코드이다.
코드를 설명해 보자면, char형으로 16바이트 버퍼를 스택에 할당한다.(지역 변수니까!)
그리고 get형으로 사용자에게 값을 받는데, 이 함수는 사용자가 개행(줄바꿈 키)을 입력하기 전에는 입력던 모든 내용을 첫 인자로 전달된 버퍼에 저장하는 함수이다.
근데 여기서 핵심 내용이 무엇이냐, get함수는 따로 길이 제한이 없기 때문에, 입력하고 싶은 만큼 입력이 가능하단 것이다. 그러므로 따로 정해놓은 버퍼의 크기를 넘어갈 수 있는 상황이라는 것이다.
그래서 값이 오버 플로우 된것을 볼 수 있다.