버퍼 오버플로우 공격(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/
'Programming > Etc.' 카테고리의 다른 글
[MFC] 2. 윈도우 프로그래밍 및 SDK 프로그램 기초 (0) | 2016.11.12 |
---|---|
[MFC] 1. MFC 기본 및 프로젝트 생성 (0) | 2016.10.31 |
OpenGL 콜백 프로그래밍 (0) | 2015.11.22 |
html (0) | 2015.11.14 |
자바 import 주석 한글 깨짐 현상 해결 (1) | 2015.11.09 |