Forensic/파일-구조

NTFS(New Technology File System) File System Structure

Ron Weasley 2022. 7. 18. 14:46

저번 시간에는 FAT32 파일 시스템에 대해서 배워봤는데, 이번 시간에는 NTFS 파일시스템에 대해서 배워보겠습니다.

NTFS 파일시스템이란?

NTFS 파일시스템은 Windows NT의 등장으로 최초 서버용 파일시스템으로 등장했습니다. 그 전 개인용 운영체제를 사용했던 시기에는 FAT 파일시스템이 주로 사용되었지만, 용량의 한계에 있어 대용량 서버 운영체제인 Windows NT에 적합하지 않은 파일시스템이였기 때문에 다양한 기능, 뛰어난 확장성, 대용량 장치 지원을 지닌 파일시스템인 NTFS를 개발하였습니다.
 

NTFS Version

NTFS는 Windows NT 운영체제에 처음 사용된 이후, Windows 2000, XP, 7, 8 들을 거쳐 많은 운영체제에 사용되고 있는데, 운영체제마다 NTFS 버전이 다르기 때문에, NTFS 버전에 따른 운영체제는 다음과 같습니다.

NTFS Version

NTFS Cluster Size

운영체제 버전 및 볼륨의 크기에 따른 클러스터(=섹터의 집합) 크기를 알아 보겠습니다.

NTFS Cluster Size & Volume Size

NTFS File & Volume Maximum Size

NTFS가 가질 수 있는 최대 사이즈를 보겠습니다.

File & Volume Maximum Size in NTFS

NTFS 특징

지금부터 NTFS의 특징에 대해서 알아보겠습니다.
 
NTFS 파일시스템은 기존에 존재하던 파일시스템과는 다르게 중요한 설정 데이터 값(메타데이터) 들이 모두 파일의 형태로 저장되어 있습니다. FAT 파일시스템만 보더라도 일정한 위치의 구조체 레이아웃에 값이 들어가고, 그 값들을 참조하여 파일시스템 설정이 가능한 구조입니다. 하지만 NTFS는 설정 파일이 별도로 존재하며, 어디에 위치해도 무관합니다. 쉽게 말해서 볼륨 전체가 FAT 영역의 Data 영역처럼 할당이 가능합니다. NTFS에서 이 설정파일을 MFT라고 부르며 우리가 배워야 할 내용 중 가장 중요한 부분이기 때문에 $MFT 파일에 대한 것은 따로 포스팅을 할 예정입니다.
 
기능적인 특징은 다음과 같습니다.
- USN Journal : NTFS의 모든 파일 및 디렉터리의 변경 사항을 기록하는 로그 파일로 파일 이름 변경시간, 변경 타입 등 변경 사항에 대한 정보를 목록화하여 볼륨의 변경 여부를 확인할 때 사용한다. 또한 파일의 변경 내용을 기록한 이후 시스템 오류 발생으로 재부팅 될 경우 이 파일에서 롤백을 진행
 
- ADS(Alternate Data Stream) : NTFS는 파일명, 소유자, 시간정보 등을 "속성(Attribute)" 스트림을 통해 표현하며, 데이터 역시 하나의 스트림으로 표현된다. 일반적으로 파일 당 하나의 데이터 스트림을 사용하나, ADS는 하나의 파일이 하나 이상의 데이터를 저장할 수 있도록 지원하는 것
 
- Sparse 파일 : 파일의 데이터 대부분이 0으로 채워져 있는 경우, 해당 파일의 내용을 그대로 저장하지 않고, 크기 정보만을 담는 파일, 예를 들어 1MB의 파일에 처음 4KB를 제외한 나머지 데이터가 0으로 채워진 경우 모두 디스크에 저장하는 것은 비효율적이므로, 4KB의 정보만 저장하여 저장장치의 효율을 높여준다.
 
- 파일 압축 : NTFS는 파일시스템 수준의 압축을 지원하며, 압축 방식으로는 LZ77을 사용합니다. 하지만 MS에서는 압축기능 사용을 권장(x)
 
- VSS(Volume Shadow Copy) : Windows 2003부터 지원된 기능으로 새롭게 덮여씌여진 파일 및 디렉터리의 백업본을 유지하여 복구를 지원
 
- EFS(Encrypting File System, 암호화) : NTFS 상의 파일 및 디렉터리를 암호화하는 기능으로 CryptoAPI와 FSRTL(File System Run-Time Library)를 사용했으며, 빠른 암/복호화를 위해 FEK를 통한 대칭키 방식으로 암호화
 
- Scalability (확장성) : 클러스터 당 할당 용량이 4KB가 최적이지만, 최대 64KB까지 지원함. 그래서 최대 볼륨 사이즈가 256TB까지 가능
 
