리버싱 학습노트: 함수 호출 흐름 / 스택 구조 / PE 구조

m0ng·2025년 6월 16일

함수 호출 흐름 구조

C 언어나 C++로 작성된 함수는 리버싱 시 다음과 같은 프롤로그 / 에필로그 구조를 가짐.

기본 호출 구조

push ebp          ; 이전 EBP 저장 (현재 함수의 스택 프레임 시작)
mov ebp, esp      ; EBP를 현재 스택 포인터 위치로 설정
sub esp, XX       ; 지역 변수 공간 확보 (esp 감소)

; 함수 본문 ...

mov esp, ebp      ; 스택 포인터 복원
pop ebp           ; 이전 EBP 복원
ret               ; 복귀 주소로 반환

스택 구조 개념 (Stack Structure)

스택은 후입선출(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) 현재 함수의 스택 프레임 기준점

PE 구조 (Portable Executable Format)

  • PE는 Windows 실행 파일 구조로 .exe, .dll 파일 분석 시 중요함.

주요 구성

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	리소스 (아이콘, 이미지, 문자열 리소스 등)

Entry Point (진입점)

실행이 시작되는 어셈블리 주소

Optional Header의 AddressOfEntryPoint에서 확인 가능

악성코드 분석, 크랙 지점 탐색, 실행 흐름 파악에 중요

0개의 댓글