C 언어나 C++로 작성된 함수는 리버싱 시 다음과 같은 프롤로그 / 에필로그 구조를 가짐.
push ebp ; 이전 EBP 저장 (현재 함수의 스택 프레임 시작)
mov ebp, esp ; EBP를 현재 스택 포인터 위치로 설정
sub esp, XX ; 지역 변수 공간 확보 (esp 감소)
; 함수 본문 ...
mov esp, ebp ; 스택 포인터 복원
pop ebp ; 이전 EBP 복원
ret ; 복귀 주소로 반환
스택은 후입선출(LIFO) 구조이며, 함수 호출 시 다음과 같은 요소들이 저장됨:
[고주소] ← 스택 상단
+---------------------+ ← 이전 EBP
| Return Address | ← 호출 복귀 주소 (RET 명령어로 복귀할 주소)
| Argument N |
| ... |
| Argument 1 |
+---------------------+
| Local Variable N | ← 함수 내부 지역 변수들 (EBP 기준으로 음수 오프셋)
| ... |
| Local Variable 1 |
+---------------------+ ← 현재 ESP 위치
[저주소] ← 스택 하단
ESP (Stack Pointer) 현재 스택의 가장 아래를 가리킴 (Top of Stack)
EBP (Base Pointer) 현재 함수의 스택 프레임 기준점
DOS Header (IMAGE_DOS_HEADER) -> 항상 MZ로 시작. e_lfanew에 PE Header 오프셋 저장
PE Header (IMAGE_NT_HEADERS) -> PE\0\0 시그니처 포함. 실행에 필요한 메타정보 포함
Section Table -> 실제 코드와 데이터가 들어있는 섹션들 (.text, .data, .rdata, .rsrc 등)
Optional Header Entry Point, ImageBase, Section Alignment 등의 필드 포함
Import Table -> 사용되는 외부 DLL 함수 목록 (kernel32.dll, user32.dll 등)
.text 실행 코드 (기계어)
.data 전역 변수 (읽기/쓰기 가능)
.rdata 읽기 전용 데이터 (문자열, 상수 등)
.rsrc 리소스 (아이콘, 이미지, 문자열 리소스 등)
실행이 시작되는 어셈블리 주소
Optional Header의 AddressOfEntryPoint에서 확인 가능
악성코드 분석, 크랙 지점 탐색, 실행 흐름 파악에 중요