오늘은 파일시스템 중, NTFS에 대해서 알아보도록 하겠습니다.
<NTFS란?>
NTFS는 Windows NT 3.1 이후부터 현재까지 사용하고 있는 파일시스템입니다.
크게 VBR, MFT, Data Area, 그리고 그림에는 표시되지 않았지만 Backup VBR로 이루어져있습니다.
당연하게도 VBR 손상에 대비해서 복구하기 위한 영역이 Backup VBR입니다.
이제 하나씩 알아보도록 하겠습니다.
<VBR>
이 파티션(볼륨)의 정보를 담고 있는 공간입니다.
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>
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>
NTFS의 신뢰성을 높이기 위해 고안된 8bytes 고정 크기 영역입니다.
MFT Entry 각 섹터 마지막 2bytes를 특정 시그니처로 대체 한 후 기존 값을 array에 나열하여 저장하는 방식입니다.
NTFS는 데이터를 디스크에 기록할 때 Fix up array를 사용합니다. 즉 원래의 섹터 종단값을 대체하고 데이터를 읽을때 원래 값으로 복원하는 방식을 사용함으로써 디스크의 손상, 오류를 예방합니다.
<Attribute Area>
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 구조를 발견할 수 있습니다.
첫 바이트를 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
(문제시 삭제. 틀린 부분이 있다면 댓글 주시면 감사하겠습니다)
'보안이론' 카테고리의 다른 글
[File System] FAT32 (0) | 2025.09.04 |
---|---|
파일 시스템과 MBR, VBR (2) | 2025.09.04 |
[Cryptography] 블럭 암호 운영 모드 ECB, CBC, CFB, OFB, CTR (0) | 2025.02.14 |
[Cryptography] 블럭암호 AES 원리, 안전성 (0) | 2025.02.14 |
[Cryptography] - 블럭암호 DES 원리, 취약점 (0) | 2025.02.13 |