본문 바로가기
Digital Forensic/파일 분석

NTFS의 $MFT(Master File Table) Entry Attributes(속성) 분석

by Study Ground 2021. 11. 15.

MFT Entry Attributes

이번에는 속성이라고도 할 수 있는, 'MFT Entry Attributes'에 대해서 알아보고자 한다.

 

모든 속성은 'Header'와 data stream이라고도 할 수 있는 'Content'로 이루어져 있다. 이러한 속성은 Fixup Arrary 이후 End Marker 앞까지 연속적으로 존재한다.

 

앞서 MFT Entry Header구조를 다루면서, 20~21바이트는 첫 attribute가 위치한 offset 값을 나타낸다고 하였다.

 

현재 다루고 있는 MFT 파일의 20~21바이트 주소엔 0x0038이라는 16진수 값이 있다. 즉, 화살표가 가리키는 38바이트('10')가 바로 첫 attribute의 시작이라는 것을 뜻한다.

 

MFT Entry Attribute의 속성 관련 내용

위 표에서 알 수 있듯이, MFT Entry Attribute 속성 항목 중엔 여러 가지가 있다. 보통의 경우 파일에 위 표의 모든 속성이 있진 않고, 주로 '$STANDARD_INFORMATION', '$FILE_NAME', '$DATA'만 있을 때가 많다. 따라서 모든 속성을 다 다루지 않고 이 3가지에 대해서만 알아볼 것인데, 특히 이 3가지 속성들에 담긴 내용이 분석 시 중요하게 활용되기에 뒤에서 이 3가지 속성을 자세히 다뤄볼 것이다. 

 

 

1) $STANDARD_INFORMATION

방금 앞서 '처음으로 속성이 시작되는 부분'을 다뤘는데, 사실 38바이트의 16진수 10은 속성의 시작이기도 하지만, $STANDARD_INFORMATION의 시작이기도 하다. 빨간색으로 표시된 부분이 바로 $STANDARD_INFORMATION의 영역이다.

 

또한 $STANDARD_INFORMATION은 이번 글의 맨 위에서 언급한 것처럼, 헤더와 속성 내용으로 구성되어 있다. 또한, Common Header 뒤에 Resident Header가 오는 것을 볼 수 있는데, 왜 이러한 지 뒤에서 설명할 것이다.

 

1.1) $STANDARD_INFORMATION Common Header

※ 아래 표에서 나타내는 범위는 시작 지점으로부터의 상대적인 범위이지 절대적인 offset을 의미하는 것이 아니다.

* 속성 타입: 해당 속성이 어떤 것인지 나타내는 값으로, $STANDARD_INFORMATION의 경우 0x10이 식별값이다.

** 전체 크기: 속성 헤더와 속성 내용을 합한 길이로, $STANDARD_INFORMATION이라면 보통 0x60으로 고정되어 있다. 이를 10진수로 변환하면 96인데, 그 이유는 해당 영역이 한 줄에 16개의 바이트로 된 6개의 line으로 이루어졌기 때문

*** Flags: 속성의 압축 및 암호화 여부, sparse 속성 여부 등

 - 0x0001: 읽기 전용(Read-Only)

 - 0x0002: 숨김 상태(Hidden)

 - 0x0004: 컴퓨터가 올바르게 작동하기 위한 중요 역할을 하는 시스템 파일(System)

 - 0x0020: 백업(Archive)

 - 0x0040: 장치(Device)

 - 0x0080: 일반(Normal)

 - 0x0100: 임시(Temporary)

 - 0x0200: 파일 내용 대부분이 0으로 이루어져있는 빈 파일(Sparse File)

 - 0x0400: 일종의 심볼릭 링크(Reparse Point)

 - 0x0800: 압축된 상태(Compressed)

 - 0x1000: 오프라인 저장소에 있음(Offline)

 - 0x2000: 인덱스 서비스나, 윈도우 검색 등에서 인덱싱 작업 제외(Not Content Indexed)

 - 0x4000: 암호화됨(Encrypted)

**** 속성 ID: 각 속성이 가지는 고유의 값

 

1.2) $STANDARD_INFORMATION Resident Header

* 속성 크기: 0x48은 10진수로 72인데, 이는 0x0050 ~ 0x0097바이트 범위의 72개 바이트를 의미

** 속성 내용 위치 값: 화살표가 가리키는 위치를 나타내는 값이고, 해당 범위에서의 상대적인 위치를 나타냄

*** Index Flag: 해당 항목의 값이 1일 경우, 인덱싱에 사용된다는 의미

 

Resident 타입은 data가 MFT Entry 크기(1,024바이트) 이하라서 해당 data가 MFT Entry 내부에 존재하는 특성이다. 또한, 위에서 다룬 것처럼 Resident Header는 Common Header 바로 뒤에 존재한다.

 

