티스토리 뷰

반응형

오버플로우 공격
오버플로우 공격

[ 목차 ]

      버퍼 오버플로우 공격 개요

      (가) 프로세스 메모리 구조

          ① 프로세스의 메모리 구조는 Text, Data, Heap, Stack 영역으로 구분되어 있다.

      메모리 구조

          ② Text 영역 : 프로그램 코드와 상수가 정의되어 있고, 읽기만 가능한 메모리 영역이기 때문에 데이터를 저장하려고 하

               면 분할 충돌을 일으켜 프로세스가 중지된다.

          ③ Data 영역 : 전역 변수(Global variable)와 정적 변수(Static variable)가 저장되어 있는 영역이다.

          ④ Heap 영역 : 프로그래머의 필요에 따라 동적 메모리 호출에 의해 할당되는 메모리 영역이다.

          ⑤ Stack 영역 : 함수 인자 값, 함수 내의 지역 변수, 함수의 반환 주소 등이 저장되는 영역으로 상위 메모리 주소에서 하

              위 메모리 주소로 데이터가 저장된다.

      (나) 스택 프레임 구조

      스택 프레임 구조
      스택 프레임 구조

      버퍼 오버플로우 공격의 기본 개념

      ① 버퍼 또는 데이터 저장 영겨에 할당된 용량보다 더 많은 입력이 위치하면 다른 정보를 변경할 수 있는 조건이다. 공격자

          는 이런 조건을 이용하여 시스템을 중지시키거나 시스템의 제어를 갖기 위한 특별한 코드를 삽입한다.

      ② 버퍼 오버플로우는 프로세스가 정해진 크기의 버퍼 한계를 벗어나 이웃한 메모리 위치에 데이터를 겹쳐 쓰려고 시도하

          는 것과 같은 프로그래밍 오류의 결과로 발생한다.

      공격 원리

      ① 버퍼 오버플로우에 취약한 함수를 쓰는 예제 코드를 이용해 그 원리를 알아본다.

      int main(int argc, char *argv[]){            ①
      char buffer[10];                             ②  
           strcpy(buffer, argv[1]);                ③
           printf("%s\n", buffer);                 ④
           }

      ② 분석

           ⊙ 이 프로그램은 bugfile abcd와 같이 입력하면 결과값으로 abcd를 출력하는 아주 간단한 프로그램이다.

           ⊙ 각 행의 의미를 살펴보면 다음과 같다.

               ① int main(int argc, char *argv[]) : argc는 취약한 코드인 bugfile.c가 컴파일되어 실행되는 프로그램의 인수 개수이

                   다. *argv[]는 포인터 배열로서 인자로 입력되는 값에 대한 번지수를 차례대로 저장한다.

                   ● argv[0] : 실행 파일의 이름

                   ● argv[1] : 첫 번째 인자의 내용

                   ● argv[2] : 두 번쨰 인자의 내용

               ② char buffer[10] : 10바이트 크기의 버퍼를 할당한다.

               ③ strcpy(buffer, argv[1]) : 버퍼에 첫 번째 인자(argv[1])를 복사한다. 즉 abcd 값을 버퍼에 저장한다. 실제 버퍼 오버

                   플로우 공격은 strcpy(buffer, argv[1])에서 일어난다. strcpy 함수는 입력된 인수의 경계를 체크하지 않는다. 즉, 인

                   수는 buffer[10]으로 10바이트 길이를 넘지 않아야 하지만 그보다 큰 인수를 받아도 스택에 쓰인다.

               ④ printf("%s\n", buffer) : 버퍼에 저장된 내용을 출력한다.

       

      반응형