Step 244. 윈도우 포렌식: 레지스트리, 이벤트 로그, 프리페치 — 실행 흔적의 보고를 뒤진다

Step 244. 윈도우 포렌식: 레지스트리, 이벤트 로그, 프리페치 — 실행 흔적의 보고를 뒤진다

Level 3 — CTF 실전과 공격 스킬 심화 | 난이도 ★★★☆☆ | 예상 소요 시간 3~4시간

전제: Step 11(레지스트리 탐구), Step 12(이벤트 로그) 완료. 두 챕터의 명령을 복습하며 "조사관의 눈"으로 다시 봅니다.

⚠️ 이 챕터의 실습은 내 랩·합법 플랫폼 전용입니다. 허가 없는 시스템에 적용하면 범죄입니다.

  • 준비물: 윈도우 PC, 파워쉘(일반 창과 관리자 창 둘 다). 오늘 실습은 전부 읽기입니다.
  • 주의: 레지스트리와 로그에는 개인의 사용 기록이 그대로 들어 있습니다. 남의 PC에서 이 조회를 하는 것은 정당한 조사 권한이 있을 때만 가능합니다. 오늘은 여러분 자신의 PC가 대상입니다.

"어제 밤 이 PC에서 악성 exe가 실행됐다"는 신고가 접수됐다고 합시다. 조사관은 무엇을 볼까요? 윈도우는 사용자의 행동을 사방에 기록해 둡니다 — 실행한 프로그램의 캐시(Prefetch), 실행 횟수와 마지막 실행 시각(UserAssist), 로그온과 서비스 설치(이벤트 로그). 침해 조사는 이 흔적들, 즉 아티팩트(artifact)를 엮어 "누가 언제 뭘 실행했나"를 재구성하는 일입니다. Step 11과 12에서 배운 레지스트리와 이벤트 로그를, 오늘은 포렌식의 관점으로 다시 엽니다.


1. 학습 목표

이 챕터를 끝내면 다음을 할 수 있습니다:

  • 아티팩트(artifact)라는 용어로 윈도우 실행 흔적 3종(프리페치, UserAssist, 이벤트 로그)을 설명한다
  • Prefetch의 동작 조건(EnablePrefetcher)과 저장 위치를 확인하고, 꺼져 있는 경우의 대안을 말한다
  • UserAssist 키를 열어 ROT13으로 감춰진 실행 기록을 직접 디코딩한다
  • 7045(서비스 설치), 4688(프로세스 생성), 4624/4625(로그온)의 조사 가치를 설명한다
  • 아티팩트 여러 개를 엮어 "실행 타임라인" 초안을 작성한다

2. 배경 지식 — 오늘의 도구와 개념

오늘의 도구 한눈에 보기

구분 내용
언어·환경 파워쉘 5.1 (일반 창 + 관리자 창), 레지스트리와 이벤트 로그 읽기
오늘의 명령어 Get-ChildItem C:\Windows\Prefetch, Get-ItemProperty ...\UserAssist\...\Count, ROT13 디코딩 함수, Get-WinEvent -FilterHashtable @{LogName='System'; Id=7045}
필요한 개념 아티팩트, 프리페치(Prefetch), UserAssist와 ROT13, 이벤트 ID 7045/4688/4624/4625, UTC와 로컬 시각

2-1. 아티팩트 — 행동이 남긴 흔적

포렌식에서 아티팩트(artifact)는 "행위의 결과로 시스템에 남은 흔적"을 말합니다. 지문이 손잡이에 남듯이, 프로그램 실행은 디스크와 레지스트리와 로그에 자국을 남깁니다.

중요한 성질이 두 가지 있습니다. 첫째, 아티팩트는 사용자가 의식해서 만든 것이 아닙니다 — 운영체제가 자기 필요(성능, 편의)로 자동 기록한 것입니다. 그래서 사용자가 지우는 걸 잊기 쉽고, 조사자에게는 오히려 믿을 만합니다. 둘째, 아티팩트 하나는 약하지만 여러 개가 같은 사건을 가리키면 강해집니다. 프리페치에 실행 흔적이 있고, 같은 시각에 UserAssist도 찍혀 있고, 로그에 프로세스 생성 이벤트도 있다면 — "실행됐다"는 결론이 세 겹으로 확인되는 것입니다.

