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 레지스터를 붙여준다.
디버거 화면
'Reversing > 리버싱 핵심 원리' 카테고리의 다른 글
[리버싱 핵심 원리] 3장, 리틀 엔디언 표기법 (0) | 2020.11.07 |
---|---|
[리버싱 핵심 원리] 8장, abex' crackme #2 분석 (0) | 2020.11.07 |
[리버싱 핵심 원리] 11장, Lena's Reversing for Newbies (0) | 2020.11.07 |
[리버싱 핵심 원리] 10장, 함수 호출 규약 (0) | 2020.11.07 |
[리버싱 핵심 원리] 15장, UPX 실행 압축된 notepad 디버깅 (0) | 2020.11.07 |