ipwn
[Reversing] 함수 프롤로그, 함수 에필로그, 스택 프레임 본문
pop ebp 의 어셈블리어를 이용해 스택을 복원한다.
2. 스택 프레임
스택 프레임이란 ESP(스택 포인터)가 아닌 EBP(베이스 포인터)레지스터를 사용하여
스택 내의 로컬 변수, 파라미터, 복귀 주소에 접근하는 기법을 말한다.
ESP 레지스터는 스택 포인터 역할을 하고, EBP 레지스터는 베이스 포인터 역할을 합니다. ESP 레지스터의 값은
프로그램 안에서 수시로 변경되기 때문에 스택에 저장된 변수, 파라미터에 접근하고자 할 때 ESP 값을 기준으로 하면
프로그램을 만들기 어려워진다. 따라서 어떤 기준 시점(함수 시작)의 ESP 값을 EBP에 저장하고 이를 함수 내에서
유지해주면, ESP 값이 아무리 바뀌어도 EBP를 기준으로 안전하게 해당 함수의 변수, 파라미터, 복귀 주소에
접근할 수 있게 되는 것이다. 이러한 역할을 하는것이 EBP레지스터이다.
<스택 프레임의 구조>
스택 프레임을 어셈블리 언어로 보았을때 이런 구조로 되어 있다.
PUSH EBP | ; 함수시작(EBP를 사용하기 전에 초기 값을 스택에 저장) |
MOV EBP, ESP | ; 현재의 ESP를 EBP에 저장 |
|
|
... | ; 함수의 본체 |
; 여기서 ESP가 변경되더라도 EBP가 변경되지 않으므로 | |
; 안전하게 로컬변수와 파라미터를 엑세스할 수 있음 | |
|
|
MOV ESP, EBP | ; ESP를 정리(함수가 시작했을 때의 초기값으로 복원) |
POP EBP | ; 리턴되기 전에 저장해 놓았떤 원래 EBP 값으로 복원 |
RETN | ; 함수 종료 |
이런 식으로 스택 프레임을 이용해서 관리를 한다면 아무리 함수 호출이 복잡해져도 스택을 완벽하게 관리할 수 있게 된다.
'Reversing' 카테고리의 다른 글
[Reversing] 어셈블리어 (0) | 2018.01.08 |
---|