본문 바로가기

Reversing/▷ Study

Stack Frame(스택 프레임)

프로그램에서 선언되는 로컬 변수와 함수 호출에 사용되는 스택 프레임(Stack Frame)에 대해 공부


스택 프레임이란 ESP(스택 포인터)가 아닌 - EBP(베이스 포인터) 레지스터를 사용하여 스택 내의 로컬 변수, 파라미터, 복귀 주소에 접근하는 기법을 말한다.

ESP 레지스터의 값은 프로그램 안에서 수시로 변경되기 때문에 스택에 저장된 변수, 파라미터에 접근하고자 할 때 ESP 값을 기준으로 하면 프로그램을 만들기 힘들고, CPU가 정확한 위치를 참고할 때 어려움이 생긴다.

따라서 어떤 기준 시점(ex. 함수의 시작)의 ESP 값을 EBP에 저장하고 이를 함수 내에서 유지해주면 ESP값이 아무리 변하더라도 EBP를 기준으로 안전하게 해당 함수의 변수, 파라미터, 복귀 주소에 접근 가능


Stack Frame assembly example (스택프레임 어셈블리 예시)

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

PUSH ESP  ; 함수의 시작(EBP를 사용하기 전에 기존의 값을 스택의 저장)

MOV EBP, ESP  ; 현재의 ESP(스택포인터)를 EBP에 저장



---  ; 함수 본체 (여기서 ESP(스택포인터)가 변경 되더라도 EBP가 변경되지 않으므로 안전하게 

       로컬 변수와 파라미터를 액세스 가능)



MOV ESP, EBP  ; ESP를 정리(함수 시작했을 때의 값으로 복원)

POP EBP  ; 리턴되기 전에 저장해 놓았던 원래 EBP 값으로 복원

RETN 

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

'Reversing > ▷ Study' 카테고리의 다른 글

프로그램 실행구조  (0) 2017.03.15
어셈블리와 C언어의 포인터 구문 형식  (0) 2017.03.08
스택(Stack) 요약  (0) 2017.03.08
General Purpose Register (범용 레지스터)  (0) 2017.03.08
리버싱 기초(레지스터)  (0) 2017.01.03