Windows Forensic/File System

[Digital Forensic] NTFS File System "Attribute Content" Analysis

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

2. Attribute Content

Attribute Content: Attribute Entry의 Attribute Header를 제외한 영역으로, Attribute Entry의 종류와 내용을 포함한다. 마지막 Attribute Entry의 Attribute Content 이후에는 해당 MFT Entry에서의 마지막 Attribute Entry 임을 알리는 End Marker(0xFF FF FF FF)가 존재한다.

 

아래는 Attribute Entry의 종류로, 이는 Attribute Content의 종류가 결정하며 두 값은 일치한다.

주의해야 할 부분으로는 NTFS는 속성 파일과 메타데이터 파일 이름 앞에 '$'표시를 한다. 그러나 속성 파일(ex: $FILE_NAME)의 경우 알파벳이 모두 대문자이고, 메타데이터 파일(ex: $LogFile)의 경우 이름에 소문자가 포함된다. 단, 메타데이터 파일의 경우 0번 째 파일인 $MFT파일은 예외 경우이다.

 

MFT Entry는 파일 생성시에 $STANDARD_INFORMATION, $FILE_NAME, $DATA의 세 가지 Attribute Entry는 기본으로 갖는다.

Attibute Value (Hex) Attribute Name Attribute Information
0x10 $STANDARD_INFORMATION 파일 MAC Time, 소유자 정보
0x20 $ATTRIBUTE_LIST 추가적인 Attribute List 정보 
0x30 $FILE_NAME 파일 이름(Unicode), MAC Time 정보
0x40 $VOLUME_VERSION 볼륨 정보
(Windows NT 1.2 버전만 존재) 
0x40 $OBJECT_ID 디렉터리 정보
(NTFS 3.0 이상)
0x50 $SECURITY_DESCRIPTOR 파일 접근 제어, 보안 정보
0x60 $VOLUME_NAME 볼륨 이름 정보
0x70 $VOLUME_INFORMATION 파일 시스템 버전, 플래그 정보
 0x80 $DATA 파일 내용
0x90 $INDEX_ROOT B-Tree의 Root Node 정보
0xA0 $INDEX_ALLOCATION B-Tree의 Root와 연결된 Node 정보
0xB0 $BITMAP $MFT와 Indexes의 할당 정보
0xC0 $SYMBOLIC_LINK Symbolic Link 정보
(Windows 2000 이상) 
0xC0 $REPARSE_POINT Symbolic Link의 reparse point 정보
(Windows 2000 이상)
0xD0 $EA_INFORMATION OS/2 응용 프로그램 호환성을 위해 사용
(HPFS) 
0xE0 $EA OS/2 응용 프로그램 호환성을 위해 사용
(HPFS)
 
0x100 $LOGGED_UTILITY_STREAM 암호화된 Attribute의 정보,  값 정보
(Windows 2000 이상)

 

 

 

Time Decode

8 Byte의 time 정보를 엔디안 변경 후 10진수로 변환하면, 100 나노 100 나노 초 단위의 정보가 된다. 정확한 날짜 계산은 계산된 100 나노초를 '1601년 01월 01일 00시 00분 00초'에서 더하면 된다.

 

아래는 파이썬 코드로 직접 날짜를 계산한 결과이다.

 

 

 

2 - 1. $STANDARD_INFORMATION (0x10)

$STANDARD_INFORMATION: MAC time, MFT Modified time, Flag, 소유자 정보

$STANDARD_INFORMATION
$STANDARD_INFORMATION

Size (Byte) Information
8 Created Time
8 Modified Time
8 MFT Modified Time
8 Last Accessed Time
2 Flags
0x0001: Read Only
0x0002: Hidden
0x0004: System
0x00006: Hidden + System
0x0040: Device
0x0080: Normal
0x0200: Sparse
0x0400: Reparse Point
0x0800: Compressed
0x4000 : Encrypted
8 Update Sequence Number (UCN)

 

 

 

2 - 2. $ATTRIBUTE_LIST (0x20)

$ATTRIBUTE_LIST: 해당 MFT Entry에 초과하여 담지 못하는 Attribute Entry의 집합의 위치 RunList 정보

 

저장에 필요한 Attribute Entry를 하나의 MFT Entry에 모두 담을 수 없을 때, Attribute Entry를 추가로 포함하기 위한 용도로 생성된다.

