감자 텃밭

[시스템] epilogue [에필로그 과정] 본문

System/System Theory Information

[시스템] epilogue [에필로그 과정]

g2h 2021. 11. 18. 11:44

함수의 프롤로그가 있다면 에필로그도 있기 마련이죠

이번엔 함수 에필로그에 대해 다뤄보도록 하겠습니다.


우선 프롤로그 과정에서는 

push ebp

mov ebp, esp

과정을 통해 이루어집니다.

 

에필로그 과정에서는 2가지로 나뉘어 진행되게 됩니다.

우선 코드를 보시게 되면, 마지막에

leave

ret 

로 구성 되어 있는대 저 두개의 과정을 거치게 되는것이 에필로그입니다

 


우선 leave 부터 살펴보도록 하겠습니다.

"leave"

mov esp, ebp

pop ebp

 

leave는 위와 같은 구조로 되어있습니다.

mov를 통해 esp와 ebp의 위치를 같게 만들어 스택 상태를 정리해준다고 보시면 됩니다.

즉 스택에 존재하던 지역변수들을 정리해주는 과정입니다.

 

그 후 pop ebp를 통해 스택에 가장 위에 있던 값을 ebp에 넣게됩니다.

현재 스택상태를 정리해준 후 esp와 ebp의 위치가 같을경우 스택의 가장 위에 있는 값은

SFP가 됩니다. 그러므로 ebp에는 SFP가 들어가게 됩니다.

 

그림을 통해 상세히 알아보도록 하겠습니다

스택 상태는 위의 그림과 같이 존재하게됩니다 저상태에 스택 제일 상단에있는

SFP가 pop되고 ebp에 들어가게 됩니다.

sfp는 이전 함수의 ebp주소를 가지고 있게 됩니다.

 

이전 Stack Frame에서 설명드렸듯 SFP에는 이전 함수의 ebp의 주소가 저장되는데요

https://hg2lee.tistory.com/58?category=1240865

 

Stack Frame ?

What is Stack?? - Stack이란 프로그램이 실행되면 지역변수, 매개변수, 반환값 등이 저장되는 메모리 공간이다. 메모리 구조를 간략하게 설명하게 되면 실제 메모리 구조는 좀 더 복잡하게 되어있지

hg2lee.tistory.com

이 과정을 통해 현재 함수가 정리되며 ebp에는 이전 함수의 ebp가 저장되며 원래 함수의 ebp로 돌아갈 준비를 하는겁니다. 

 

 


이번에는 ret 부분에 대해 살펴보도록 하겠습니다.

"ret"

pop eip

jmp eip

위의 코드로들로 이루어져 있습니다.

 

이전 leave단계를 거쳐 현재 스택에는 아래 그림과 같이 ret만 남아있을겁니다.

esp는 스택 최 상단에 남아있는 ret를 가리키고 있을것이고

ebp는 이전 함수의 ebp주소가 담겨져있으니 이전 함수의 ebp로 돌아갔을겁니다.

 

이후 "ret" 단계를 처리합니다.

 

그럼 pop eip를 통해 ret를 eip에 넣게됩니다. ret는 함수가 끝나고 돌아갈 주소가 담겨져있을것이고

eip는 다음에 실행해야할 명령어를 저장하는 레지스터죠

그럼 다음에 실행할 명령어에 돌아갈 주소가 담겨져있게되며, jmp eip를 통해 eip로 이동되어

eip가 실행되며 ret에 저장되어있는 주소값을 찾아게 됩니다.

 

보통 main함수에서 여러 일들을 처리도중 함수를 호출하게되는대 이때 새로운 함수가

생성되며 Stack Frame가 생성되며 RET, SFP가 쌓이게 되겠죠?

그럼 RET에는 해당 함수가 끝나고 main으로 돌아갔을때 함수의 역할이 끝난 그 후 실행해야할 명령어의

주소가 담겨져 있게 되는겁니다.

 


해당 에필로그 부분은 FPO공격 기법등 여러 기법에 사용되므로 중요한 내용이라고 생각합니다.

 

더보기
  • mov ebp, esp를 통해 스택정리 후 ebp와 esp의 위치를 같게만듬 이로서 스택의 최상단에는 SFP 존재
  • pop ebp 를 통해 최상단에 있는 SFP를 ebp에 저장, ebp는 SFP에 담겨있는 이전함수의 ebp주소로 이동
  • pop eip 를 통해 최상단에 있는 ret를 eip에 저장
  • jmp eip를 통해 eip로 이동 eip에는 함수가 끝난후 이전 함수에서 다음 실행할 명령어의 위치가 담겨져있기에 자연스럽게 함수가 끝난 후 이전함수 명령어들이 수행됨

 

https://dokhakdubini.tistory.com/227?category=809542 (내용 참조)

'System > System Theory Information' 카테고리의 다른 글

[시스템] 리틀 에디안 방식  (0) 2021.11.20
[시스템] PLT 와 GOT [초급]  (1) 2021.11.19
[시스템] Prologue [프롤로그 과정]  (0) 2021.11.18
Stack Frame ?  (0) 2021.11.15
Buffer overflow ?  (0) 2021.11.15