2-2. 프리페치 — 실행한 프로그램의 캐시

프리페치(Prefetch)는 윈도우의 성능 기능입니다. 프로그램이 처음 10초간 읽는 파일들을 C:\Windows\Prefetch\프로그램명-해시.pf 파일에 기록해 두고, 다음 실행 때 미리 읽어서 빠르게 띄웁니다.

조사자의 눈으로 보면 이것은 "이 PC에서 실행된 적 있는 프로그램들의 명단"입니다. .pf 파일 안에는 실행 횟수와 마지막 실행 시각(UTC)도 들어 있습니다. "이 악성 exe가 실행된 적 있나?"라는 질문에 Prefetch 폴더를 먼저 뒤지는 이유입니다.

주의할 점: Prefetch는 설정이나 SSD 환경에 따라 꺼져 있을 수 있습니다. 오늘 첫 실습에서 켜져 있는지부터 확인합니다. 꺼져 있어도 좌절할 필요는 없습니다 — UserAssist와 이벤트 로그가 남아 있으니까요. 아티팩트는 한 개가 아니라 포트폴리오입니다.

2-3. UserAssist — ROT13으로 살짝 가린 실행 기록

레지스트리 HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist 아래에는 GUID 이름의 키들이 있고, 그 안의 Count 키에 사용자가 실행한 프로그램 기록이 쌓입니다. 실행 횟수, 마지막 실행 시각 등이 바이너리로 저장됩니다.

재미있는 점은 항목 이름이 ROT13으로 인코딩되어 있다는 것입니다. ROT13은 알파벳을 13글자씩 밀어 바꾸는 치환입니다 — A↔N, B↔O 같은 식이고, 두 번 적용하면 원래대로 돌아옵니다. 암호화라기보다 "훑어보는 사람에게 바로 읽히지 않게" 하는 수준의 가림막입니다. 오늘 이 가림막을 파워쉘 함수로 직접 벗겨 봅니다.

2-4. 이벤트 ID 확장 — 조사관의 단골 번호들

Step 12에서 4624(로그온 성공)와 4625(실패)를 배웠습니다. 오늘 두 개를 추가합니다:

이벤트 ID 로그 의미 조사 가치
7045 System 서비스가 설치됨 악성코드의 지속성 확보 단골 수법 — 모르는 서비스 설치는 적신호
4688 Security 프로세스 생성 "무엇이 실행됐나"의 정밀 기록 — 단, 기본값은 꺼져 있음(감사 정책으로 켜야 기록됨)
4624 Security 로그온 성공 Step 12 복습
4625 Security 로그온 실패 실패 다발 후 성공 = 무차별 대입 의심 패턴

7045는 System 로그라 일반 권한으로도 읽을 수 있습니다. 오늘 직접 실측합니다. 4624/4625/4688은 Security 로그라 관리자 권한이 필요합니다 — Step 12에서 배운 그 잠금입니다.

2-5. 시각의 함정 — UTC와 로컬 시간대

아티팩트마다 시각 기록 방식이 다릅니다. 프리페치와 UserAssist의 내부 타임스탬프는 UTC(협정 세계시) 기준인 경우가 많고, 이벤트 로그의 TimeCreated로컬 시각으로 변환되어 표시됩니다. 한국은 UTC+9입니다.

"프리페치엔 새벽 2시로 찍혔는데 이벤트 로그엔 오전 11시"라면, 같은 사건입니다(2 + 9 = 11). 이 변환을 모르면 타임라인이 9시간 어긋나서 서로 무관한 사건처럼 보입니다. 타임라인을 만들 때는 기준 시각을 하나로 정하고 모든 출처를 그 기준으로 환산하는 것이 철칙입니다.


3. 따라 하기

3-1. 프리페치가 켜져 있는가 — 설정부터 확인

프리페치 폴더를 열기 전에, 이 PC가 프리페치를 기록하는 설정인지 먼저 봅니다:

Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\PrefetchParameters" |
  Select-Object EnablePrefetcher
EnablePrefetcher
----------------
               3

