본문 바로가기
보안 공부/Reversing

[리버싱] 스택 프레임과 함수 프롤로그/에필로그

by 그적 2019. 11. 1.

 

스택 메모리를 사용할 때 ESP, EBP, EIP 레지스터가 사용된다. 앞 전에 배웠던 레지스터들을 간단하게 정리하고 넘어가자.

  EIP 레지스터(Instruction Pointer) : 다음 실행할 명령어가 존재하는 메모리의 주소가 저장됨

  EBP 레지스터(Base Pointer) : 하나의 스택 프레임의 시작 지점 주소가 저장됨 (Bottom)
                                                  //새로운 함수가 호출되거나 실행 중이 함수가 종료되어 리턴될 때마다 값이 달라짐

  ESP 레지스터(Stack Pointer) : 하나의 스택 프레임의 끝 지점 주소가 저장됨 (Top)
                                                  //PUSH, POP명령에 따라서 ESP 값이 4byte씩 변함

--------------------------------------------------------------------------------------------------------------------------------------------------- 

스택이란?
 : 마지막에 저장한 데이터를 가장 먼저 꺼내는 후입 선출(LIFO : Last In First Out) 구조이다.

스택 메모리의 역할
 1. 함수 내의 지역 변수를 임시저장
 2. 함수 호출 시 매개변수 전달
 3. 복귀 주소 지정

스택프레임이란?
 : 함수 호출 시 할당되는 메모리 블록(지역변수 선언으로 할당됨), 함수 종료 시 호출 전에 저장해둔 주소로 복귀함

 

< 함수 프롤로그/에필로그 >

  PUSH ebp               //함수 시작 
  MOV ebp, esp        // 현재의 esp를 ebp에 저장 

    -(body부분)- 

  MOV esp, ebp        //저장해둔 ebp를 esp에 옮김 & esp정리 
  POP ebp                 //ebp반환, 함수 호출 전에 저장해둔 ebp 값으로 복원됨 
  RETN                      //함수 종료 

      >> (body부분)을 기준으로 앞부분을 함수의 프롤로그, 뒷부분을 함수의 에필로그라고 한다.

 

 1) 프롤로그
  : 함수가 호출될 때, 스택 프레임을 설정하는 과정
    위의 과정을 설명하면, ebp를 스택에 저장하고, 현재 esp를 ebp에 저장

 2) 에필로그
  : 스택 프레임을 소멸시키는 과정, leave 명령어와 ret 명령어를 사용
    MOV esp, ebp를 통해 sfp가 저장되어 있는 곳으로 스택 포인터를 맞추고, 해당 스택 포인터를 POP ebp, sfp를 통해 ebp에 빼내어 이전 함수의 ebp를 복원시킴

 에필로그에 관련한 자세한 내용은 추후에 작성하겠다. leave 명령어, ret 명령어에 관련한 내용이 더 존재함.

댓글