Chapter 4. Stack
1. Stack Memory
- 지역변수와 매개변수가 할당 되는 공간으로 함수를 빠져나가면 소멸되는 변수를 저장하는 Memory 공간
- 임시저장장소 또는 Buffer라고도 하며 Program이 실행되는 Runtime에 Memory의 Stack Area에 생성된다.
- Thread 단위로 Memory에 할당된다.
- Stack(Buffer)의 위치는 Memory상에 Random으로 생성된다.
- 시작위치는 대체로 비슷하거나 같은 위치에 생성되지만 해제된 Program을 재 시작해 Stack을 재할당한다고해서 같은 위치에서 생성되는 것을 보장할 순 없다.
- PUSH 명령어를 Data를 입력하고 POP 명령어를 이용해 제거한다.
- Algorithm의 Stack 구조와 같은 구조로 FILO(First In Last Out) 구조이다.
- FILO(First In Last Out)
· 먼저 들어간 Data가 가장 나중에 나오는 구조
- Stack Memory의 역할
· 지역 변수 저장(주목적)
· 함수의 전달 인자 저장
· 함수 호출 관련 정보
· 임시 Data Backup
· 운영체제가 필요할 때 사용
- Stack Memory의 특징
· Stack의 가장 밑 부분을 Bottom이라고 하고 가장 윗부분을 Top이라고 한다.
· Stack이 생성되고 나서 처음에 ESP(Extended Stack Pointer)는 Bottom 쪽에 가깝게 주소 값이 입력되어 있으며 Process가 시작된 직후 ESP와 EBP(Extended Base Pointer)의 값과 차이가 가장 적게 차이난다.
· PUSH 명령에 의해 Data가 Stack에 추가되면 ESP는 Stack의 Top에 가깝게 값이 움직인다.
· POP 명령에 의해 Stack에서 Data가 제거되면 ESP는 Stack의 Bottom에 가깝게 값이 움직인다.
2. Stack Frame
- EBP Register를 이용해 Stack(Buffer) 내의 지역 변수, 매개변수, Return Address에 접근하는 기법
- ESP Register를 이용하지 않고 EBP Register를 이용하는 이유
· ESP Register의 값은 Process가 진행되는 중에 수시로 변하기 때문에 ESP Register 값으로 Stack 내의 매개변수 접근하기는 쉽지 않다.
· EBP Register는 해당 Process 내의 함수가 끝나기 전까지는 변하지 않기 때문에 Stack 내의 매개변수에 보다 접근하기 쉽다.
- Function Prologue & Epilogue
· Prologue와 Epilogue는 각각 함수가 시작되면서 Stack Memory에 함수 Stack을 확보하고 해제하는 역할을 하는 부분이다.
· 함수가 호출되기 전 위치의 주소를 Backup 하고 EBP Register 값과 ESP Register 값을 이동시키고 Stack(Buffer)를 확보한 후 함수가 종료되기 전 ESP와 EBP 값을 함수가 호출되기 전으로 되돌리는 형식이다.
· Function Prologue
◦ 함수가 사용할 Stack Area를 확보하는 Code
◦ Stack Frame을 사용하는 경우 함수는 항상 Stack Frame Pointer를 설정하는 기계어 Code로 시작된다.
◦ Code의 예
▹ PUSH EBP : 함수를 호출한 것의 Stack Frame Pointer를 Backup하는 Code
▹ MOV EBP, ESP : 함수를 호출 당한 측(Callee)의 Stack Frame 기준점을 설정하는 Code
▹ SUB EBP, [Num] : 지역 변수를 위한 공간을 확보하는 Code
· Function Epilogue
◦ 함수가 사용한 Stack Area를 해제하는 Code
◦ Stack Frame을 사용하는 경우 함수는 끝 부분에 Stack Frame Pointer를 원래대로 복원하는 Code가 위치한다.
◦ Code의 예
▹ MOV ESP, EBP : 지역변수의 공간을 해제하는 Code로 지역변수가 존재할 시만 위치
▹ POP EBP : 미리 저장한 호출하는 측의 EBP(SFP)를 원래대로 복원하는 Code
- Assembly Code의 지역변수 접근
· 지역변수는 Stack 내에 존재하며 Assembly Code로 지역변수에 값을 입력하기 위해서는 EBP Register를 이용해 접근한다.
· 접근 명령어
Assembly Language | C Language |
DWORD PTR SS:[EBP-4] | *(DWORD*)(EBP-4) |
WORD PTR SS:[EBP-4] | *(WORD*)(EBP-4) |
BYTE PTR SS:[EBP-4] | *(BYTE*)(EBP-4) |
◦ SS(Stack Segment)
▹ Stack Segment를 뜻하며 Stack Memory의 값에 접근해야 하기 때문에 SS:[EBP-4]를 사용한다.
▹ 그 외의 Segment
▸ CS : Code Segment
▸ SS : Stack Segment
▸ DS : Data Segment
▸ ES : Extra Segment
▸ FS : Data Segment
▸ GS : Data Segment
'Reversing > Theory' 카테고리의 다른 글
Chapter 6. PE header I - PE Format (0) | 2015.08.16 |
---|---|
Chapter 5. Calling Convention (0) | 2015.08.16 |
Chapter 3. Memory & Assembly Language (0) | 2015.08.16 |
Chapter 2. Register & Byte Ordering (0) | 2015.08.16 |
Chapter 1. About Reverse Engineering (0) | 2015.08.16 |