보안이론

[File System] NTFS

은동동동 2025. 9. 4. 17:53

오늘은 파일시스템 중, NTFS에 대해서 알아보도록 하겠습니다. 

 

<NTFS란?>

NTFS는 Windows NT 3.1 이후부터 현재까지 사용하고 있는 파일시스템입니다.

출처 : https://digitalforensicmaster.tistory.com/entry/Digital-Forensic-NTFS-File-System-MFT-Analysis

크게 VBR, MFT, Data Area, 그리고 그림에는 표시되지 않았지만 Backup VBR로 이루어져있습니다.

당연하게도 VBR 손상에 대비해서 복구하기 위한 영역이 Backup VBR입니다.

이제 하나씩 알아보도록 하겠습니다.

 

<VBR>

이 파티션(볼륨)의 정보를 담고 있는 공간입니다.

출처 : https://x.com/angealbertini/status/590390451368263680/photo/1

Offset 크기 설명
3bytes Jump command
81bytes BPB(Bios Parameter Block)
426bytes 부트 코드
2bytes 시그니처 (0x55 0xAA로 고정)

BPB는 볼륨의 전반적인 설정을 포함하고 있는 부분으로 VBR에서 중요한 정보들을 살펴볼 수 있습니다.

  • OEM ID : NTFS로 고정
  • Total sector : 볼륨의 총 섹터수. 0x200을 곱하면 총 볼륨 크기를 구할 수 있다
  • MFT first cluster : 해당 값을 기반으로 MFT 영역을 찾아갈 수 있습니다.
  • Volume serial number : 볼륨을 식별할 수 있는 시리얼 넘버

<MFT>

MFT는 Meta File Table을 뜻하는 말로, 파일, 디렉토리 등의 메타 데이터가 저장되는 곳입니다.

쉽게 인덱싱이 가능하고 디스크 조각화를 최소화 할 수 있다는 장점이 있습니다.

MFT 시작 주소 계산법 = MFT first Cluster 값 * 0x1000

MFT 영역은 MFT 엔트리가 계속해서 반복되는 구조입니다. 엔트리 번호별로 뜻하는 메타데이터 파일들이 있습니다.

