스택 프레임
스택 프레임이란 쉽게 말해 - ESP(스택 포인터)가 아닌 - EBP(베이스 포인터) 레지스터를 사용하여 스택 내의 로컬 변수, 파라미터, 복귀 주소에 접근하는 기법을 말한다.
ESP레지스터의 값은 프로그램 안에서 수시로 변경되기 때문에 스택에 저장된 변수, 파라미터에 접근하고자 할 때 EPS 값을 기준으로 하면 프로그램을 만들기 힘들고, CPU가 정확한 위치를 참고할 때 어려움이 있다.
따라서 어떤 기준 시점(함수 시작)의 ESP값을 EBP에 저장하고 이를 함수 내에서 유지해주면, ESP 값이 아무리 변하더라도 EBP를 기준으로 안전하게 해당 함수의 변수, 파라미터, 복귀 주소에 접근할 수 있다.
PUSH EBP ; 함수 시작(EBP를 사용하기 전에 기존의 값을 스택에 저장)
MOV EBP, ESP ; 현재의 ESP(스택 포인터)를 EBP에 저장
. . . ; 함수 본체
; 여기서 ESP가 변경되더라도 EBP가 변경되지 않으므로
; 안전하게 로컬변수와 파라미터를 액세스할 수 있음
MOV ESP, EBP ; ESP를 정리(함수 시작했을 떄의 값으로 복원시킴)
POP EBP ; 리턴되기 전에 저장해 놓았던 원래 EBP 값으로 복원
RETN ; 함수 종료
➜ 스택 프레임을 이용해서 함수 호출을 관리하면, 아무리 함수 호출 depth가 깊고 복잡해져도 스택을 완벽하게 관리할 수 있다.
📌 참고
- 최신 컴파일러는 최적화 옵션을 가지고 있어서 간단한 함수 같은 경우 스택 프레임을 생성하지 않는다.
- 스택에 복귀 주소가 저장된다는 점이 보안 취약점으로 작용할 수 있다. buffuer overflow 기법을 사용하여 복귀 주소가 저장된 스택 메로리를 의도적으로 다른 값으로 변경할 수 있다.
Reference
'Security > Reversing' 카테고리의 다른 글
[Reversing] 09. Process Explorer (0) | 2021.12.03 |
---|---|
[Reversing] 08. abex' crackme #2 (0) | 2021.12.03 |
[Reversing] 06. abex'crackme #1 분석 (0) | 2021.12.02 |
[Reversing] 05. 스택 (0) | 2021.11.26 |
[Reversing] 04. IA-32 Register 기본 설명 (0) | 2021.11.25 |