악성코드 분석 (Malware Analysis)
필수 조치 (읽은 후 즉시 실행)
지금: ../field-journal/precedent-reverse.md 읽기 — 이 스킬의 작업이 승인된 일반 작업인지 확인
지금: 현재 작업이 이 스킬의 적용 범위에 해당하는지 확인
다음: ../tool-index.md 읽기, 도구 가용성과 실제 경로 확인
다음: 도구가 없으면 bootstrap을 호출하고, 경로를 추측하지 마십시오
실행: "워크플로우" 첫 번째 단계로 진입하여 실행, 확인 상태에 머물지 마십시오
YARA / Sigma / 샌드박스 / IOC 추출 / 안티-분석 대응
정적 + 동적 + 행위 삼위일체
적용 시나리오
- 악성코드 샘플 분석 (PE/ELF/Mach-O/APK/스크립트)
- YARA 규칙 작성 및 검증
- Sigma 행위 탐지 규칙 생성
- 샌드박스 자동화 분석 오케스트레이션
- IOC 추출 및 위협 인텔리전스
- 안티-분석 기술 탐지 및 우회
6단계 분석 워크플로우
1단계: 초기 분류 (Preliminary Triage)
file sample.exe
strings sample.exe | grep -i "http\|cmd\|powershell\|base64"
rabin2 -zz sample.exe
floss sample.exe
pecheck sample.exe
pescan sample.exe
diec sample.exe
sha256sum sample.exe
Triage MUST 체크리스트 (Issue #65):
□ 파일 유형: EXE / DLL / SYS / .NET / 스크립트(bat|ps1|vba) / 기타
□ 아키텍처 x86/x64/ARM; 패커 확인 (DIE 등) 및 컴파일 언어 단서
□ DLL/SYS: 임포트 테이블과 익스포트 테이블 병렬 확인 (2단계 철칙 참조)
□ .NET: 전통적인 IAT 없음 → dnSpy/IL/메타데이터 동등 앵커 사용 (2단계 참조)
□ 스크립트/매크로/DLL 특별 P0: nonpe-format-cookbook U–AV 참조 (E-batch-deobf / E-ps-decode / E-vba-pcode / E-dll-*)
1b단계: 패커 해제 및 IAT 처리 (패커 있을 때 · Issue #65)
□ 패커 없음 / .NET → 2단계로 이동
□ 패커 있음: 패커 해제 시도 (승인된 격리 환경) → IAT 복구 시도
- x86: ImportREC (또는 동등 도구); x64: Scylla (또는 동등 도구). 64비트에서 ImportREC 고집 금지
□ 【IAT 복구 철칙】 자동/반자동 복구 우선; 도구 오류 또는 복구 후 실행 불가:
- 즉시 정적 IAT 복구 중단
- MUST: E-iat-repair-fail 기록 (명령어, 도구, 현상)
- 3단계 동적으로 전환: API 중단점 (예: bp CreateFile) / 하드웨어 중단점 / 메모리 검색으로 임포트 포착
- 이는 임포트 테이블을 건너뛰는 것이 아님: 경로를 시도했고 증거를 기록함
□ 【패치 6】 패커 해제+IAT 복구 후 크래시/블루스크린 (CRC/크기 자체 검증 의심):
- 정적 파일 수정 포기; E-self-check-crash 기록 또는 E-iat-repair-fail에 포함
- 3단계 전환: CreateFile / GetFileSize / 해시 관련 API에 중단점 설정
□ 사용자 명령 실행 가능성 (§0.5): 패커 있을 때 사용자가 "패커 해제하지 말고 임포트 테이블 먼저 보기" 요청 → 차단 설명 + 확인 요청; 강제 시 quality=unreadable/packed 기록, 유의미한 IAT 분석 완료로 가장 금지
□ 사용자가 "IAT 복구 / 임포트 테이블 검사" 재실행 요청: MUST 지목된 단계 재실행 (또는 확인된 사전 협의 결과), 관련 없는 단계로 대체하여 완료 가장 금지
2단계: 정적 분석 (Static Analysis)
디스어셈블리/디컴파일:
□ IDA Pro / Ghidra: 심층 디컴파일
□ radare2: CLI 빠른 분석
□ x64dbg: Windows GUI 디버거
중점 분석 영역:
□ 진입점 (Entry Point) → 초기화 로직
□ 임포트 테이블 → API 용도 추론 (CreateRemoteThread=인젝션, CryptEncrypt=랜섬)
**MUST (철칙)**: rabin2 -i / IDA imports / pecheck 동등 명령어 실행, 임포트 테이블을 분류하여 증거(E-imports)에 요약한 후에야 3단계 진입 가능 (E-iat-repair-fail 기록 후 동적 우회 경로를 택한 경우 제외, 1b단계 참조)
분류는 최소한 다음을 포함: 네트워크 / 파일 / 암호화 / 프로세스 인젝션 / 레지스트리 / 기타 의심 API
파싱 실패 또는 테이블이 비어 있음: 실패 출력을 반드시 기록, 묵시적 건너뛰기 금지
**DLL/SYS**: 익스포트 테이블 증거(E-exports, `rabin2 -E` 또는 동등)도 병렬로 반드시 기록
**.NET**: 전통적인 IAT 없음 → dnSpy/IL/메타데이터/어셈블리 참조 및 민감 API 요약을 동등 앵커로 사용, E-imports / E-triage-imports 의미론적 슬롯에 기록
**깨끗한 임포트 테이블**: 기본 DLL만, 거의 비즈니스 API 없음 → 동적 로딩 의심(LoadLibrary/GetProcAddress) 반드시 명시, 3단계로 전환하여 메모리 API 포착 SHOULD; 해시 파싱 특징 보이면 → E-api-hash (패치 N)
**와이드 문자열 (T)**: ASCII 문자열에서 IOC 없음 → UTF-16도 반드시 시도 (strings -el / IDA unicode)
**서명 (F)**: 서명 있어도 SigCheck 반드시 실행; 위조/폐기된 서명은 위협 등급 낮추지 않음
사용자가 "임포트 테이블 검사 재실행" 요청: 본 항목을 반드시 재실행 (차단 시 먼저 실행 가능성 문의 협의), 다른 단계로 대체하여 완료 가장 금지
**고위험 API 조합 (패치 8)**: 테이블이 너무 길 때 악성 조합 클러스터 우선 출력 (예: FindWindow+WriteProcessMemory+CreateRemoteThread), 순수 시스템 기본 호출 노이즈 필터링
□ 리소스 섹션 → 임베디드 페이로드 (.rsrc 섹션)
□ 문자열 테이블 → URL/C2/파일 경로/Base64 blob
□ TLS 콜백 → 디버거 시작 전 실행
3단계: 샌드박스 동적 분석 (Sandbox Dynamic Analysis)
자동화 샌드박스:
□ Joe Sandbox / ANY.RUN / Triage: 상용 샌드박스
□ CAPE Sandbox: 오픈소스 + YARA 통합 (권장)
□ ASD Azul: 오픈소스 악성코드 분석 플랫폼 (2026년 새 출시)
□ Cuckoo Sandbox: 클래식 오픈소스 (점차 CAPE로 대체 중)
디버깅 시작 절차 (패치 7+10 · MUST 순서, 사용자 모드 디버거):
□ ① TLS 콜백 중단점 → ② 진입점 EP 중단점 → ③ 민감 API 중단점 → ④ ExitProcess/종료 경로 안전망 중단점
□ ExitProcess 트리거 시: 서둘러 재시작하지 말 것; 즉시 메모리 덤프, 경로를 증거에 기록 (패치 10)
모니터링 중점:
□ 프로세스 생성: CreateProcess / ShellExecute
□ 파일 작업: WriteFile → 랜섬? DeleteFile → Wiper?
□ 레지스트리: Run/RunOnce 지속성
□ 네트워크: HTTP/DNS → C2 통신
□ 메모리: VirtualAllocEx → 프로세스 인젝션
□ 서비스: CreateService → 지속성
□ IAT 복구 실패 / 자체 검증 크래시 샘플: 민감 API + CreateFile/GetFileSize 중단점 / 하드웨어 실행 중단점 / 메모리 검색
동작 없음 비상 분기 (MUST):
□ 샌드박스에서 동작 없음, 즉시 종료 또는 무한 대기 → 안티-디버깅/안티-가상머신 확인 (CPUID, 타이머, 환경 특징)
□ 하드웨어 중단점 우회, 탐지 지점 패치, 또는 물리 머신/더 높은 충실도 환경으로 전환 시도
□ "동작 없음 + 조건"을 증거에 기록; 조건 없이 "샘플 무해"로 작성 금지
시간 상자 (패치 9 · SHOULD 기본, 재정의 가능):
□ 정적 심층 분석 약 15분 내 중요 경로 없음 → 강제로 본 단계 동적으로 전환
□ 동적 단일 스텝 약 200개 명령어 내 악성 단서 없음 → 강제로 정적 문자열/교차 참조 재앵커로 복귀
안티-디버깅/난독화 우회 (Issue #65 A–T · reverse-engineering/anti-analysis.md 레시피 상세):
□ P0: CPUID / RDTSC / PEB / NtQueryInformationProcess → 탐지 지점 기록 후 실험실 우회 또는 환경 변경 (E-anti-debug-*)
□ P0: 깨끗한 IAT → API 해시 동적 해석 (bp GetProcAddress, E-api-hash)
□ P0: strings 비어 있음 → 문자열 복호화 루틴 + 와이드 문자열 UTF-16 (E-string-decrypt / E-wide-strings)
□ P0: 의심스러운 서명 → SigCheck; 유효하지 않거나 폐기된 서명은 위협 등급 낮추지 않음 (E-sig-forge)
□ P1: 프로세스 이름 스캔 / VEH / int3·DR / 중첩 섹션 / Overlay / .rsrc / Delay-Load
□ H/S 평탄화 및 불투명 술어 → ollvm-deobfuscation.md (여기에 긴 텍스트 복사하지 않음)
□ 우회 실패도 증거 기록; 안티-디버깅 종료 = 샘플 무해로 간주 금지
비 PE / 스크립트 / DLL 구멍 메우기 (Issue #65 U–AV · reverse-engineering/references/nonpe-format-cookbook.md 상세):
□ bat/cmd: SET 연결 복원 (U) → E-batch-deobf; UTF-16 BOM (V); REM/GOTO 범람 (W)
□ PowerShell: 다중 계층 Base64/Gzip (X) 증거 단계별 기록; IEX 연결/뒤집기 (Z)
□ VBA: 스톰핑/P-Code (AA); Chr/Base64 (AB); 자체 수정 매크로 (AC)
□ DLL: TLS+DllMain (AJ); 익스포트 비정상/익스포트 없음 (AK/AL); Delay-Load A–T R 참조 (AM); 사이드로딩/반사 (AO/AP)
□ JS/APK/드라이버: js-reverse / apk-reverse / kernel-driver-reverse + cookbook 라우팅, 여기에 긴 텍스트 복사하지 않음
4단계: YARA 규칙 작성 (YARA Rule Writing)
// 규칙 구조
rule MalwareFamily_Example {
meta:
description = "Example 악성코드 패밀리 탐지"
author = "분석자"
date = "2026-05"
severity = "high"
hash = "d41d8cd98f00b204e9800998ecf8427e"
mitre_id = "T1055" // Process Injection
strings:
// 문자열 매칭
$str1 = "C2_SERVER_URL" ascii wide
$str2 = "payload.dat" ascii
// 16진수 매칭
$hex1 = { 8B 45 ?? 50 FF 15 [4] 85 C0 }
// opcode 시퀀스: mov eax, [ebp-?]; push eax; call [import]; test eax, eax
// 정규식 매칭
$re1 = /https?:\/\/[a-z0-9.-]+\/[a-z]{3,8}\.php/ ascii
condition:
// 조합 조건
uint16(0) == 0x5A4D and // MZ 헤더
filesize < 500KB and
(2 of ($str*) or $hex1)
}
5단계: Sigma 규칙 생성 (Sigma Rule Generation)
title: CreateRemoteThread를 통한 의심스러운 프로세스 인젝션
id: 5a3d2c1b-1234-5678-9abc-def012345678
status: experimental
description: CreateRemoteThread를 사용하는 프로세스 인젝션 행위 탐지
author: 분석자
date: 2026/05/25
tags:
- attack.t1055
- attack.t1055.001
logsource:
category: process_creation
product: windows
detection:
selection:
Image|endswith: '\powershell.exe'
CommandLine|contains:
- 'CreateRemoteThread'
- 'VirtualAllocEx'
- 'WriteProcessMemory'
condition: selection
falsepositives:
- 정당한 디버깅 도구
level: high
6단계: IOC 추출 및 인텔리전스 (IOC Extraction & Intelligence)
IOC 유형 분류:
□ 네트워크 IOC:
- IP: C2 주소 (시효성 주의)
- Domain: DGA 알고리즘 생성 도메인 (rsnkfda.com, xpqmje.net)
- URL: 페이로드 호스팅 주소
- User-Agent: 사용자 정의 UA 문자열
□ 호스트 IOC:
- 파일 경로: %APPDATA%\Microsoft\Crypto\RSA\*.dat
- 레지스트리: HKCU\Software\Microsoft\Windows\CurrentVersion\Run\
- Mutex: Global\{GUID} 뮤텍스 이름
- 서비스 이름: 시스템 서비스로 위장한 이름
□ 행위 IOC:
- MITRE ATT&CK 기술 ID (T1055, T1003, T1571...)
- Sigma 규칙 → SIEM 통합
- YARA 규칙 → 엔드포인트 탐지
□ 정적 IOC:
- 컴파일 타임스탬프 (위조 가능)
- PDB 경로 (개발자 정보 포함)
- 섹션 이름 비정상 (비표준 .text/.data)
- 임포트 테이블 비정상 조합 (예: 랜섬웨어 CryptEncrypt + DeleteShadowCopies)
안티-분석 기술 빠른 참조
| 기술 | 탐지 방법 | YARA 특징 |
|---|
| 가상 머신 탐지 | WMI Win32_BIOS/VideoController/Processor | Win32_ 문자열 + 특정 벤더 이름 |
| 샌드박스 탐지 | 디스크 < 60GB, RAM < 2GB, 단일 코어 CPU | GlobalMemoryStatusEx 호출 패턴 |
| 디버거 탐지 | IsDebuggerPresent, CheckRemoteDebuggerPresent | PEB.BeingDebugged 오프셋 접근 |
| 타이밍 회피 | Sleep(300000) 후 악성 행위 실행 | NtDelayExecution 긴 인자 |
| 지리적 위치 탐지 | 키보드 레이아웃/시간대 확인 → CIS 국가 제외 | GetKeyboardLayoutList 호출 |
| 부모 프로세스 탐지 | explorer.exe vs cmd.exe | 프로세스 이름 문자열 비교 |
| API 직접 syscall | EDR 후크 우회 | syscall 명령어 + SSN 해석 |
멀티 에이전트 자동화 분석 (SentinelHive 아키텍처)
┌─────────────────────────────────────────────────┐
│ Hive Director │
│ (Claude Opus 오케스트레이션 + 중재) │
└──────┬──────┬──────┬──────┬──────┬───────┘
│ │ │ │ │
┌───┘ ┌───┘ ┌───┘ ┌───┘ ┌───┘
▼ ▼ ▼ ▼ ▼ ▼
Triage RE Behav Intel Detect Remed
신속 역컴파일 행위 위협 규칙 복구
분류 정적 동적 인텔 YARA 방안
Sigma
도구 체인
| 도구 | 용도 | 획득 |
|---|
| Ghidra / IDA Pro | 심층 디컴파일 | ghidra-sre.org |
| CAPE Sandbox | 오픈소스 악성코드 샌드박스 | GitHub: kevoreilly/CAPEv2 |
| ASD Azul | 대규모 자동화 분석 | GitHub: ASD |
| YARA | 패턴 매칭 규칙 엔진 | pip install yara-python |
| Sigma | SIEM 행위 탐지 규칙 | GitHub: SigmaHQ/sigma |
| FLOSS | 난독화 해제 문자열 추출 | pip install flare-floss |
| Detect It Easy | 패커/컴파일러 탐지 | GitHub: horsicq/Detect-It-Easy |
| pe-sieve | 프로세스 메모리 스캔 | GitHub: hasherezade/pe-sieve |
| VirusTotal API | 멀티 엔진 스캔 | virustotal.com |
| MalwareBazaar | 악성코드 샘플 라이브러리 | bazaar.abuse.ch |
참고 자료
references/yara-sigma-rules.md — YARA + Sigma 작성 방법론
references/sandbox-orchestration.md — 샌드박스 오케스트레이션 및 자동화
references/anti-analysis-techniques.md — 94가지 안티-분석 기술 탐지
../reverse-engineering/references/re-agent-workflow.md — IAT 철칙과 6단계 문 (Issue #65)
../reverse-engineering/anti-analysis.md — 에이전트 응답 레시피 A–T (안티-디버깅/난독화 우회)
../reverse-engineering/references/nonpe-format-cookbook.md — 비 PE/다중 형식 레시피 U–AV (스크립트/매크로/JS/드라이버/DLL/Android)
../reverse-engineering/references/ollvm-deobfuscation.md — 평탄화/불투명 술어 (H/S)
작업 완료 자체 점검 (완료 주장 전 MUST 통과)