(2026-09-09 실측.)

출력 읽는 법: 3은 "애플리케이션과 부팅 모두 프리페치"로 최대 활성 상태입니다(0=끔, 1=앱만, 2=부팅만, 3=둘 다). 이 PC는 프리페치 기록이 쌓이고 있다는 뜻입니다. 여러분 PC에서 0이 나오면 프리페치는 증거로 쓸 수 없고, UserAssist와 로그로 넘어가면 됩니다 — 그것도 조사 결과입니다.

3-2. 프리페치 폴더 열기 — 권한 장벽 실측

이제 폴더를 엽니다. 일반 창에서 먼저 해 보세요:

Get-ChildItem "C:\Windows\Prefetch" -Filter *.pf
Get-ChildItem : 'C:\Windows\Prefetch' 경로에 대한 액세스가 거부되었습니다.

(2026-09-09 일반 권한 창에서 실측.)

왜 막히는가: Prefetch 폴더는 관리자만 읽을 수 있습니다. 시스템 전체의 실행 기록이 모인 곳이라 보호 대상입니다. Step 12에서 Security 로그가 잠겨 있던 것과 같은 설계입니다.

관리자 창(시작 버튼 우클릭 → "터미널(관리자)")에서 다시 실행하면 .pf 파일들이 보입니다:

Mode    LastWriteTime          Name
----    -------------          ----
-a----  2026-09-09 오후 6:12   CHROME.EXE-7C4A9E1F.pf
-a----  2026-09-09 오후 6:09   NOTEPAD.EXE-D8414F97.pf
-a----  2026-09-09 오후 5:47   POWERSHELL.EXE-88B3C12A.pf
...

(출력 예시 — 관리자 창에서 직접 실행해 여러분 PC의 목록을 확인하세요. 이름 뒤의 8자리 16진수는 경로에서 계산된 해시로, 같은 이름의 다른 프로그램을 구별해 줍니다.)

왜 하는가: 이 목록이 "이 PC에서 실행된 프로그램"의 증거 명단입니다. 폴더 자체의 수정 시각도 실측으로 확인됩니다 — 실측 PC의 Prefetch 폴더는 마지막으로 오늘(2026-09-09) 저녁에 갱신되어 있었습니다. 지금 이 순간에도 기록이 쌓이고 있는 살아 있는 아티팩트입니다.

3-3. UserAssist — 가림막 뒤의 실행 기록

이번엔 일반 창에서도 되는 아티팩트입니다. 먼저 어떤 GUID 키들이 있는지 봅니다:

Get-ChildItem "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist" |
  Select-Object -ExpandProperty PSChildName
{9E04CAB2-CC14-11DF-BB8C-A2F1DED72085}
{A3D53349-6E61-4557-8FC7-0028EDCEEBF6}
{BCB48336-4DDD-48FF-BB0B-D3190DACB3E2}
{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}
{F4E57C4B-2036-45F0-A9AB-443BCFE33D9F}
{FA99DFC7-6AC2-453A-A5E2-5E2AFF4507BD}
...

(2026-09-09 실측. GUID 키 9개가 확인됐습니다.)

이 중 실행 기록의 본체는 {CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}입니다. 그 안의 Count 키를 열면 항목 수를 볼 수 있습니다:

$guid = "{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}"
$path = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\$guid\Count"
$props = Get-ItemProperty $path
$names = $props.PSObject.Properties.Name | Where-Object { $_ -notlike 'PS*' }
$names.Count
261

(2026-09-09 실측 — 이 PC에서 실행 기록 261건이 쌓여 있었습니다.)

그런데 항목 이름들을 그대로 찍어 보면 이렇게 나옵니다:

$names | Select-Object -First 4
HRZR_PGYPHNPbhag:pgbe
HRZR_PGYFRFFVBA
Zvpebfbsg.JvaqbjfPnyphyngbe_8jrxlo3q8oojr!Ncc
Zvpebfbsg.Cnvag_8jrxlo3q8oojr!Ncc

(2026-09-09 실측.) Zvpebfbsg.Cnvag — 뭔가 읽힐 듯 말 듯한 이 문자열이 ROT13으로 가려진 모습입니다.