1.3) $STANDARD_INFORMATION Attribute Content

* Permission:

 - 0x0001: 읽기 전용(Read-Only)

 - 0x0002: 숨김 상태(Hidden)

 - 0x0004: 컴퓨터가 올바르게 작동하기 위한 중요 역할을 하는 시스템 파일(System)

 - 0x0020: 백업(Archive)

 - 0x0040: 장치(Device)

 - 0x0080: 일반(Normal)

 - 0x0100: 임시(Temporary)

 - 0x0200: 파일 내용 대부분이 0으로 이루어져있는 빈 파일(Sparse File)

 - 0x0400: 일종의 심볼릭 링크(Reparse Point)

 - 0x0800: 압축된 상태(Compressed)

 - 0x1000: 오프라인 저장소에 있음(Offline)

 - 0x2000: 인덱스 서비스나, 윈도우 검색 등에서 인덱싱 작업 제외(Not Content Indexed)

 - 0x4000: 암호화됨(Encrypted)

** 최대 버전 번호: 최대로 허용되는 파일의 버전 번호를 뜻하고, 0이면 해당 기능 비활성 상태

*** 버전 번호: 파일의 버전 번호를 담고 있고, 바로 위의 항목이 비활성이면 이 기능도 비활성 상태

**** 보안 ID(≠Windows SID): $Secure 파일의 인덱스로 사용되고, 파일 접근제어 적용 시 사용

***** 할당량: 사용자에게 허용된 할당량 중에서 이 파일이 차지하는 비중

****** 업데이트 순서 번호: $UsnJrnl에서 인덱스로 사용되는 값이고, 0이면 비활성 상태

 

현재 $STANDARD_INFORMATION에서 모든 시간값이 '5E A4 67 7C 69 E3 CA 01'으로 통일되어있는데, 아무튼 이 값을 시간 형식으로 변환해주는 툴을 이용해 복호화를 해보면 위처럼 형식화된 날짜로 변환이 되어 표시가 된다. 4가지의 시간 속성이 해당 시간으로 일치된 것으로 보아, 해당 시간은 포맷이 진행된 시간이라고 추측할 수 있다.

 

 

2) $FILE_NAME

위의 hex파일에 나와있는 것 처럼 시작 값이 0x30인 $FILE_NAME이 $STANDARD_INFORMATION 바로 다음에 이어진다.

 

$FILE_NAME도 마찬가지로 Common Header, Resident Header, Attribute Content로 구성되어 있다. 뒤에서 다루겠지만, resident/non-resident 여부를 가릴 수 있는 0x00A0의 값이 0x00이므로 $FILE_NAME은 resident 타입이다.

 

2.1) $FILE_NAME Common Header

※ 아래 표에서 나타내는 범위는 시작 지점으로부터의 상대적인 범위이지 절대적인 offset을 의미하는 것이 아니다.

* 속성 타입: 해당 속성이 어떤 것인지 나타내는 값으로, $FILE_NAME의 경우 0x30이 식별값이다.

** 전체 크기: 속성 헤더와 속성 내용을 합한 길이로, 현재 0x68로 나와있다. 이를 10진수로 변환하면 104이므로, $FILE_NAME의 영역은 총 104개의 바이트로 이루어졌다고 할 수 있다.

*** Flags: 속성의 압축 및 암호화 여부, sparse 속성 여부 등

- 0x0001: 읽기 전용(Read-Only)

- 0x0002: 숨김 상태(Hidden)

- 0x0004: 컴퓨터가 올바르게 작동하기 위한 중요 역할을 하는 시스템 파일(System)

- 0x0020: 백업(Archive)

- 0x0040: 장치(Device)

- 0x0080: 일반(Normal)

- 0x0100: 임시(Temporary)

- 0x0200: 파일 내용 대부분이 0으로 이루어져있는 빈 파일(Sparse File)

- 0x0400: 일종의 심볼릭 링크(Reparse Point)

- 0x0800: 압축된 상태(Compressed)

- 0x1000: 오프라인 저장소에 있음(Offline)

- 0x2000: 인덱스 서비스나, 윈도우 검색 등에서 인덱싱 작업 제외(Not Content Indexed)

- 0x4000: 암호화됨(Encrypted)

**** 속성 ID: 각 속성이 가지는 고유의 값

 

2.2) $FILE_NAME Resident Header

* 속성 크기: 0x4A10진수로 74인데, 이는 0x00B0 ~ 0x00F9바이트 범위의 74개 바이트를 의미(실질적인 속성 범위)

