악성 코드 분석 - PE 파일 구조

SK Shieldus AI 사이버보안 부트캠프 | AI_31기

악성코드 분석 학습정리 — Part 2
PE(Portable Executable) 파일 구조

Windows 실행 파일의 내부 구조를 이해해야 악성코드를 분석할 수 있습니다. PE 구조의 모든 것을 정리합니다.

📦 PE 파일이란?

Windows에서 실행되는 모든 파일(.exe, .dll, .sys)은 PE(Portable Executable) 포맷을 따릅니다. PE 구조는 악성코드 분석의 가장 기본이 되는 지식으로, 이 구조를 모르면 정적 분석 자체가 불가능합니다.

PE 파일 = 책(Book)으로 비유하면 이해하기 쉽습니다.

책의 앞표지에는 제목·저자·ISBN이 있고 (DOS Header), 목차 페이지에는 각 챕터 위치가 있고 (섹션 헤더), 실제 내용이 챕터별로 나뉘어 있습니다 (섹션들). Windows는 이 "목차"를 읽어 파일을 메모리에 올리는 방법을 알아냅니다.

🏗️ PE 파일 구조 (메모리 레이아웃)
0x00 ~ 0x3F DOS Header MZ 시그니처(4D 5A)로 시작. e_lfanew 필드가 PE 헤더 위치를 가리킴
0x40 이후 DOS Stub "This program cannot be run in DOS mode" 출력 코드 (DOS 환경에서 실행 시 메시지 표시)
e_lfanew 위치 PE Signature "PE\0\0" (50 45 00 00) — 이 시그니처가 없으면 PE 파일이 아님
PE sig + 4 IMAGE_FILE_HEADER 컴파일 시간, 섹션 수, 아키텍처(x86=0x014C) 정보
FILE_HEADER 이후 IMAGE_OPTIONAL_HEADER 진입점(Entry Point), 이미지 크기, Subsystem, DataDirectory(IAT 위치 등)
.text .text 섹션 실행 코드가 저장된 섹션. 엔트로피가 낮아야 정상 (높으면 패킹 의심)
.rdata .rdata 섹션 읽기 전용 데이터, IAT(Import Address Table) 포함 — 분석의 핵심!
.data .data 섹션 전역 변수, 문자열 데이터 등이 저장됨
.rsrc .rsrc 섹션 리소스(아이콘, 문자열, 내장 파일 등). Dropper는 여기에 악성 파일을 숨김!

Dropper 분석 핵심: Lab01-04.exe의 경우 .rsrc 섹션의 BIN/101/1033 리소스 안에 또 다른 실행파일(MZ 시그니처 시작)이 숨겨져 있었습니다. Resource Hacker 도구로 이를 추출할 수 있습니다.

🔑 핵심 헤더 필드 분석
필드명 위치 의미 및 분석 활용
e_lfanew DOS Header 0x3C PE 헤더 시작 오프셋. HxD에서 이 값을 읽어 이후 오프셋 계산에 사용 (Ctrl+G로 이동)
Time Date Stamp FILE_HEADER 컴파일 시간. 위조 가능하므로 참고값으로만 활용
Subsystem e_lfanew + 0x5C 02 00 = GUI, 03 00 = Console. HxD에서 직접 수정 가능 (실습에서 직접 바꿔봄)
섹션 이름 각 Section Header UPX0/UPX1 → 패킹됨 / .text/.data → 정상 파일
엔트로피 pestudio에서 확인 7.0 이상이면 암호화·압축(패킹) 가능성 높음

엔트로피(Entropy)란?
데이터의 "무질서도"입니다. 일반 텍스트는 특정 문자가 반복되어 엔트로피가 낮고, 압축/암호화된 데이터는 모든 바이트가 랜덤하게 퍼져 엔트로피가 높습니다.
.text 섹션의 엔트로피가 7.0 이상이면 패킹 의심 — "이 책의 내용이 암호화되어 있구나"라고 생각하면 됩니다.

📡 IAT(Import Address Table) — 정적 분석의 핵심

IAT는 프로그램이 외부 DLL에서 빌려 쓰는 함수 목록입니다. 실행하지 않고도 악성코드의 기능을 예측하는 가장 강력한 단서로, 분석자라면 IAT부터 확인하는 것이 기본입니다.

IAT = 요리 재료 목록으로 생각하면 됩니다.
레시피에 "마취제, 독극물, 수면제"가 재료로 적혀있다면, 요리를 해보지 않아도 "이 음식은 위험하다"는 걸 알 수 있죠? IAT에 CreateRemoteThreadURLDownloadToFileA가 있다면, 실행 전에도 "이 파일은 원격 코드 실행이나 다운로드를 한다"고 예측할 수 있습니다.

KERNEL32.dll

CreateServiceA → 서비스 등록 (지속성 확보)
OpenSCManagerA → 서비스 관리자 접근
CreateRemoteThread → 프로세스 인젝션
FindResourceA + WriteFile → 리소스에서 파일 드롭
CreateMutexA → 중복 실행 방지 (뮤텍스 이름 = IOC)

ADVAPI32.dll

AdjustTokenPrivileges → 권한 상승 (SeDebugPrivilege)

WININET.dll

InternetOpenUrlA → C2 서버 HTTP 통신
URLDownloadToFileA → 외부에서 파일 다운로드

WS2_32.dll

(Ordinal 방식) → 소켓 통신 — 함수명 은닉 목적!
Ordinal(번호)로 임포트하면 함수 이름이 보이지 않아 분석이 어렵습니다. 이 자체가 분석 회피 기법입니다.

IAT 최소화 기법 주의: Lab03-01.exe는 IAT에 ExitProcess 하나만 명시되어 있었습니다. 나머지 함수는 실행 중 LoadLibrary + GetProcAddress로 동적 로드합니다. IAT가 거의 비어있다면 동적 분석으로 실제 API 호출을 관찰해야 합니다.

PE 구조 분석 핵심 원칙

1 MZ 시그니처(4D 5A)로 PE 파일 여부를 먼저 확인한다. .rsrc 섹션에서 MZ가 발견되면 Dropper를 의심한다.
2 섹션 이름이 UPX0/UPX1이거나 엔트로피가 7.0 이상이면 패킹된 파일이다 — 언패킹 후 재분석 필요.
3 IAT는 정적 분석의 핵심이다. 어떤 DLL의 어떤 함수를 사용하는지 보면 악성코드의 기능을 예측할 수 있다.
4 IAT가 비어있다면 동적 API 로딩을 의심한다. 이 경우 동적 분석으로 보완해야 한다.
📌 Part 2 핵심 요약
  • PE 파일 = Windows 실행 파일의 표준 포맷 (.exe, .dll, .sys 모두 해당)
  • DOS Header → PE Signature → FILE_HEADER → OPTIONAL_HEADER → 섹션들 순서
  • e_lfanew: PE 헤더 위치 알려주는 포인터 (HxD에서 0x3C 오프셋에 있음)
  • 엔트로피 7.0 이상 = 패킹 의심 / 섹션명 UPX0,UPX1 = UPX 패킹 확정
  • IAT = 함수 임포트 목록 = 악성코드 기능 예측의 최강 단서
  • IAT가 너무 적으면 동적 로드 기법 → 동적 분석으로 보완 필요