3-4. ROT13 디코더 — 가림막 벗기기

ROT13은 규칙이 단순해서 파워쉘 함수로 직접 만들 수 있습니다. 대문자와 소문자를 각각 13글자씩 밀면 됩니다:

function Convert-Rot13([string]$s) {
  -join ($s.ToCharArray() | ForEach-Object {
    $c = [int]$_
    if ($c -ge 65 -and $c -le 90) { [char](($c - 65 + 13) % 26 + 65) }
    elseif ($c -ge 97 -and $c -le 122) { [char](($c - 97 + 13) % 26 + 97) }
    else { [char]$c }
  })
}
$names | Select-Object -First 4 | ForEach-Object { Convert-Rot13 $_ }
UEME_CTLCUACount:ctor
UEME_CTLSESSION
Microsoft.WindowsCalculator_8wekyb3d8bbwe!App
Microsoft.Paint_8wekyb3d8bbwe!App

(2026-09-09 실측.)

출력 읽는 법: Zvpebfbsg.CnvagMicrosoft.Paint(그림판)로 드러났습니다. 계산기, 그림판 — 이 PC에서 실행된 UWP 앱들의 기록입니다. UEME_로 시작하는 항목은 윈도우 내부 세션 정보이니 조사 대상에서는 제외하면 됩니다.

실행 파일만 골라 봅시다:

$names | ForEach-Object { Convert-Rot13 $_ } | Where-Object { $_ -match '\.exe' } |
  Select-Object -First 6
{7C5A40EF-A0FB-4BFC-874A-C0F2E0B9FA8E}\HNC\Office 2020\HOffice110\Bin\Hwp.exe
{6D809377-6AF0-444B-8957-A3773F02200E}\Kakao\KakaoTalk\KakaoTalk.exe
{1AC14E77-02E7-4E5D-B744-2EB1AE5198B7}\PickerHost.exe
{7C5A40EF-A0FB-4BFC-874A-C0F2E0B9FA8E}\Steam\Steam.exe
{1AC14E77-02E7-4E5D-B744-2EB1AE5198B7}\msiexec.exe
{1AC14E77-02E7-4E5D-B744-2EB1AE5198B7}\WindowsPowerShell\v1.0\powershell.exe

(2026-09-09 실측.)

출력 읽는 법: 경로 앞의 GUID는 드라이브 문자 대신 쓰는 알려진 폴더 ID입니다 — {1AC14E77...}C:\Windows\System32, {7C5A40EF...}Program Files에 대응됩니다. 한글(Hwp.exe), 카카오톡, 스팀, 그리고 방금 우리가 쓰고 있는 파워쉘까지 보입니다. 우리가 지금 한 실행이 즉시 증거로 남는 아티팩트라는 걸 눈으로 확인한 겁니다. 각 항목의 데이터(값의 내용)에는 실행 횟수와 마지막 실행 시각이 바이너리로 들어 있고, 실무에서는 이를 파싱하는 전용 도구를 씁니다(정리 절 참고).

3-5. 7045 — 서비스 설치 기록 보기

이벤트 로그로 넘어갑니다. 7045(서비스 설치)는 System 로그라 일반 창에서 됩니다:

Get-WinEvent -FilterHashtable @{LogName='System'; Id=7045} -MaxEvents 1 | Format-List TimeCreated, Message
TimeCreated : 2026-09-03 오후 4:39:40
Message     : A service was installed in the system.

              Service Name:  nProtect Online Security(PFS)
              Service File Name:  "C:\Program Files (x86)\INCAInternet\nProtect Online Security\nossvc.exe" /SVC
              Service Type:  사용자 모드 서비스
              Service Start Type:  자동 시작
              Service Account:  LocalSystem

(2026-09-09 실측.)

출력 읽는 법: 어떤 프로그램이 서비스(백그라운드 상주 프로세스)를 설치했고, 자동 시작으로 등록됐다는 기록입니다. 이 경우는 온라인 보안 프로그램이라 정체가 명확합니다. 실측 PC의 System 로그에는 7045가 총 16건 있었습니다.

