개요
- 영단어
- 컴퓨터
- 정수 연산의 계산 결과가 허용 범위를 초과할 때 발생하는 오류
- -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이 되어버리는 현상