$ATTRIBUTE_LIST의 RunList가 가리키는 영역에 존재하는 Attribute Entry Field

Size (Byte) Information
4 Attribute Type
2 Length of Entry
1 Length of Name
1 Offset of Name
8 Start VCN
8 File Reference Address
2 Attribute ID
Dynamic Attribute Name

 

 

 

2 - 3. $FILE_NAME (0x30)

$FILE_NAME: 저장된 파일 or 디렉터리 이름 정보, 부모 디렉터리 MFT Entry Number, 논리 크기, Flags

 

File Name: 파일 이름 저장 시 UTF-16을 사용하기 때문에 문자당 2 Byte의 크기를 갖는다.

아래의 예시에서 Length of Name의 값이 '4'이므로, File Name의 크기는 8(4 x 2) Byte이고 문자는 4개를 사용한다.

'$: 0x00 24', 'M: 0x00 4D', 'F: 0x00 46', 'T: 0x00 54'

$FILE_NAME
$FILE_NAME

Size (Byte) Information
8 Created Time
8 Modified Time
8 MFT Modified Time
8 Last Accessed Time
8 Allocated Size of File
2 Flags
0x0001: Read Only
0x0002: Hidden
0x0004: System
0x00006: Hidden + System
0x0040: Device
0x0080: Normal
0x0200: Sparse
0x0400: Reparse Point
0x0800: Compressed
0x4000 : Encrypted
1 Length of Name
Length of Name x 2 File Name

 

 

 

2 - 4. $OBJECT_ID (0x40)

$OBJECT_ID: GUID 정보

$OBJECT_ID

 

 

 

2 - 5. $SECURITY_DESCRIPTOR (0x50)

$SECURITY_DESCRIPTOR: 파일 소유자 SID, Flag 정보

$SECURITY_DESCRIPTOR

 

 

 

2 - 6. $VOLUME_NAME (0x60)

$VOLUME_NAME: 볼륨 이름 정보

$VOLUME_NAME
$VOLUME_NAME

 

 

 

2 - 7. $VOLUME_INFORMATION (0x70)

$VOLUME_INFORMATION: 볼륨의 버전, Flag 정보

$VOLUME_INFORMATION
$VOLUME_INFORMATION

Size (Byte) Information
8 Reserved Area
1 Major Number
(주 버전 번호)
1 Minor Number
(보조 버전 번호)
2 Flags
0x0001: 불량
0x0002: $LogFile 크기 재조정
0x0004: 다음번 업그레이드 볼륨
0x0020: Object ID 복구
0x8000: chkdsk 의한 수정
4 Reserved Area

 

 

 

2 - 8. $DATA (0x80)

$DATA: Resident의 경우 파일 내용 정보, Non-Resident의 경우 RunList 정보

 

아래는 test.txt(빨간색) 파일을 저장한 모습이다. 내용은 'Info' 4 Byte이다. Resident Attribute Header에서 Attribute Content Size가 '0x04'(파란색) Byte인 점과 Attribute Content에서 'Info'(초록색)인 파일 내용을 확인할 수 있다.

$DATA

 

 

 

2 - 9. $INDEX_ROOT (0x90)

먼저 $INDEX_ROOT (0x90) 속성과 $INDEX_ALLOCATION (0xA0) 속성을 이해하기 위해서는 NTFS에서 사용하는 자료구조인 변형된 B-Tree라는 구조를 알아야 한다. 속성 설명의 흐름을 끊지 않기 위해 본 글의 맨 하단에 B-Tree에 대한 설명을 적어 놓았다.

 

$INDEX_ROOT: NTFS의 변형된 B-Tree의 Root Index Record 정보

 

$INDEX_ROOT의 Content는 Index Record Header(0x00 ~ 0F), Index Entry Header(0x10 ~ 1F), Index Entry(0x30 ~ ??), End of Index (0x(n-3) ~ n)의 네 가지 영역으로 나뉜다. 만약 하나의 Index Record가 여러 개의 Index Entry를 가질 경우, Index Entry 영역만 여러 개 생성된다.

 

아래의 예시로 해석해보면 다음과 같다.

Index Record Header: 디렉터리 사용, 파일 이름순으로 파일 정렬, Index Record 크기 4,096 Byte, Index Record 할당 클러스터 '1'

Index Entry Header: 자식 Index Record 존재 X