왜 조사관이 7045를 보는가: 서비스 설치는 관리자 권한이 필요한 무거운 행위라 평소엔 드물게 일어납니다. 그런데 악성코드가 지속성을 확보하는 단골 수법이 바로 "자기를 서비스로 등록"하는 것입니다. 그래서 "모르는 서비스 설치 기록"은 곧바로 조사 대상입니다. 질문은 Step 11과 같습니다 — "이걸 내가 아는가? 설치한 기억이 있는가?"

3-6. Security 로그의 함정 — 같은 잠금, 다른 반응

4624/4625/4688은 Security 로그에 있어 관리자 권한이 필요합니다(Step 12). 그런데 조회 방식에 따라 실패 모습이 다르다는 걸 실측으로 확인해 두어야 합니다:

Get-WinEvent -LogName Security -MaxEvents 1
Get-WinEvent : 권한이 없는 작업을 수행하려고 했습니다.

(2026-09-09 일반 창 실측 — 명확한 권한 오류.)

그런데 FilterHashtable로 물으면:

Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4624} -MaxEvents 3
Get-WinEvent : 지정한 선택 조건과 일치하는 이벤트를 찾을 수 없습니다.

(2026-09-09 일반 창 실측 — 권한 오류가 아니라 "없다"는 안내가 나옵니다!)

왜 이게 함정인가: 권한이 없어서 못 읽는 것인데 "일치하는 이벤트가 없다"는 안내가 나오면, 조사자는 "로그온 기록이 0건이구나"로 오독할 수 있습니다. 권한 없는 조회의 빈 결과는 0건이 아닙니다. Security 로그 조사는 반드시 관리자 창임을 확인한 뒤에 하세요. 관리자 창이라면 3-6절 명령으로 4624/4625 기록이 정상적으로 나옵니다 — 확인 절차는 Step 12와 같습니다.

4688(프로세스 생성)은 한 겹 더 있습니다: 관리자 권한으로 읽을 수 있어도, 감사 정책에서 "프로세스 생성 감사"가 켜져 있어야 기록 자체가 존재합니다. 기본값은 꺼짐입니다. 그래서 침해 대응팀은 사고 전에 이 정책을 켜 두는 것을 표준으로 삼습니다 — "사고 후에 켜봤자 과거는 기록되어 있지 않다"가 이유입니다.

3-7. 종합 — "어제 밤 악성 exe 실행" 시나리오

신고로 돌아갑시다: "어제 밤 이 PC에서 update_helper.exe라는 수상한 파일이 실행됐다는 제보가 있다." 오늘 배운 아티팩트로 검증 계획을 세우면 이렇습니다:

  1. 프리페치(관리자 창): UPDATE_HELPER로 시작하는 .pf 파일이 있는가? 있으면 LastWriteTime이 어제 밤인가?
  2. UserAssist: ROT13 디코딩 목록에 그 이름이 있는가? (내 계정에서 실행됐다면 남습니다)
  3. 7045: 어제 밤 전후로 모르는 서비스가 설치됐는가?
  4. 4624/4625(관리자 창): 어제 밤 모르는 로그온이 있었는가?
  5. Run 키(Step 11): 지금 이 순간 지속성 등록이 남아 있는가?

하나라도 걸리면 그 시각을 중심으로 다른 아티팩트를 앞뒤로 훑어 타임라인을 넓힙니다. 전부 없으면 "이 증거들로는 실행을 확인할 수 없다"가 결론입니다 — 없다는 것도 조사 결과이고, 그때는 메모리 포렌식(Step 242)이나 디스크 카빙(Step 243)으로 넘어갑니다.


4. 미션과 연습문제

미션 — 내 PC 실행 타임라인 초안

오늘 배운 아티팩트로 내 PC의 최근 실행 기록을 한 장으로 정리하세요:

  1. UserAssist를 디코딩해 .exe 항목 10개를 뽑으세요 (3-3, 3-4절)
  2. 7045 최근 5건의 시각과 서비스 이름을 정리하세요 — 전부 정체를 설명할 수 있나요?
  3. 관리자 창에서 프리페치 .pf 최근 10개를 LastWriteTime과 함께 뽑으세요
  4. 세 목록에서 겹치는 프로그램을 찾아 보세요 — 같은 프로그램이 여러 아티팩트에 동시에 찍혀 있나요?
  5. 결과를 timeline-draft.txt에 저장하세요 (형식: "시각 | 아티팩트 | 내용" 한 줄씩)