- Security (보안성) : 파일/디렉토리에 대한 권한 제어, 시스템 접근 작업에 대한 감사 등 보안 기능 제공
 
- Quotas (할당량) : 다중 사용자를 지원하는 환경에서 각 사용자의 디스크 사용량을 제한하는 기능
 
- 유니코드 지원 : 다국어 사용 가능
 
- 동적 배드 클러스터 할당 : 배드 섹터가 발생 했을 때 자동으로 클러스터를 재할당
 
- 대용량 지원 : 2TB가 넘는 대용량 볼륨을 이용 가능

NTFS 구조

NTFS의 구조는 VBR + MFT + Data Area로 구성되어 있습니다.

NTFS Structure

모든 데이터는 파일 형식으로 관리하고 있으며, VBR은 고정적으로 맨 앞에 위치하게 됩니다.MFT File은 일반적으로 VBR 이후에 존재하는데 이는 고정적이 아니라 변동적이므로 Data영역의 어느곳에 와도 무관합니다.
 

1. VBR (Volume Boot Record)

VBR은 파일시스템을 공부하다보면 자주 접하는데 NTFS 파일시스템으로 포맷된 파티션의 가장 앞부분에 위치하고 있는 영역입니다. VBR 영역에는 Boot Sector, NTLDR Location(부트 로더), Boot Code를 담고 있습니다.
 
VBR의 섹터 크기는 Cluster Size에 의해서 정해집니다.

NTFS VBR Size by Cluster Size

클러스터의 크기는 VBR에 존재하는 BPB 영역에서 0x0D~0x0D의 데이터 값으로 알 수 있습니다. (나중에 밑에서 설명)
평균 4KB의 Cluster Size를 가지고 있으며, Sector로는 8개입니다.
 
VBR의 구조를 보겠습니다.

디스크를 HxD로 열어보면 섹터 단위로 구성되어 있는 것을 볼 수 있습니다.
그 중, 0번 섹터는 부트 섹터이며, 남은 섹터는 NTLDR 위치 및 추가적인 부트 코드 정보를 담고 있습니다.

우측에 섹터 0번인 것을 볼 수 있습니다!!
 
다음은 VBR의 전체적인 구조를 보겠습니다.

여기서 가장 중요한 영역은 0x0B ~ 0x53에 나오는 BPB영역인데, BIOS Parameter Block의 약자로 다양한 정보를 가지고 있는 $MFT관련 정보가 들어있습니다. 그전에 Jump Command to Boot Code와 OEM ID부터 살펴보겠습니다.
 

1-1 Jump Command to Boot Code (0x00 ~ 0x02)

Jump Command to Boot Code는 CPU의 명령 실행 분기를 부트 코드로 옮기는 역할을 합니다.
각 파일시스템마다 값이 다르기 때문에 표로 정리를 해봤습니다.

지금부터 실습을 조금씩 해볼텐데, 제가 분석하고 있는 디스크는 NTFS 파일시스템으로 포맷팅되어 있으며 CPU Jump Command를 보겠습니다.

보시면, NTFS 파일시스템으로 포맷이 되어 있기 때문에 0번 섹터에서 0x9052EB의 값을 가지고 있습니다. 
 

1-2 OEM(Original Equipment Manufacturing) ID (0x03 ~ 0x0A, 8Byte)

OEM ID는 제조사 ID를 나타내는 영역인데, 위 실습하고 있는 예제파일은 NTFS와 공백을 표시하고 있습니다.
 

1-3 BPB (BIOS Parameter Block) (0x0B ~ 0x59, 78Byte)

파일 시스템에서 가장 중요하다고 할 수 있는 BPB영역입니다. 이 영역에는 $MFT 파일에 대한 정보들이 담겨있습니다.
예를 들어서 우리가 클러스터 당 섹터의 수를 확인하기 위해 0x0D ~ 0x0D 영역을 확인하여 클러스터 당 할당되는 섹터의 수를 확인할 수도 있습니다.
 
이제 더 자세히 보기 위해서 BPB 영역을 디테일하게 보겠습니다.

그리고 BPB 영역에 포함되어 있는 정보를 보겠습니다.

2. NTLDR Information & Boot Strap (NT Loader)

NTLDR Information & Boot Strap에서는 NTFS 부트 로더의 위치를 담고 있습니다.

위 그림에서 1번 섹터가 NTLDR입니다.
VBR에서는 부트 섹터와 NTLDR & Boot Strap이 있는데 이어져 있기 때문에 0번 섹터에서 부트 섹터가 나왔기 때문에 시그니처를 끝으로 나오는 영역이 NTLDR 영역이라고 생각하시면 될 것 같습니다.
 
남은 MFT 파일과 UsnJrnl, LogFile은 따로 다루도록 하겠습니다.