Index Entry: File Reference Address(0x01), Index Entry 크기(0x68), 이름(delete.png), 자식 Index Record의 위치

End of Index: 0xFF FF FF FF

$INDEX_ROOT
$INDEX_ROOT Field

Size (Byte) Information
0x00 ~ 0F ============== Index Record Header ==============
4 Type of Attribute in Index
(0x03: Directory)
4 Collaction Sorting Rule
(Index 정렬 순서)
(0x00: Binary)
(0x01: File Name)
(0x02: Unicode String)
(0x10: Usigned Long)
(0x11: SID)
(0x12: Hash)
(0x13: Multiple Unsigned Long)
4 Size of Each Index Record in Bytes
1 Size of Each Index Record in Cluster
3 Unused
0x10 ~ 1F ============== Index Entry Header ==============
4 Offset to Start of Index Entry List
4 Offset to End of Used Portion of Index Entry List
4 Offset to End of Allocated Index Entry List Buffer
4 Flags
0x00: 자식 Record 존재 X
0x01: 자식 Record 존재 O
0x20 ~ n-4 ================= Index Entry =================
8 File Reference Address for Filename
2 Length of This Entry
2 Length of Content
4 Flags
0x01: 자식 Record 존재 O
0x02: Record의 마지막 Entry
Dynamic SFILE_NAME Attribute
8 VCN of Child Node in $INDEX_ALLOCATION
0x(n-3) ~ n ================= End of Node =================
4 End of Node

 

 

 

2 - 10. $INDEX_ALLOCATION (0xA0)

$INDEX_ALLOCATION: NTFS의 변형된 B-Tree의 Index Record 정보

 

아래는 Commmon Attribute Header(빨간색), Non-Resident Attribute Header (초록색) (이름이 포함된: $I30), $INDEX_ALLOCATION(파란색)가 순차적으로 존재하는 경우이다.

아래의 경우에는 내용이 많아 RunList가 존재하는 경우이다. 416((0x24 x 8) + 128) 섹터로 이동해 본다.

$INDEX_ALLOCATION

 

$INDEX_ROOT의 Content는 Index Record Header(0x00 ~ 17), Index Entry Header(0x18 ~ 27), Index Entry(0x28 ~ ??), End of Index (0x(n-3) ~ n)의 네가지 영역으로 나뉜다. 만약 하나의 Index Record가 여러 개의 Index Entry를 가질 경우, Index Entry 영역만 여러 개 생성된다.

 

아래의 예시로 해석해 보면 다음과 같다.

Index Record Header(빨간색): Fixup Array의 시작 주소(0x28), Entries Num in Fixup Array(0x09)

Index Entry Header(초록색): Offset to Start of Index Entry List (0x40) (해당 위치에서) (실제 Index Entry 시작 주소 = 0x40 + 0x18), Offset to End of Used Portition of Index Entry List (0x6A0 = 1,696 byte) (512 x 3 + 160), Offset to End of Allocated Index Entry List Buffer (0xFE8 = 4,072 byte), Flags (0x00: 자식 Record 존재 X)

Fixup Array(파란색): 0x05

Index Entry 1(보라색): File Reference Address (0x04), Index Entry 크기(0x68), Parent File Reference Address(0x05), 파일 이름($AttrDef)

Index Entry 2(핑크색): File Reference Address (0x08), Index Entry 크기(0x68), Parent File Reference Address(0x05), 파일 이름($BadClus)

Index Entry 3(주황색): File Reference Address (0x06), Index Entry 크기(0x60), Parent File Reference Address(0x05), 파일 이름($Bitmap)

Index Entry 생략...

Index Entry n(하늘색): File Reference Address (0x01), Index Entry 크기(0x60), Parent File Reference Address(0x05), 파일 이름(test2)

$INDEX_ALLOCATION Field

Size (Byte) Information
0x00 ~ 1F ============== Index Record Header ==============
4 Signature
("INDX")
4 Offset to Fixup Array
4 Entries Number in Fixup Array
1 $LogFile Sequence Number (LSN)
3 The VCN of this record in the full index stream
0x18 ~ 2F ============== Index Entry Header ==============
4 Offset to Start of Index Entry List
4 Offset to End of Used Portion of Index Entry List
4 Offset to End of Allocated Index Entry List Buffer
4 Flags
0x00: 자식 Record 존재 X
0x01: 자식 Record 존재 O
0x28 ~ n-4 ================= Index Entry =================
8 File Reference Address for Filename
2 Length of This Entry
2 Length of Content
4 Flags
0x01: 자식 Record 존재 O
0x02: Record의 마지막 Entry
Dynamic SFILE_NAME Attribute
8 VCN of Child Node in $INDEX_ALLOCATION
0x(n-3) ~ n ================= End of Node =================
4 End of Node

 

 

 