연습문제

문제 1. 아티팩트가 "사용자가 의식해서 만든 기록"보다 조사에서 신뢰받는 이유를 설명해 보세요.

문제 2. EnablePrefetcher 값이 0인 PC를 조사하게 됐습니다. 프리페치 증거가 없을 때 대신 확인할 아티팩트 두 가지를 들고, 각각 어디에 있는지 말해 보세요.

문제 3. UserAssist 항목명 Zvpebfbsg.JvaqbjfAbgrcnq를 ROT13으로 디코딩하면 무엇이 되나요? (손으로라도 해 보세요 — 알파벳을 13글자 밉니다.)

문제 4. 일반 권한 창에서 Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4625}를 실행했더니 "일치하는 이벤트를 찾을 수 없습니다"가 나왔습니다. "로그온 실패가 0건"이라고 보고서에 써도 될까요? 이유를 설명하세요.


5. 모범 답안과 완료 기준

미션 모범 답안

# 1. UserAssist 디코딩
function Convert-Rot13([string]$s) {
  -join ($s.ToCharArray() | ForEach-Object {
    $c = [int]$_
    if ($c -ge 65 -and $c -le 90) { [char](($c - 65 + 13) % 26 + 65) }
    elseif ($c -ge 97 -and $c -le 122) { [char](($c - 97 + 13) % 26 + 97) }
    else { [char]$c }
  })
}
$guid = "{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}"
$names = (Get-ItemProperty "HKCU:\...\UserAssist\$guid\Count").PSObject.Properties.Name |
  Where-Object { $_ -notlike 'PS*' }
$names | ForEach-Object { Convert-Rot13 $_ } | Where-Object { $_ -match '\.exe' } |
  Select-Object -First 10 | Out-File timeline-draft.txt

# 2. 7045
Get-WinEvent -FilterHashtable @{LogName='System'; Id=7045} -MaxEvents 5 |
  Select-Object TimeCreated, @{n='Service';e={($_.Message -split "`n")[2]}} |
  Out-File timeline-draft.txt -Append

# 3. 프리페치 (관리자 창에서)
Get-ChildItem C:\Windows\Prefetch -Filter *.pf |
  Sort-Object LastWriteTime -Descending | Select-Object -First 10 Name, LastWriteTime |
  Out-File timeline-draft.txt -Append

정리 예시 (2026-09-09 실측 PC에서 확인된 형태):

UserAssist: KakaoTalk.exe, Hwp.exe, powershell.exe, Steam.exe ...
7045: 2026-09-03 nProtect Online Security(PFS) — 보안 프로그램, 설치 기억 있음
Prefetch: CHROME.EXE-..., NOTEPAD.EXE-... (관리자 창 확인)
겹침: (목록을 비교해 같은 프로그램을 찾아 밑줄)

검증하는 법: notepad timeline-draft.txt로 열어 세 아티팩트의 기록이 모두 들어 있는지 확인합니다. 7045의 각 서비스에 "설치 기억 있음 / 검색으로 정체 확인" 같은 주석이 달리면 완성입니다. 겹치는 프로그램을 찾았다면 — 그것이 "한 사건을 여러 아티팩트가 함께 증명한다"는 2-1절 원리의 실물입니다.

연습문제 해답

문제 1 해답. 아티팩트는 운영체제가 성능·편의 목적으로 자동 기록한 것이라 사용자가 조작하거나 지우는 걸 잊기 쉽습니다. 의도적 기록(문서, 메모)은 작성자가 꾸밀 수 있지만, 자동 기록은 "행동의 부산물"이라 위조가 어렵습니다. 단, 완전하지는 않으므로 여러 아티팩트의 교차 확인이 필요합니다.

문제 2 해답. UserAssist(HKCU\...\Explorer\UserAssist\{GUID}\Count — ROT13 디코딩 필요)와 이벤트 로그(System의 7045, 관리자 권한으로 Security의 4688 — 단 4688은 감사 정책이 켜져 있어야 존재)입니다. 그 외 Run 키 같은 지속성 아티팩트도 실행 정황을 보여 줍니다.

