2009년 5월 14일 목요일

Buffer란 무엇인가

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 에는 정확히 어떤 형태의 구조가 생성되는
지 알아보도록 하자.


 

댓글 없음:

댓글 쓰기