Entry 번호 설명
0번 $MFT
1번 $MFTMirr
2번 $LogFile
3번 $Volume
4번 $AttrDef
5번 .(Root directory)
6번 $Bitmap
7번 $Boot
8번 $BadClus
9번 $Secure
10번 $Upcase
11번 $Extend
12~23번 x(예약영역
24번 $Extend\$Quota
25번 $Extend\$Objld
26번 $Extend\$Reparse
27번~ -(regular file 시작)

 

 

<MFT - MFT Entry>

출처 : http://forensic-proof.com/archives/584

MFT 엔트리 0x1000의 크기를 가지며 다음과 같은 부분으로 구성되어 있습니다.

영역 설명
MFT Entry Header MFT Entry에 대한 메타데이터 저장
Fix up array NTFS의 신뢰성을 높이기 위한 구조
Attribute area 파일이름, 변경시각 등의 속성
End marker MFT Entry가 끝났음을 지시

 

<MFT-MFT Entry Header>

모든 MFT 앞 부분에 위치하는 영역으로 48바이트의 고정된 크기를 가집니다.

Offset 크기 설명 비고
4bytes Signature FILE로 고정
2bytes offset to fix up array  
2bytes fix up array의 엔트리수  
8bytes $LogFile의 sequence number  
2bytes sequence number  
2bytes Link count  
2bytes offset to first attribute attribute area로 찾아갈 수 있는 포인트
2bytes Flag MFT 엔트리 속성
4bytes Used size of MFT entry 실제 사용된 크기
4bytes allocated size of MFT Entry MFT 엔트리 크기 (0x1000)
8bytes File reference to base record  
2bytes Next attribute id  
2bytes Align to 4B boundary  
4bytes Number of this MFT Entry  

 

<MFT-Fix up array>

출처 : https://digitalforensicmaster.tistory.com/entry/Digital-Forensic-NTFS-File-System-MFT-Analysis

NTFS의 신뢰성을 높이기 위해 고안된 8bytes 고정 크기 영역입니다.

MFT Entry 각 섹터 마지막 2bytes를 특정 시그니처로 대체 한 후 기존 값을 array에 나열하여 저장하는 방식입니다.

NTFS는 데이터를 디스크에 기록할 때 Fix up array를 사용합니다. 즉 원래의 섹터 종단값을 대체하고 데이터를 읽을때 원래 값으로 복원하는 방식을 사용함으로써 디스크의 손상, 오류를 예방합니다.

 

<Attribute Area>

출처 : http://forensic-proof.com/archives/590

 

Attribute Area는 메타 파일들을 다양한 속성 정보로 나타내기 위한 가변 길이의 영역입니다. 속성 식별값을 나타내는 Attribute Header와 실제 속성 값을 가지는 Attribute content가 한쌍으로 이루어져 반복되는 구조를 가지게 됩니다. 이 구조는 End Marker가 존재할 때 까지 연속적으로 오게 됩니다.

16 (0x10) $STANDARD_INFORMATION 파일의 최근 생성,접근,수정 시간, 소유자 등의 일반적인 정보
32 (0x20) $ATTRIBUTE_LIST 속성들에 대한 리스트
48 (0x30) $FILE_NAME 파일 이름(유니코드), 최근 생성,접근.수정 시간
64 (0x40) $VOLUME_VERSION 볼륨 정보 (윈도우 NT 1.2 버전에만 존재)
64 (0x40) $OBJECT_ID 파일 및 디렉터리의 16바이트 고유값 (윈도우 2000+)
80 (0x50) $SECURITY_DESCRIPTOR 파일의 접근 제어와 보안 속성
96 (0x60) $VOLUME_NAME 볼륨 이름
112 (0x70) $VOLUME_INFORMATION 파일시스템 버전과 플래그 정보
128 (0x80) $DATA 파일 내용
144 (0x90) $INDEX_ROOT 인덱스 트리의 루트 노드 정보
160 (0xA0) $INDEX_ALLOCATION 인덱스 트리의 루트와 연결된 하위 노드 정보
176 (0xB0) $BITMAP $MFT의 비트맵 정보
192 (0xC0) $SYMBOLIC_LINK 심볼릭 링크 정보 (윈도우 2000+)
192 (0xC0) $REPARSE_POINT 심볼릭 링크에서 사용하는 Reparse point 정보 (윈도우 2000+)
208 (0xD0) $EA_INFORMATION OS/2 응용프로그램과 호환성을 위해 존재 (HPFS)
224 (0xE0) $EA OS/2 응용프로그램과 호환성을 위해 존재 (HPFS)
256 (0xF0) $LOGGED_UTILITY_STREAM 암호화된 속성의 정보와 키 값 (윈도우 2000+)

이런 속성은 크게 Resident Attribute와 Non-Resident 속성으로 나뉘게 됩니다.

  • Resident : Attribute content가 Attribute Header 바로 뒤에 위치
  • Non-Resident : Attribute content가 Attribute Header 바로 뒤에 위치하지 않음

대부분의 속성은 Resident이나, 속성의 크기가 너무 클 경우 바로 뒤에 저장되지 않을 수 있습니다. 이것을 Non-Resident라고 하고 이때 Attribute content 내부에는 할당받은 클러스터의 위치 정보가 저장되어 있습니다.

여기서 흥미로운점은 MFT는 메타데이터를 저장하기 위한 공간인데 $DATA처럼 실제 데이터도 저장되어 있을 수 있다는 점입니다! 이는 파일 크기가 작은 경우 파일의 데이터까지 저장될 수 있음을 나타냅니다. (700bytes 이하인 경우) 하지만 크기가 클 경우 Attribute content에는 클러스터의 위치가 저장되어 있고 Data area에서 그 내용을 확인해야 합니다.

 

<Data Area>

NTFS의 실제 데이터가 저장되는 영역입니다. 700bytes 이상인 경우 이 영역에서 파일의 데이터를 확인할 수 있습니다.

NTFS의 MFT $DATA 영역을 보면 실제 데이터를 담고 있는 오프셋을 가리키는 Cluster Run 구조를 발견할 수 있습니다.

http://forensic-proof.com/archives/590

첫 바이트를 4비트씩 나눠서 Run length와 Run offset의 크기를 나타내는 방식입니다.

  • Run Offset은 데이터가 저장되어 있는 볼륨의 클러스터 번호
  • Run length는 총 몇개의 클러스터에 데이터가 존재하는지 나타냄

 

참고자료

https://en.wikipedia.org/wiki/NTFS

http://forensic-proof.com/archives/584

http://forensic-proof.com/archives/590

https://digitalforensicmaster.tistory.com/entry/Digital-Forensic-NTFS-File-System-MFT-Analysis

(문제시 삭제. 틀린 부분이 있다면 댓글 주시면 감사하겠습니다)