문제 3 해답. Microsoft.WindowsNotepad (메모장). Z→M, v→i, p→c, e→r, b→o, f→s, b→o, g→t 식으로 각 글자를 13칸씩 밀면 됩니다.

문제 4 해답. 안 됩니다 (2026-09-09 실측 확인). 일반 권한에서는 Security 로그 자체를 못 읽는데, FilterHashtable 방식은 권한 오류 대신 "일치하는 이벤트 없음" 안내를 냅니다. 즉 그 메시지는 "0건"이 아니라 "못 읽음"일 수 있습니다. 관리자 창에서 다시 조회해 실제 건수를 확인한 뒤에만 0건이라고 쓸 수 있습니다.

완료 기준 체크리스트

  • [ ] 아티팩트를 "행위가 남긴 자동 기록"으로 설명할 수 있다
  • [ ] EnablePrefetcher 값을 조회하고 0/1/2/3의 의미를 안다
  • [ ] 프리페치 폴더가 관리자 권한을 요구함을 안다 (일반 창에서의 거부 메시지 실측)
  • [ ] UserAssist의 {CEBFF5CD-ACE2-4F4F-9178-9926F41749EA} 키를 열어 ROT13 디코딩을 직접 해 봤다
  • [ ] 7045가 무엇을 기록하며 왜 악성코드 조사의 단골인지 설명할 수 있다
  • [ ] 4688은 감사 정책이 켜져 있어야 기록된다는 것을 안다
  • [ ] 권한 없는 FilterHashtable 조회의 "없음" 안내를 0건으로 오독하지 않는다
  • [ ] 미션: timeline-draft.txt를 완성했다

6. 흔한 실수와 해결

벽 1. 프리페치 폴더에서 액세스 거부

증상: 빨간 오류가 뜹니다 (2026-09-09 실측):

Get-ChildItem : 'C:\Windows\Prefetch' 경로에 대한 액세스가 거부되었습니다.

원인: Prefetch 폴더는 관리자만 읽을 수 있습니다. 오류 없이 빈 목록이 나오는 경우는 -ErrorAction SilentlyContinue를 붙였을 때입니다 — 거부됐는데 0개처럼 보이니 더 위험합니다.
해결: 관리자 창(시작 우클릭 → 터미널(관리자))에서 다시 실행하세요. 그리고 조사 스크립트에서 오류를 숨기는 옵션은 함부로 쓰지 마세요 — "거부"와 "없음"을 구분 못 하게 만듭니다.

벽 2. "일치하는 이벤트를 찾을 수 없습니다"를 0건으로 오독

증상: 일반 창에서 Security 로그를 FilterHashtable로 조회하니 "없다"고 나옵니다 (2026-09-09 실측).
원인: 이 방식은 권한 부족을 명확한 오류로 보여 주지 않는 경우가 있습니다. -LogName Security로 직접 물으면 "권한이 없는 작업을 수행하려고 했습니다"가 뜨는 것과 대조됩니다.
해결: Security 로그 조사 전에 창 제목에 "관리자"가 있는지부터 확인하세요. 빈 결과가 나오면 "권한 때문인가, 진짜 0건인가"를 항상 자문하는 습관을 들이세요.

벽 3. ROT13 디코딩 결과가 여전히 이상하다

증상: 디코딩했는데도 {7C5A40EF-A0FB-4BFC-874A-C0F2E0B9FA8E} 같은 GUID가 경로 앞에 붙어 있습니다.
원인: 고장이 아닙니다. 윈도우는 자주 쓰는 폴더(Program Files, System32 등)를 드라이브 문자 대신 알려진 폴더 GUID로 기록합니다. 디코딩은 성공한 것입니다 (2026-09-09 실측).
해결: {1AC14E77-02E7-4E5D-B744-2EB1AE5198B7}C:\Windows\System32, {7C5A40EF-...}Program Files로 읽으면 됩니다. GUID 전체 목록은 "Known Folder ID"로 검색하면 찾을 수 있습니다.

