Updated:

1 minute read

개요

  • 영단어
    • ‘넘치다’, ‘범람하다’
  • 컴퓨터
    • 정수 연산의 계산 결과가 허용 범위를 초과할 때 발생하는 오류
    • -127 ~ 127 범위에서 127에 1을 더하면 -127이 되고 -127에 1을 빼면 127이 되는 현상
    • 종류
      • 버퍼 오버플로우, 스택 오버플로우, 힙 오버플로우, 산술 오버플로우


버퍼 오버플로우

  • 버퍼 이후 공간을 침범하는 현상
  • 버그
    • 입력 값 크기가 버퍼 크기보다 큰 경우
  • 공격 방법
    • 프로그램의 메모리 값을 임의로 변조
  • 종류
    • 스택 오버플로우
    • 힙 오버플로우
  • 대처
    • 스택 가드
      • 변수를 선언하여 특정 값으로 선언하고 값이 변경되었는지를 확인
    • 스택 쉴드
      • 함수의 리턴 주소를 복사하여 실제 리턴 주소가 아닌 복사한 주소를 사용
  • 예시
    • 발생 코드
      •    #include <cstring>
           #include <iostream>
                    
           using namespace std;
                    
           int main() {
               char buffer[4];
               strcpy(buffer, "12345678");
               cout << buffer << endl;
                    
               return EXIT_SUCCESS;
           }
        
    • 방어 코드(스택 가드)
      •    #include <cstring>
           #include <iostream>
                    
           using namespace std;
                    
           int main() {
               int i = 0;
               cout << "i : " << i << endl;
                    
               char buffer[4];
               strcpy(buffer, "12345678");
               cout << buffer << endl;
                    
               if (i != 0) {
                   cout << "buffer overflow" << endl;
                   exit(-1);
               }
                    
               return EXIT_SUCCESS;
           }
        


스택 오버플로우

  • 버퍼 오버플로우의 한 종류
  • 스택 포인터가 스택의 경계를 넘어설 때 발생
  • 코드
    •  void func() { func(); }
            
       int main() { func(); }
      


힙 오버플로우

  • 버퍼 오버플로우의 한 종류
  • 힙 데이터 영역에서 발생


산술 오버플로우

  • 부동소수점 연산에서 지수부가 타입의 한계를 넘어 작아지면 0에 가까워지다가 결국 0이 되어버리는 현상