본문 바로가기
Reversing/리버싱 핵심 원리

[리버싱 핵심 원리] 7장, 스택 프레임

by Y06 2020. 11. 7.

07, 스택 프레임

 

 

 

- ESP는 수시로 변하기 때문에 스택에 저장되어진 변수, 파라미터에 접근하고자 할 때 ESP 값을 기준으로 하면 프로그램을 만들기 힘들고 CPU가 정확한 위치를 참고할 때 어려움이 있다.

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

- EBP 레지스터 베이스 포인터 역할

 

//스택 프레임의 구조
PUSH EBP                           ;함수 시작(EBP를 사용하기 전에 기존의 값을 스택에 저장)
MOV EBP, ESP                      ; 현재의 ESP(스택 포인터)를 EBP에 저장

...                                      ; 함수 본체
                                        ; 여기서 ESP가 변경되더라도 EBP가 변경되지 않으므로
                                        ; 안전하게 로컬 변수와 파라미터를 엑세스 할 수 있음

MOV ESP, EBP                     ; ESP를 정리(함수 시작했을 때의 값으로 복원시킴)
POP EBP                             ; 리턴되기 전에 저장해 놓았던 원래 EBP 값으로 복원
RETN                                 ; 함수 종료

스택 프레임을 이용해서 함수 호출을 관리하면, 함수 호출 DEPTH가 깊고 복잡해져도 스택을 완벽하게 관리 가능하다.

 

어셈블리와 C언어의 포인터 구문 형식

어셈블리 언어 C언어 Type casting
DWORD PTR SS;[EBP -4] *(DWORD*)(EBP -4) DWORD (4바이트)
WORD PTR SS;[EBP -4] *(WORD*)(EBP -4) WORD (2바이트)
BYTE PTR SS;[EBP -4] *(BYTE*)(EBP -4) BYTE

- EBP-4 주소에서 4바이트 크기의 메모리 내용

 

- Windows에서 세그먼트 메모리 모델(Segment Memory Model)을 사용하기 때문에 해당 메모리가 어떤 세그먼트에 소속되어 있는지 표시한다.

- 실제로는 32비트 Windows OS에서 SS(Stack Segment), DS(Data Segment), ES(Extra data Segment)의 값은 모두 0이다.

- EBP와 ESP는 스택을 가리키는 레지스터들이기 때문에 SS 레지스터를 붙여준다.

 

디버거 화면