Buffer란, 일종의 임시 기억장소이다. 데이터가 잠시동안 저장되는 공간을
버퍼라 하는데, 버퍼에는 두가지 종류가 있다.
Stack 은, 흔히 FILO 구조라 한다. 즉, First In, Last Out. 다시 말하면 처
음 들어간게 마지막에 나온다는 뜻이다. 이 말이 무슨말인지를 이해하려면
높게 쌓아 올린 100원짜리 동전들을 생각하면 쉽다. 제일 바닥에 있는 동전
은 제일 처음 쌓기 시작한 동전이겠지만, 탑을 다 쌓고 나서 그 동전을 사용
하기 위해서는 위에 쌓아올린 동전을을 모두 사용해야 제일 마지막으로 그
동전을 사용할 수 있다. 스택이란 바로 이런식의 데이터 구조를 가진다. 제
일 처음 들어간 데이터가 제일 밑에 위치하고, 그 다음 들어간 데이터가 그
위에 위치하게 된다. 이런식으로 데이터들이 차곡 차곡 쌓이게 된다. 이번엔
반대로 그 데이터들을 꺼내는 경우를 생각해 보자. 우선 제일 마지막에 들어
간 데이터, 즉 제일 위쪽에 있는 데이터를 꺼내야만 그 아래에 있는 데이터
를 꺼낼 수 있게 된다. 그리고 그 데이터를 꺼내야만 또 그 아래에 있는 데
이터를 꺼낼 수 있게 된다. 이런식으로 제일 처음 들어간 데이터를 꺼내기
위해서는 나중에 들어간 데이터들을 모두 꺼낸 뒤에, 비로소 제일 마지막으
로 처음에 들어간 데이터를 꺼낼 수 있는 것이다.
Heap 은, 흔히 FIFO 구조라 한다. 즉, First In, First Out. 다시 말하면 처
음 들어간게 처음에 나온다는 뜻이다. 이 말이 무슨 말인지를 이해하려면 양
옆이 뚫려있는 파이프를 생각하면 쉽다. 파이프의 한쪽 구멍을 들어가는 문,
반대쪽 구멍을 나오는 문이라 할때, 들어가는 문에 동전을 계속해서 집어 넣
으면 언젠가는 파이프가 꽉 차게 되고, 그렇게 되면 제일 처음 들어갔던 동
전은 나오는 문을 통해 밖으로 빠져나오게 된다. 즉, 제일 먼저 들어간 동전
이 제일 먼저 나온다는 말이다. 힙은, 이런식으로 먼저 들어간 데이터가 먼
저 나오는 데이터 구조이다.
버퍼에 이 두가지 종류가 있듯이, 버퍼 오버플로우에도 두가지 종류가 있다.
이미 눈채 챘겠지만, 스택 오버플로우와 힙 오버플로우가 그것이다. 그리고
우리가 흔히 "Buffer Overflow"라고 부르는 것은 스택 오버플로우를 말한다.
앞으로는 스택 오버플로우와 힙 오버플로우를 구분하기 위해, "Buffer Overf
low" 라는 단어를 되도록이면 사용하지 않겠다.
유닉스 계열의 OS 에서 한 프로세스를 실행시키면, 그 프로세스는 다음과 같
은 구조로 메모리에 읽혀지게 된다.
/-------------------------/ 메모리상에서
| | 높은 구역
| Stack |
| |
/-------------------------/
| |
| Heap |
| |
/-------------------------/
| |
| Data |
| |
/-------------------------/
| |
| Text |
| | 메모리상에서
/-------------------------/ 낮은 구역
Text 는, 메모리상에서 가장 낮은 구역에 위치하는 부분으로, 프로그램의 본
채라 할 수 있다. 보통 실행 코드들의 집합과 읽기만 가능한 데이터들이 들
어가게 된다.
Data 는, Text 구역 바로 위에 위치하는 곳으로써, 프로그램에서 사용되는
변수값들을 저장하게 된다.
Heap 은, 정돈되어 있지 않은 메모상의 공간으로, 목적이 정해지지 않은 공
간이다.
Stack 은, 유닉스용 프로그램이 대부분 C 언어로 작성되어 있기 때문에 만들
어진 구역으로, 메모리상에서 가장 위쪽에 위치하게 된다. C 언어에서 한 함
수를 호출할때, 그 함수 내부에서 사용되는 지역변수나 그 밖에 값들을 저장
하게 된다.
Text, Data, Heap 구역을 모두 이해할 필요는 없다. 오히려 그러한 구역은
우리가 알아야할 범위를 벗어난다. 우리가 반드시 알아야 할 것은, Stack 영
역이다. C 언어에서 함수를 호출할때 그 함수를 위한 공간이 바로 Stack 에
생성되는 것이다. Stack Overflow는 이 부분을 조작함으로써 발생시킬 수 있
는 해킹기법인 것이다.
그러면 함수가 호출될 때, Stack 에는 정확히 어떤 형태의 구조가 생성되는
지 알아보도록 하자.
댓글 없음:
댓글 쓰기