** 속성 내용 위치 값: 화살표가 가리키는 위치를 의미한다. 마찬가지로, 해당 범위에서의 상대적인 위치를 나타냄

*** Index Flag: 해당 항목의 값이 1일 경우, 인덱싱에 사용된다는 의미

 

2.3) $FILE_NAME Attribute Content

* 할당된 크기: 디스크에 할당된 공간이다.

** 실제 크기: 파일 content의 실제 크기를 의미한다.

*** EA & Reparse: EAExtended Attributes을 의미하고, Reparse는 일종의 심볼릭 링크를 의미한다.

**** Flags: 속성의 압축 및 암호화 여부, sparse 속성 여부 등

- 0x0001: 읽기 전용(Read-Only)

- 0x0002: 숨김 상태(Hidden)

- 0x0004: 컴퓨터가 올바르게 작동하기 위한 중요 역할을 하는 시스템 파일(System)

- 0x0020: 백업(Archive)

- 0x0040: 장치(Device)

- 0x0080: 일반(Normal)

- 0x0100: 임시(Temporary)

- 0x0200: 파일 내용 대부분이 0으로 이루어져있는 빈 파일(Sparse File)

- 0x0400: 일종의 심볼릭 링크(Reparse Point)

- 0x0800: 압축된 상태(Compressed)

- 0x1000: 오프라인 저장소에 있음(Offline)

- 0x2000: 인덱스 서비스나, 윈도우 검색 등에서 인덱싱 작업 제외(Not Content Indexed)

- 0x4000: 암호화됨(Encrypted)

***** 파일 이름 공간: OS 및 파일 시스템 별로 최대로 지정 가능한 파일명의 길이가 다르다. , 이는 파일 이름으로 사용될 수 있는 공간의 크기가 다르다는 의미와 같은데, 서로 다른 OS 및 파일 시스템간의 호환을 위해 존재하는 항목이다.

- 0x00: POSIX

- 0x01: Win32

- 0x02: DOS

- 0x03: Win32 & DOS

****** 파일 이름:

 

 

3) $DATA(non-resident인 경우)

$DATA는 말 그대로 파일의 내용을 나타내는 속성이다. 속성 맨 처음의 0x80이라는 값이 이 속성으로 하여금 $DATA라는 것을 알려주고 있다.

 

non-resident 형식의 경우 Common Header 뒤에 바로 내용이 이어진다

위에서 볼 수 있는 것처럼, $DATA는 위의 속성들보다 비교적 간단한 구조로 되어있다. 보라색으로 표시된 부분을 보면 0x01로 set된 것을 볼 수 있는데, 이는 $DATA 속성이 non-resident 형식이라는 것을 의미한다. 대부분의 파일은 $DATA의 크기가 크므로 non-resident로 이뤄진 것을 흔히 볼 수 있다.

 

3.1) $DATA Common Header

※ 아래 표에서 나타내는 범위는 시작 지점으로부터의 상대적인 범위이지 절대적인 offset을 의미하는 것이 아니다.

※ $DATA의 경우 resident/non-resident 여부 관계없이 속성의 처음 16바이트는 공통 헤더로 구성되어 있다.

* 속성 타입: 해당 속성이 어떤 것인지 나타내는 값, $DATA의 경우 0x80이 식별값이다.

** Flags: 속성의 압축 및 암호화 여부, sparse 속성 여부

- 0x0001: 읽기 전용(Read-Only)

- 0x0002: 숨김 상태(Hidden)

- 0x0004: 컴퓨터가 올바르게 작동하기 위한 중요 역할을 하는 시스템 파일(System)

- 0x0020: 백업(Archive)

- 0x0040: 장치(Device)

- 0x0080: 일반(Normal)

- 0x0100: 임시(Temporary)

- 0x0200: 파일 내용 대부분이 0으로 이루어져있는 빈 파일(Sparse File)

- 0x0400: 일종의 심볼릭 링크(Reparse Point)

- 0x0800: 압축된 상태(Compressed)

- 0x1000: 오프라인 저장소에 있음(Offline)

- 0x2000: 인덱스 서비스나, 윈도우 검색 등에서 인덱싱 작업 제외(Not Content Indexed)

- 0x4000: 암호화됨(Encrypted)

*** 속성 ID: 각 속성이 가지는 고유의 값

 

3.2) $DATA Non-Resident Header

Runlist: 파일 내부에 있는 연속적인 클러스터의 실행 리스트.

※ VCN(Virtual Cluster Number): 파일의 시작으로부터 상대적인 offset을 나타내는 값.

빨간색으로 표시된 offset의 0x0040은 0x33이라는 값이 있는 offset을 가리키고, 해당 위치가 바로 Runlist의 시작 위치이다.

 

3.3) $DATA Attribute Content