2 - 11. $BITMAP (0xB0)

$BITMAP: 클러스터 할당(사용) 여부 정보

아래의 경우 데이터양이 많아 RunList가 2개 존재하는 모습으로, 697,120섹터로 이동해 본다. 697,120 = 696,992(0x01 54 54 x 8) + 128

$BITMAP

 

아래의 예시로 해석하면 다음과 같다. 단위는 LCN이다.

0xFF = 1111 1111 → 0 ~ 7 번째 클러스터 할당됨 (사용 중)

0xFF = 1111 1111 → 8 ~ 15 번째 클러스터 할당됨 (사용 중)

0x00 = 0000 0000 → 16 ~ 23 번째 클러스터 비할당됨 (비사용 중)

0xFF = 1111 1111 → 24 ~ 31 번째 클러스터 할당됨 (사용 중)

0xFF = 1111 1111 → 32 ~ 39 번째 클러스터 할당됨 (사용 중)

0x3F = 0011 1111 → 40 ~ 41 번째 클러스터 비할당됨 (비사용 중), 42 ~ 47 번째 클러스터 할당됨 (사용 중)

$BITMAP 정보
$BITMAP

 

 

 

2 - 16. $LOGGED_UTILITY_STREAM (0x100)

$LOGGED_UTILITY_STREAM: 암호화 방식의 이름, 암호화된 데이터의 RunList 정보

 

아래의 경우 EFS 암호화임을 확인할 수 있다.

$LOGGED_UTILITY_STREAM

 

 

 

B-Tree

NTFS는 B-Tree 자료구조를 사용한다. 그러나, 약간 변형된 B-Tree 자료구조를 사용한다는 특징이 있다.

 

B-Tree (Normal): 노드(Node)를 사용하여 트리 구조를 만들며 이때, 노드는 부모-자식 관계로 연결된다. 구조에서, 부모 노드가 없는 최상위 노드를 'Root Node'(50) 부르며, 반대로 자식 노드가 없는 가장 하단의 노드를 'Leaf Node'(20, 45, 75)라고 한다. 노드는 최대 개의 자식 노드를 가질 있으며, 이때 부모 노드보다 작은 값을 가진 노드는 왼쪽 자식으로, 부모 노드보다 값을 가진 노드는 오른쪽 자식으로 배치된다. 그렇기에 아래의 회색 노드의 범위는 35보다는 크고, 50보다는 작은 범위를 지녀야 한다.

아래는 일반적인 B-Tree의 구조를 그림으로 표현한 모습이다.

Normal B-Tree

 

NTFS의 변형된 B-Tree: NTFS의 변형된 B-Tree에서는 차이점으로 Index Record를 Node로 사용한다. 이때 하나의 Index Record에는 여러 개의 Index Entry가 포함된다. 또한 Index Record는 Index Entry의 끝을 표시하는 'End of Index'를 반드시 포함하여 Index Record에서 Index Entry가 종료됨을 알린다.

아래는 Index Record를 시각화 한 모습이다.

Index Record

 

NTFS의 변형된 B-Tree에서는 3개 이상의 자식 Index Record를 가질 수 있다. 자식 Index Record 수는 부모 Index Record의 'End of Index' 제외 n개의 'Index Entry'에서 1을 더한 n+1개의 자식 Index Record를 최대로 가질  있.

아래는 NTFS의 변형된 B-Tree 구조를 시각화 한 모습이다. 빨간색 영역은 Root Index Record로 Attribute의 $INDEX_ROOT (0x90)에 할당되며, 파란색 영역은 Index Record로 Attribute의 $INDEX_ALLOCATION(0xA0)에 할당된다.

 

추가적으로, B-Tree는 검색, 삽입, 삭제의 경우 모두 O(log N)의 시간 복잡도를 갖는다.

NTFS의 변형된 B-Tree

 

 

 

이전 글

[Digital Forensic] NTFS File System "MFT" Analysis

 

 

메인 글

[Digital Forensic] NTFS File System Detailed Analysis