Windows Forensic/File System

[Digital Forensic] NTFS File System "$LogFile" Analysis

DF_m@ster 2023. 12. 27. 17:54

$LogFile

$LogFile: NTFS의 로그 파일로, 로그에는 파일의 생성, 수정, 삭제와 같은 파일의 변경사항이 포함된다. MTF Entry의 세 번째(0x02)로 할당되는 파일이다.

 

$LogFile의 특징으로는 트랜잭션을 로그로 기록함으로써, NTFS의 무결성을 유지하는 데에 초점을 둔 로그 파일이라는 점이다. 특히, $LogFile Undo Redo 정보를 기록하여 시스템 충돌 또는 전원 장애 같은 예기치 않은 상황에서도 파일 시스템의 안정성과 일관성을 보장한다. Undo 정보는 시스템이 중단된 상태에서 이전 안정 상태로 돌아갈  있게 돕는 반면, Redo 정보는 중단된 작업을 완료하여 파일 시스템의 최신 상태로 업데이트하는  사용된다. 이러한 $LogFile로 NTFS는 데이터의 무결성과 안전성을 보장한다.

 

접근 방법으로는 $LogFile의 MFT Entry에서 $Data(0x80)의 RunList를 참조하여 접근한다.

 

$LogFile Structure

$LogFile은 크게 Restart Area(재시작 영역), Buffer Area(버퍼 영역), Common Page Area(일반 페이지 영역)으로 나뉜다. 이때, 버퍼 영역과 일반 페이지 영역의 합을 Logging Area(로깅 영역)이라고 부른다. $LogFile은 Page(각각의 네모 한 칸(예시: 회색))라는 4,096(0x1000) Byte의 크기로 고정된 데이터 단위를 사용하여 로그 레코드(하나의 완전한 로그 기록 집합)를 저장한다.

$LogFile Structure

 

Restart Area

Restart Area: 2개의 페이지로 이루어진 영역이다. 1번 페이지는 Restart Page, 2번 페이지는 Restart Page의 Back Up으로 1번 페이지와 내용이 동일하다.

 

Restart Page: Magic Number로 Restart를 의미하는 'RSTR'가 존재하고, Current LSN 정보를 이용해 로그 레코드 기록의 재시작을 돕는 페이지이다. Current LSN 정보는 NTFS가 새롭게 로그 레코드를 작성할 때 새롭게 작성해야 할 다음 레코드 영역으로의 접근을 돕는 중요한 역할을 한다. NTFS는 재시작 영역의 Current LSN 정보를 읽고 해당 LSN 정보를 가지고 있는 로그 레코드를 찾아 다음 레코드부터 새롭게 로그 레코드를 기록한다.

 

LSN($LogFile Sequence Number): $LogFile에서 새로운 로그 레코드를 기록할 때마다 증가시키는 숫자이다.

 

아래는 Restart Page의 구조로, 분석 시 중요한 부분을 표시해 두었다.

Offset Info
0x00 ~ 03 Magic Number
('RSTR')
0x30 ~ 37 Current LSN

 

 

 

Buffer Area

Buffer Area: 2개의 페이지로 이루어진 영역이다. 3번 페이지는 Buffer Page, 4번 페이지는 Buffer Page의 Back Up으로 3번 페이지와 내용이 동일하다.

 

Buffer Page: NTFS는 페이지를 기록할 때 일반 페이지에 바로 기록하는 것이 아니라 버퍼 페이지에 먼저 작성하고 페이지 작성이 완료되면 일반 페이지에 복사하여 기록한다. 이러한 이유로 Buffer Page의 구조와 Common Page의 구조는 완벽하게 동일하며, Buffer Page에는 마지막으로 기록된 로그 레코드의 페이지가 존재한다. 이러한 방법을 통해 NTFS는 보다 신속하게 로그를 기록한다. 

 

Buffer Page의 구조는 Common Page의 구조와 동일하므로, 아래의 Common Page를 설명하는 글에 구조를 분석해 두었다.

 

Common Page Area