벽 4. 프리페치에 분명 있어야 할 프로그램이 없다

증상: 어제 실행한 프로그램의 .pf가 안 보입니다.
원인 셋 중 하나입니다: (1) EnablePrefetcher가 0으로 꺼져 있음 — 3-1절로 확인. (2) SSD 최적화 등으로 윈도우가 프리페치를 스스로 제한한 경우. (3) 해당 프로그램이 실행된 지 오래되어 1024개 한도에서 밀려남.
해결: 프리페치는 "있으면 강력하지만 없어도 무죄가 아닌" 아티팩트입니다. UserAssist와 이벤트 로그로 교차 확인하세요. 조사에서 "증거 부재"는 "부재의 증거"가 아닙니다.

벽 5. 프리페치 시각과 이벤트 로그 시각이 9시간 어긋난다

증상: 같은 사건인데 두 기록의 시각이 정확히 9시간 다릅니다.
원인: 한쪽은 UTC, 다른 쪽은 로컬 시각(한국은 UTC+9)입니다. 프리페치·UserAssist 내부 타임스탬프는 UTC인 경우가 많고, 이벤트 로그의 표시 시각은 로컬입니다.
해결: 타임라인을 만들 때 기준을 하나(보통 로컬)로 정하고 전부 환산하세요. 9시간 차이는 실수가 아니라 같은 사건을 두 표준으로 본 것입니다.


7. 정리

오늘의 개념

개념 한 줄 설명
아티팩트(artifact) 행위의 결과로 시스템에 자동으로 남는 흔적 — 포렌식의 증거 단위
프리페치(Prefetch) C:\Windows\Prefetch의 실행 캐시 — "실행된 적 있는 프로그램 명단" (관리자 필요)
UserAssist 레지스트리의 사용자별 실행 기록 — 이름은 ROT13으로 가려져 있음
ROT13 알파벳 13글자 밀기 치환 — 두 번 하면 원래대로, 가림막 수준의 인코딩
7045 / 4688 서비스 설치(System) / 프로세스 생성(Security, 감사 정책 필요)
UTC vs 로컬 아티팩트마다 시각 기준이 다름 — 타임라인 전에 환산 필수

오늘의 명령어

명령 하는 일
Get-ItemProperty ...\PrefetchParameters 프리페치 활성 여부(EnablePrefetcher) 확인
Get-ChildItem C:\Windows\Prefetch (관리자) 실행된 프로그램 .pf 목록
Get-ItemProperty ...\UserAssist\{GUID}\Count 실행 기록 항목 (ROT13 이름) 읽기
Convert-Rot13 (직접 만든 함수) UserAssist 항목명 디코딩
Get-WinEvent -FilterHashtable @{LogName='System'; Id=7045} 서비스 설치 기록 조회 (일반 권한 가능)
Get-WinEvent ... Id=4624/4625 (관리자) 로그온 성공/실패 기록 조회

명령어보다 중요한 감각

오늘의 핵심은 세 가지입니다. 첫째, 아티팩트는 포트폴리오입니다 — 프리페치가 없으면 UserAssist, 그것도 없으면 로그. 하나의 부재는 끝이 아니라 다음 아티팩트로의 이정표입니다. 둘째, "없다"는 결과를 의심하세요 — 권한 부족인지, 기능이 꺼져 있는지, 진짜 없는지는 전혀 다른 결론입니다. 셋째, 조사 질문은 변하지 않습니다 — "이걸 내가 아는가? 평소와 같은가?"

실무에서는 오늘 직접 만든 디코딩을 전용 도구가 대신해 줍니다 — Eric Zimmerman의 PECmd(프리페치 파서)와 EvtxECmd(이벤트 로그 파서)가 표준처럼 쓰이고, 실행 횟수·시각까지 표로 뽑아 줍니다. 원리는 전부 오늘 한 것과 같습니다. 도구가 편해질수록 "그 안에서 무슨 일이 일어나는지" 아는 사람이 결과를 제대로 읽습니다 — 오늘 그 바닥을 직접 만져 봤습니다.


전부 체크되면 Step 244 완료입니다. 사이드바의 체크박스를 눌러 진도를 저장하세요.