본문 바로가기

Reversing/Theory

Chapter 4. Stack

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