Stack Buffer Overflow
Stack Buffer Overflow
스택 버퍼 오버플로우란 스택의 버퍼에서 발생하는 오버플로우다.
스택 버퍼 오버플로우가 발생하면 중요 데이터 변조, 데이터 유출, 실행 흐름 조작 등의 문제점들이 발생할 수 있다.
- 중요 데이터 변조: 버퍼 오버플로우가 발생하는 버퍼 뒤에 중요한 데이터가 있다면, 해당 데이터가 변조
- 데이터 유출: 다른 버퍼와의 사이에 있는 널바이트를 모두 제거하면, 해당 버퍼를 출력시켜서 다른 버퍼의 데이터를 읽을 수 있음
- 실행 흐름 조작: 함수를 호출할 때 반환 주소를 스택에 쌓고, 함수에서 반환될 때 이를 꺼내어 원래의 실행 흐름으로 돌아갈 때 반환 주소를 조작하면 프로세스의 실행 흐름을 바꿀 수 있음
Stack Buffer Overflow 방어
스택 버퍼 오버플로우를 방지하는 방법에는 확실하고 직접적인 방법과, 확실하진 않지만 간접적인 방법이 있다.
확실하고 직접 스택 버퍼 오버플로우를 방어하는 방법은 스택이 생성될 때마다 스택의 상단(Top)과 하단(Bottom)의 경계를 검사 하는 방법이 있다. 만약 스택 버퍼 오버플로우가 발생하여 해당 경계를 넘어가는 경우, 이를 감지하여 문제를 처리하는 방식이다. 이 방법은 스택 버퍼 오버플로우를 확실하게 방지할 수 있지만, 스택의 상단과 하단 경계를 매번 검사해야 하므로 오버헤드가 발생하여 프로그램의 성능이 저하되는 단점이 있다.
그래서 스택 버퍼 오버플로우를 방지하기 위한 간접적인 방어기법에는 Stack Canary, NX, ASLR, PIE등이 있다. 간접 방어 기법들에 대해서는 추후에 자세히 설명하겠지만, 여기서는 간략히 다룰 것이다.
- Stack Canary: 함수의 프롤로그에서 스택 버퍼와 반환 주소 사이에 임의의 값(카나리)을 삽입하고, 함수의 에필로그에서 해당 값(카나리)의 변조를 확인하는 기법이다.
- NX(No-eXcute): 코드 영역을 제외한 다른 메모리 영역에서 실행권한을 없애는 CPU의 기술이다. NX가 지정된 메모리는 실행권한이 없어 공격자가 쉘코드를 실행시켜도 실행되지 않는다.
- ASLR(Address Space Layout Randomization): 바이너리가 실행될 때마다 스택, 힙, 공유 라이브러리 등을 임의의 주소에 할당(주소 + @)하는 기법이다.
- PIE(Position Independent Executable): ASLR이 코드 영역에도 적용되게 해주는 기법이다.
해당 기법들이 간접적인 기법인 이유는 직접적인 방법보다는 스택 버퍼 오버플로우를 방어할 수 는 없기 때문이다.