본문 바로가기

Security/Pwnable

함수의 프롤로그와 에필로그

 

 

함수의 프롤로그와 에필로그를 알아보기 전에 몇 가지를 짚고 넘어가 보자!

 

 

 

 

 

먼저, 스택 프레임이란?

 

        한 함수가 호출되면 스택에는 함수의 매개변수, 호출이 끝난 뒤 돌아갈 주소,

함수에서 선언된 지역변수 등이 저장되는데,

그 영역을 그 함수의 스택 프레임이라 한다.

 

 

 

 

 

이 스택 프레임들은 함수가 종료되면 스택에서 제거되고

저장해놓았던 '함수를 호출한 지점(RET)'으로 돌아가는데,

미리 말하자면, 이를 에필로그라고 한다.

 

 

 

그림에 있는 EBPESP는 뭘까??

 

 

EBP스택 상의 한 데이터의 주소가 저장되어 있는 레지스터로, 

 

그 데이터 위부터 한 함수가 실행된 이후의 값들이 쌓인다.

즉, 그 함수의 시작 지점이라고 생각할 수 있으며,

따라서 함수가 종료되지 않는 한 

EBP 값은 변하지 않는다.

 

ESP스택의 맨 꼭대기의 주소가 저장되어 있는 레지스터로, ESP 값에서 push 또는 pop이 일어난다.

 

 

 

마지막으로 하나만 더 알아보자!!

 

EIP는 뭘까??

 

EIPCPU가 다음에 실행해야 할 명령어의 주소가 저장되어 있는 레지스터이다.

 

 

이제 함수의 프롤로그와 에필로그를 알기 위해 필요한 사전 지식은 끝났다!

 

 

그렇다면 함수의 프롤로그와 에필로그는 뭘까??

 

 

함수의 프롤로그함수 실행 준비과정으로

자신이 이제 시작할거라고 알리는 과정이다.

 

① push ebp

 

② mov ebp, esp

 

① push ebp : 함수가 종료된 후 ebp를 이전 함수의 ebp로 재설정하기 위해

스택에 이전 함수의 ebp를 push 한다.

 

② mov ebp, esp : 호출된 함수의 시작을 알리기 위해 현재 esp 값을 ebp에 복사한다.

 

 

 

이 두 명령을 실행하게 되면 그 이후에는 이제 함수내의 코드들이 실행되고

함수에서 선언된 지역변수 등이 저장되게 된다.

 

 

함수의 에필로그는 

함수 내에서의 수행을 마치고 처음 호출한 지점으로 돌아가기 위해 스택을 복원하는 과정으로,

 

다음 명령어들에 의해 수행된다.

 

① leave

 

mov esp, ebp

pop ebp

 

② ret

 

pop eip

jmp eip

 

이때,

①의 과정은 함수를 종료하고,

종료했으니 ebp를 이전 함수의 ebp로 재설정해주는 과정으로,

 

프롤로그와 반대로 진행된다.

 

(일단, esp에 ebp 값을 복사해줌으로써 함수를 종료해주고

현재 esp 값이 가리키고 있는 sfp를 pop하여 ebp에 넣어줌으로써

 이전 함수로 돌아가게 된다.)

 

 

 

②의 과정은 스택에 미리 저장해놓았던

return address(함수 종료 후 돌아갈 주소)를 eip에 넣어주고(pop eip)

그 주소로 이동해주어(jmp eip)

함수를 호출한 후의 명령을 계속 수행할 수 있도록 해주는 과정이다.

 

 

 

이제 함수의 프롤로그와 에필로그가 끝이났다!

 

에필로그 ②의 과정을 보면 함수가 종료된 후 스택에 저장되어 있는 return address로 이동하게 되는데

만약 return address에 악의적인 shellcode의 주소를 넣는다면!?

그 shellcode가 실행될 것이고 그렇다면 컴퓨터가 자신이 원하는대로 행동하게 할 수 있을 것이다!!!

 

이 점에 대해서는 차차 알아가보는걸로 하자!

 

 

 

끄-읕!

 

 

 

'Security > Pwnable' 카테고리의 다른 글

[FTZ] level 11 문제풀이  (0) 2020.02.25
[FTZ] level 9 문제풀이  (0) 2020.02.11
해쿨 핸드북 정리  (0) 2020.01.02