[용어] 오버플로우
Updated:
개요
- 영단어
- ‘넘치다’, ‘범람하다’
- 컴퓨터
- 정수 연산의 계산 결과가 허용 범위를 초과할 때 발생하는 오류
- -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이 되어버리는 현상