스택 버퍼 오버플로우는 보안을 공부하지 않은 개발자들도 알만큼 유명하고 역사가 오래된 취약점이다.
스택 오버플로우와 스택 버퍼 오버플로우의 차이점
스택영역은 실행중에 크기가 동적으로 확장될수 있다. 그러나 한정된 크기의 메모리 안에서 스택이 무한히 확장될 수는 없다. 스택 오버 플로우는 스택영역이 너무 많이 확장돼서 발생하는 버그를 뜻한다. 반면, 스택 버퍼 오버플로우는 스택에 위치한 버퍼에 버퍼의 크기보다 많은 데이터가 입력되어 발생하는 버그를 뜻한다.
스택의 버퍼에서 발생하는 오버 플로우를 뜻한다. 이를 이해하기 위해서는 먼저 버퍼와 오버플로우의 개념을 알아야한다.
버퍼는 일상에서 완충장치라는 뜻으로 사용되며, 컴퓨터 과학에서는 '데이터가 목적지로 이동되기 전에 보관되는 임시 저장소'의 의미로 쓰인다.
데이터의 처리속도가 다른 두 장치가 있을 때, 이 둘 사이에 오가는 데이터를 임시로 저장해 두는 것은 일종의 완충 작용을 한다. 수신과 송신측에 사이에 버퍼라는 임시 저장소를 두고, 이를 통해 간접적으로 데이터를 전달하게 한다. 송신 측은 버퍼로 데이터를 전송하고, 수신 측은 버퍼에서 데이터를 꺼내 사용한다. 이렇게하면 버퍼가 가득 찰 때까지는 유실되는 데이터 없이 통신할 수 없다. 빠른 속도로 이동하던 데이터가 안정적으로 목적지에 도달할 수 있도록 완축 작용을 하는 것이 버퍼의 역할이라 할 수 있다.
현대에서는 이런 완충의 의미가 많이 희석되어 데이터가 저장될 수 있는 모든 단위를 버퍼라고 부르기도 한다. 스택에 있는 지역변수는'스택 버퍼', 힙에 할당된 메모리 영역은 '힙 버퍼' 라고 불린다.
버퍼링
버퍼에서 유래된 단어로, 송신 측의 전송 속도가 느려서 수신 측의 버퍼가 채워질 떄까지 대기하는 것을 의미한다.
버퍼 오버플로우는 문자 그대로 버퍼가 넘치는 것을 의미한다. 버펀는 제각기 크기를 가지고 있는데, int로 선언한 지역변수는 4바이트의 크기를 갖고. 10개의 원소를 갖는 char 배열은 10바이트의 크기를 갖는다. 만약 10바이트 크기의 버퍼에 20바이트 크기의 데이터가 들어가려 하면 오버플로우가 발생한다.
일반적으로 버퍼는 메모리상에 연속해서 할당되어 있으므로, 어떤 버퍼에서 오버플로우가 발행하면, 뒤에 있는 버퍼등릐 값이 조작될 위험이 있다.
버퍼오버플로우는 일반적으로 어떤 메모리 영역에서 발생해도 큰 보안 위협으로 이어진다.
버퍼 오버 플로우가 발행하는 버퍼 뒤에 중요한 데이터가 있다면, 해당 데이터가 변조됨으로써 문제가 발생할 수 있다.