stack frame에 대해 정리해 보겠다.
먼저 하나의 프로세스를 생성하게 되면 메모리를 아래와 같이 관리 한다.
Code : CPU가 처리할 코드가 올라가는 메모리 영역이다. 실행하면 여기서 하나씩 가져가면서 실행을 하게 된다. 프로그램 실행시 메모리에 올라가서 종료떄 해제된다.
Data : 프로그래밍시 전역변수등이 올라가는 메모리 영역으로 프로그램 실행시 메모리에 올라가서 종료때 해제된다.
Stack : 지역변수, 매개변수 등이 상주하게 되는 메모리 영역이다. 필요시 메모리에 올리고 사용후 제거 하면서 메모리를 활용적으로 사용할 수 있게 된다.
Heap : 사용자 영역 메모리라고 불리는 이곳은 사용자가 원할떄 메모리를 할당하며 원할때 해지할 수 있는 메모리 영역이다. C언어에서 malloc, free 의 함수를 이용해 할당하고 해제한다.
위의 영역들 중에서 스택은 매우 중요한 영역이다. 스택이 어떤 구조로 실행이 되는지 알아보자.
스택은 기본적으로 쌓아 올린 더미를 의미한다. 때문에 추가시에는 맨 위에 추가하고 제거시에도 맨 위부터 제거를 하는 형태의 자료구조이다.
스택을 좀 더 자세히 보면 옆과 같은 구조로 되어 있다.
처음 함수를 호출하게 되면 스택에 RET(Return addr)을 저장하고 그 다음엔 SFP(Stack frame point)를 저장한다. 그리고 이후 매개변수와 지역변수들이 스택에 쌓이게 된다. 그렇게 필요한 것들을 다 쌓은 후에는 스택 젤 위를 ESP가 가리키게 된다.
위의 말이 먼말인지 이해 하기가 어렵다....
차근차근히 정리를 해보자
1. 일단 EBP, ESP, EIP는 레지스터이다.
레지스터는 다음을 참고하면 된다.
-> http://jungmonster.tistory.com/108
2. 스택은 새로운 함수가 호출 될때마다 만들어진다. 즉, main 함수가 호출 될 때에도 만들어 지고 main 함수에서 새로운 함수를 호출할떄 또한 만들어지며, 그 함수에서도 새로운 함수를 호출하면 또 새로운 스택이 생성된다.
3. RET는 새로 호출한 함수에서 작업이 끝나면 돌아갈 주소를 저장한다. 즉 main에서 새로운 함수로 호출해서 새로운 스택을 생성했다고 생각 하면 그 함수는 자신의 기능을 수행하고 종료를 할 것이다. 그럼 다시 main 함수로 돌아오는데 새 함수를 호출 이 후 부터 작업을 시작할 것이다.
4. EBP, ESP에는 새로 생성된 스택의 범위를 지정한다. 이는 한번 예를 들어 보겠다.
그림을 보면 위에서 보여준 스택의 형태가 여래가가 들어간 것을 볼 수 있다. 하지만 EBP, ESP는 여러개가 아니기 때문에 현재 작업중인 스택의 위치를 저장한다. 옆의 그림은 여러 함수가 호출 되었을때의 상황을 나타낸 것이다.
즉 EBP에는 스택의 base point ESP에는 스택의 최상위 point를 저장한다. 이로 인해서 스택의 크기가 정해지며 함수의 작업 범위가 정해지는 것이다.
(간단히 예를 든다면 main에서 f1()이라는 함수를 호출하면 main의 지역 변수도 메모리 상에 남아 있지만 f1()에서는 main의 지역함수를 사용 할 수 없는 것이 이러한 이유 떄문이다.)
5. SFP에는 이전 스택의 Base point를 저장한다.
base point를 왜 저장을 해둘까? 이유는 4번과 같은 이유이다. 스택의 크기를 저장하기 위해서이다. 이전 스택의 EBP를 저장 해두었다가 스택이 소멸하게 되면 EBP에 이전 스택의 Base point를 저장하여 이전 스택의 범위를 지정한다.
6. EIP에 대한 이야기를 하지 않았다. EIP는 현재 실행중인 위치를 저장하는 곳이다. 이 또한 레지스터의 내용에서 알 수 있다.
간단히 보면 아래와 같다.
stack frame에 정되는 정보를 정리하면
- 함수의 실행이 종료된 후 return 할 주소값 (RET)
- 자신을 호출한 함수의 stack frame 위치 (SFP)
- 매개변수
- 지역변수
- register 정보
- 등등....
'Programming' 카테고리의 다른 글
[Security/BOF] [Level 1] gate -> gremlin (0) | 2014.03.30 |
---|---|
[Security/BOF] [펌]shell code(쉘 코드) 만드는법 (0) | 2014.03.30 |
[OS] os architecture (0) | 2014.03.27 |
[OS] Multiprogramming (0) | 2014.03.16 |
[Security] Register (0) | 2014.03.14 |