Common Page Area: Common Page의 집합으로 이루어진 영역이다. 특징으로는 만약 일반 페이지 영역의 모든 페이지를 기록했다면 가장 오래된 기록(가장 초기의 기록) 페이지부터 순차적으로 덮어쓴다.

 

Common Page: 실제 주된 로그 내용을 담고 있는 페이지로 Common Page Header와 여러 개의 트랜잭션 레코드의 집합으로 이루어져 있다. 하나의 트랜잭션 레코드는 Checkpoint Record, Update Record, Commit Record로 이루어져 있고, 하나의 트랜잭션 레코드에는 여러 개의 Update Record가 포함된다. 아래는 Common Page와 Record의 큰 구조를 시각화 한 모습이다.

 

아래는 Common Page Header의 실제 구조이다.

Common Page Header
Common Page Header Field

Offset Info
0x00 ~ 03 Magic Number
('RCRD')
0x04 ~ 05 Update Sequence Offset
0x06 ~ 07 Update Sequence Count
0x08 ~ 0F Last LSN
0x18 ~ 19 Next Record Offset
0x20 ~ 27 Last End LSN

 

아래는 Record의 실제 구조이다.

연두색 영역은 하나의 완전한 전체 Record 영역이다. Redo Offset(0x28), Redo Length(0x58) 값은 해당 라인(0x60240 B0)에서 0x28 뒤(0x60240 D8)부터 0x58까지의 영역(파란색 영역)을 의미한다. 해당 영역에는 Parent File Reference Address와 File Name Length, File Name이 존재한다. Undo Op의 값이 0x00이므로 이는 Noop(No Operation)을 의미하며, Undo Offset은 Redo 영역(파란색 영역)의 바로 다음을 가리키지만 Undo Length가 0x00으로 내용이 존재하지 않는다. 

Record
Record Field

Offset Info
0x20 ~ 23 Record Type
(0x01: Update Record, Commit Record)
(0x02: Checkpoint Record)
0x28 ~ 29 Flags
0x00: 현재 레코드가 페이지 초과 X
 0x01: 현재 레코드가 페이지 초과 O
0x30 ~ 31 Redo Op
0x00: Noop(No Operation)
0x01: CompensationLoaRecord
0x02: IntialzeFleRecordseament
(MET Entry 신규 할당, 파일 생성)

0x03: DeallocatedFileRecordSegment
(MFT 레코드 파일기록 비활성화, 파일삭제)

0x04: WriteEndofFileRecordSegment
0x05: CreateAttribute (파일명 변경 시)
0x06: DeleteAttribute (파일명 변경 시)
0x07: UpdateResidentValue
(데이터 작성 시, Redo, Undo 모두 생성)

0x08: UpdateNonResidentValue
0x09: UpdateMappinaPairs
0x0A: Delete DirtyClusters
0х0В: SetNewAttributeSizes
0x0C: AddlindexEntrvRoot
(Root 디렉터리의 MFT 엔트리 $Index 속성에 인덱스 레코드 추가) (Deletelndex Entry Allocation(Root))

0x0D: SetindexEntryVenAllocation
0×0F: Update File NameRoot
0x12: UpdateFile Name Allocation
0x13: SetBitsInresidentBitMap
0x14: Update File Name Allocation
0x15: SetBitsinNonresidentBitMap
0x16: ClearBitsInNonresidentBitMap
0x19: Prepare Transaction
0x1A: Commit Transaction 
0x1B: ForgetTransaction  
0x1C: OpenNonresidentAttribute
0x1F: DirtyPage Table Dump
0x20: Transaction Table Dump 
0x21: UpdateRecordDataRoot 
0x32 ~ 33 Undo Op
(Redo Op와 동일)
0x34 ~ 35 Redo Offset
0x36 ~ 37 Redo Length
0x38 ~ 39 Undo Offset
0x3A ~ 3B Undo Length

 

 

 

다음 글

[Digital Forensic] NTFS File System "$J & ADS" Analysis

 

 

메인 글

[Digital Forensic] NTFS File System Detailed Analysis

 

 

 

 

Reference

https://www.dbpia.co.kr/journal/articleDetail?nodeId=NODE01916712

https://www.dbpia.co.kr/journal/articleDetail?nodeId=NODE08736972