[c언어] 버퍼 오버플로우 공격

최근에 뉴스에서 “버퍼 오버플로우 공격”에 대한 이야기를 들었을 겁니다. 이번 글에서는 C언어에서의 버퍼 오버플로우에 대해 알아보고, 어떻게 방어할 수 있는지에 대해 다뤄보겠습니다.

1. 버퍼 오버플로우란?

버퍼 오버플로우는 C언어에서 많이 발생하는 보안 취약점 중 하나입니다. 이는 프로그램이 할당된 버퍼의 크기를 초과하여 데이터를 입력하는 공격 기법을 말합니다. 공격자는 이를 이용하여 프로그램을 비정상적으로 동작하게 만들어 시스템에 피해를 입힐 수 있습니다.

2. C언어에서의 버퍼 오버플로우

C언어에서는 배열의 크기를 확인하지 않고 데이터를 복사하거나 입력받는 것이 가능합니다. 이는 프로그램이 다른 메모리 영역을 침범할 가능성을 높이게 됩니다. 이러한 취약점을 이용하여 해커들은 악의적인 코드를 삽입하거나 시스템의 데이터를 훔칠 수 있습니다.

#include <stdio.h>

void vulnerableFunction(char *input) {
  char buffer[8];
  strcpy(buffer, input); // 입력값을 버퍼에 복사
}

int main() {
  char userInput[20];
  gets(userInput); // 사용자 입력 받기
  vulnerableFunction(userInput); // 취약 함수 호출
  return 0;
}

위 코드는 gets 함수를 통해 사용자 입력을 받고, 이를 버퍼에 복사하는 vulnerableFunction을 보여줍니다. 그러나 gets 함수는 버퍼 오버플로우 공격에 취약한 함수입니다.

3. 방어 방법

버퍼 오버플로우 공격으로부터 보호하기 위해 다음과 같은 방법을 적용할 수 있습니다.

버퍼 오버플로우 공격은 많은 시스템에 심각한 보안 문제를 초래할 수 있으므로, 프로그래머들은 언어의 특성과 보안 취약점에 대해 항상 주의깊게 생각해야 합니다.

자세한 내용은 OWASPCERT에서 확인하실 수 있습니다.