728x90
반응형


버퍼 오버플로우 공격(Buffer Overflow Attack) 이란?


  간단히 말해서 프로그램에 버퍼를 조작할 수 있는 버그가 존재할 경우 컴퓨터에게 해커가 원하는 일을 하도록 지시시켜 공격하는 것이다.






버퍼 오버플로우가 발생하는 C코드


1
2
3
4
5
6
7
#include <stdio.h>
int main(int argc, char* argv[])
{
char buffer[200];
strcpy(argv[0], buffer);
printf("Hello %s",buffer);
}


  이 코드는 버퍼 오버플로우 취약성이 있는 코드다. 코드를 컴파일하고 실행시켰을 때 첫 번째 인자에 200자 이상의 문자를 입력하면 버퍼 오버플로우가 발생하게 된다. 이 경우 악의적인 공격자가 컴퓨터의 루트 권한을 뺏어 올 수 있게 되어 자유자재로 컴퓨터에게 악영향을 끼칠 수 있다.



버퍼 오버플로우가 발생하는 이유


  버퍼 오버플로우의 발생을 이해하기 위해서는 먼저 프로그램이 데이터를 어떻게 저장하고, 함수가 어떻게 호출되는지를 알아야한다. 하나의 프로그램은 수 많은 함수로 구성되어있는데 이 함수가 호출될 떄, 지역 변수와 복귀주소(Return Address)가 스택이라 하는 논리 데이터 구조에 저장된다.

  복귀주소가 저장되는 이유는 함수가 종료될 때 OS가 함수를 호출한 프로그램에게 제어권을 넘겨야 하는데, 이 복귀주소가 없으면 함수가 종료된 후 어떤 명령어를 수행해야 할 지 모르기 때문이다.


  그래서 버퍼오버플로우는 이 복귀주소가 함수가 사용하는 지역변수의 데이터에 의해 침범 당할 때 발생하게 된다. 프로그래머 실수로 지역변수가 할당된 크기보다 큰 크기를 입력해버리면 복귀주소가 입력한 데이터에 의해 다른 값으로 변경 되기 때문에 함수가 종료될 때 전혀 관계없는 복귀주소를 실행시키게 되어서 어플리케이션이 뜻하지 않게 종료된다.


  이 부분에서 악의적인 공격자가 이러한 취약점을 알고서 데이터의 길이와 내용을 적절히 조정하여 버퍼 오버플로우를 일으켜서 특정 코드를 실행시키게 하는 해킹 기법을 버퍼오버플로우 공격이라고 한다.







Standard C의 함수들은 비쥬얼 스튜디오 2013 버전부터 _s가 붙기 시작



  최근 비쥬얼 스튜디오 2013에서도 버퍼오버플로우 공격을 막기 위해서 scanf 를 scanf_s로 바꾸어 선언하게 하는 등의 시도들이 이어지고 있다.


  scanf와 scanf_s의 차이는 character와 character pointer를 입력받는 경우 버퍼의 크기를 하나 더 적어주어야 한다는 것인데


  그 이유는 버퍼 오버플로우(=버퍼오버런)를 이용한 공격을 방어하는 목적 때문이다. 

버퍼의 크기를 정해주지 않고 사용자의 입력을 받는 경우, 그 버퍼에 실행 코드를 함께 껴넣으면서 그 실행코드로 jump하게 되는 기술을 사용하면 기존 방식인 scanf 등을 이용해 입력을 받는 프로그램을 통해 외부의 실행코드가 실행될 수 있게 조작하고, 그 실행으로 바이러스를 옮기는 등의 악성프로그램을 실행하게 될 수 있기 때문이다.


그래서 scanf 뿐만 아니라 standard C의 함수들이 보안기능을 위해 _s 가 붙는 함수로 변경되고 있다.






출처 - http://story.wisedog.net/buffer-overflow-%EB%B2%84%ED%8D%BC-%EC%98%A4%EB%B2%84%ED%94%8C%EB%A1%9C%EC%9A%B0-%EB%9E%80/

728x90
반응형