본문 바로가기
[ ★ ]Study/Programming

Stack 이란

by nroses-taek 2017. 9. 16.
반응형
BUFFER OVER FLOW 공격을 공부하신 분이라면 Stack 대해서 아실 것입니다.
이유는 메모리 중에서도 특히 스택 영역은 매우 중요한 부분이기 때문입니다.
 
스택 영역에서는 함수 호출부분과 관련된 정보들, 중에서도 RET 저장되기 때문입니다.

 
스택이란 컴퓨터분야에 나오는 개념으로 메모리의 데이터들을 효율적으로 다루기 위해 고안된 데이터 참조 방식 하나입니다.
 
스택이라는 단어는 차곡차곡 쌓여진 더미를 의미하는데, 이는 가장 먼저 입력된 데이터가 가장 아래쪽에 쌓이고, 나중에 입력된 데이터는 위에 쌓이게 된다는 구조를 가집니다. 접시를 아래서부터 차곡차곡 쌓는다라는 상상을 같이 해주시면 좋을 같습니다.
그러면 접시를 다시 사용할 위에서부터 꺼내겠죠?
이와 같이 스택의 기본 개념은 '가장 먼저 처리해야 것을 가장 가까운 곳에 둔다' 입니다.
 
이처럼 스택은 가장 나중에 들어온 자료가 가장 먼저 나가게 되기 때문에 LIFO(Last-in, First-out) "후입선출형 구조"라고 합니다. FILO 라고도 간혹 보이는데, 같은 의미이지만 LIFO 용어가 정식용어 입니다.
 
 
 
PUSH POP 대해서 알아봅시다.
스택에 새로운 자료를 추가하는 것을 PUSH라고 부릅니다.
반면에 PUSH 의해 스택에 저장된 값을 다시 빼내는 것을 POP이라고 부릅니다.

 
이처럼 스택은 기본적으로 PUSH POP이라는 개의 명령으로 데이터를 추가하거나 제거할 있습니다.
 
또한 PUSH POP뿐만 아니라 TOP BOTTOM이라고 있는데,
이는 스택의 특정 위치를 가리키는 용어들입니다.
먼저 TOP. 단어 자체에서 나타내는 의미대로 현재 스택에 쌓인 데이터들의 위치 가장 높은 위치(가장 낮은 주소 ) 메모리 주소 값을 가리키는 용어입니다.
이처럼 스택에 쌓이는 데이터 양에 따라 TOP 위치는 계속해서 변하게 됩니다.
데이터가 추가되면 스택 내의 TOP 위치는 높아지고, 반대로 데이터가 제거되면 TOP 위치는 낮아집니다. (그림에서와 같이 ! )
결과적으로, 스택에 PUSH 이루어질 때엔 현재 TOP 해당하는 위치를 기준으로 새로운 데이터가 추가되고, TOP 위치는 시스템에따라 4바이트, 8바이트 높아집니다. 반대로 POP 이루어질 때엔 현재 TOP에서 시스템 스택데이터 크기만큼 데이터를 빼내며 다시 크기만큼 낮아집니다. 이처럼 TOP 데이터가 추가되거나 제거되는 위치를 가리키고 있으므로 Stack Pointer라고 불리기도 합니다.
마지막으로 BOTTOM 스택에서 가장 아래에 위치된 부분인데, 메모리 주소 (그림에서는 낮아보이지만, 실제 메모리 주소로는 높은 ) 가리킬 사용하는 용어입니다.
BOTTOM 그림과 같이 항상 같은 값을 가리키게 됩니다. 그리고 TOP == BOTTOM 된다면 스택의 가장 아래에 도달했기 때문에 이상의 저장된 자료가 없을을 의미합니다. 이때는 이상 POP명령을 수행할 없습니다.
 
정리

이처럼 TOP 메모리 맵의 낮은 주소쪽인 BOTTOM보다 , BOTTOM 높은 주소쪽인 TOP보다 아래라고 보면 쉽습니다.
언뜻 생각하기엔  스택이 점점 쌓여 나갈 수록 메모리 주소 값도 커질 것이라고 생각하고 그렇기에 TOP BOTTOM위치, BOTTOM HEAP STACK 경계선에 있어야 것이라고 생각하실 겁니다. 실제로는 아니죠.
그렇기 때문에 스택에 새로운 데이터가 추가될 수록 TOP 해당하는 메모리 주소값은 반대로 점점 작아지게 되며, 스택의 BOTTOM 항상 커널과 맞닿는부분(STACK 아래쪽 그림은 안그렸다.) 0xc0000000주소값이 됩니다.
이같이 생각하는 반대로 설계를 해놨을까 라는 의문을 품게합니다.
이는 가지 이유가 있는데, 째는 스택이 항상 커널의 반대방향으로 자라기 때문에 커널을 영원히 만나지 않게 됩니다. 다시 말해서 스택이 아무리 커져도 접근불가 영역인 커널을 건드리지 않게 됩니다. 보안상의 이유죠.
 
두번째 이유는 HEAP영역과 관련이 있습니다. HEAP 영역은 스택과 달리 새로운 데이터가 추가될수록 메모리 주소를 할당받게 됩니다. 이처럼 스택 영역과 영역이 공유 라이브러리 영역을 가운데에 두고 서로 마주보는 형태를 갖기 때문에 메모리 공간을 효율적으로 사용할 있게 됩니다.
 
아래 사진은 그려진 메모리 맵입니다.
 

[출처 : www.hackerschook.org ]

반응형

댓글