파일시스템 자체에 대한 설명은 FAT 파일시스템 알아보면서 언급한 부분이니까 NTFS에선 따로 설명하지 않겠습니당.
일단 NTFS를 디테일하게 알아보기 전에.. NTFS 이게 무엇인지, 어떤 특징을 갖고 있는지 간단하게 작성할 거예요.
1. NTFS 소개
New Technology File System의 약자로, Microsoft에서 만든 Windows용 파일시스템이다.
NTFS는 최초에 서버용 파일시스템으로 등장했다. FAT 파일시스템이 용량의 한계가 있어서 대용량 서버 운영체제(e.g. Windows NT 계열)에 적합하지 않았기 때문이다. 처음 나왔을 때는 다양한 기능, 뛰어난 확장성, 대용량장치 지원 등으로 인해 획기적인 파일시스템으로 평가받았다.(받았다! 과거형이다.)
어쨋든 대부분의 Windows 운영체제 및 일부 Linux/UNIX 운영체제에서 사용하는 파일시스템 이므로 파일시스템 포렌식에서 가장 중요한 위치에 있는 놈이다.
MS에서는 NTFS의 진화형인 ReFS(Resilient File System)를 개발하고 계속해서 연구개발 중이지만 여전히 NTFS가 많이 쓰인다.
1993년 최초로 NTFS v1.0이 나온 이후로 v1.1, v1.2, v3.0 그리고 현재 v3.1 까지 버전 업데이트가 되었다.
2. NTFS 특징
NTFS 파일시스템은 기존 여타 파일시스템과 다르게 중요한 설정 데이터 값들이 모두 파일 형태로 할당된다. FAT 파일시스템 같은 경우만 봐도 일정한 위치의 구조체 레이아웃에 값들이 들어가고, 그 값들을 참조하여 파일시스템 설정이 가능한 구조이다. 하지만 NTFS는 설정 파일이 별도로 존재하며, 그 파일은 볼륨 어디에 위치해도 상관없다. 즉, 볼륨 전체가 FAT의 Data 영역처럼 할당가능한 영역으로 된다는 것이다. 별도로 존재하는 그 설정파일을 MFT(Master File Table) 이라고 부르며, NTFS 구조 중 가장 중요한 부분이라고 할 수 있다.
기능적인 부분에도 여러가지 특징이 있는데 아래 한번 나열해 보겠습니당.
- Scalability (확장성) : 클러스터 당 할당용량이 4KB가 최적이지만, 최대 64KB까지 지원한다. 즉, 최대 볼륨 사이즈가 256TB까지 가능
- Journaling (USN 저널링) : 파일의 변동사항을 따로 기록하여 예외 발생으로 시스템 종료되었을 시에 처리 중이던 작업을 보호하는 기능
- Alternate Data Streams (ADS) : 다중 데이터 스트림 지원
- File Compression (파일 압축) : LZNT1 알고리즘을 이용한 파일 압축 (MS에서 압축기능 사용을 추천하진 않음)
- Sparse files (스파스 파일) : 실제 데이터가 기록되지 않은 메타데이터만 존재하는 파일 지원
- VSS (Volume Shadow Copy Service) : 파일/디렉토리의 쓰기 작업 이전의 데이터를 백업 및 복원할 수 있게 해주는 기능
- Security (보안성) : 파일/디렉토리에 대한 권한 제어, 시스템 접근 작업에 대한 감사 등 보안 기능 제공
- Encryption (암호화) : EFS(Encrypting File System) 이라는 볼륨 암호화 기능 제공
- Quotas (할당량) : 사용자 각각에 디스크 할당량 조정 가능
- Supporting Unicode
- and so on ..
NTFS 구조에 대해 하나씩 알아봅시다. 먼저 전체적인 구조를 볼까요.
이번 포스트에선 대략적인 NTFS 전체구조와 VBR(Volume Boot Record)영역까지 알아볼 거에용
3. NTFS 전체 구조
일단 대략적으로 전체 구조를 그림으로 그려보았다. (위 그림에서 배열이 달라질 수도 있고, 누락된 요소들도 있지만 큰틀을 이해하기엔 무리없음)
파일시스템 시작은 FAT과 동일하다, VBR로 시작한다.
VBR 영역 다음으로 나오는 MFT(Master File Table) 이라는 부분(MFT는 파일 형태)이 NTFS의 핵심이다. 별도의 영역에 클러스터 할당, 파일정보를 저장하던 FAT 파일시스템과 다르게, NTFS는 이 MFT 파일에 모든 데이터들이 저장된다. 그 만큼 MFT 내부의 구조는 복잡하다.
MFT 파일은 MFT 엔트리들로 구성이 돼있는데, 이 MFT 엔트리는 볼륨에 저장된 파일/디렉토리 하나하나 마다 1개 이상 할당된다. 그러므로 크기도 가변적이다. 그리고 MFT 엔트리 앞 부분에 MFT 파일의 메타데이터들이 들어있는 예약된 MFT 엔트리가 위치한다. MFT 자체도 파일이기 때문에 그 것의 메타데이터가 필요하다. 그것이 맨 앞에 할당됨
위 그림이 FAT 파일시스템 처럼 정형화된 구조가 아님을 앞에서 밝혔는데, NTFS는 특별히 정형화된 레이아웃이 없다. 모두 관리 데이터를 포함하는 MFT 볼륨 어느 위치에 와도 상관은 없는 것이다. 다만 보통 위 그림같은 구조로 위치해 있기 때문에 저렇게 그린 것이다.
세부적인 내용은 이제부터 차근차근 알아가보자.
4. NTFS 파일시스템의 VBR 구조
기본적인 구조는 아래와 같지만, Signaure 뒤에 추가적인 VBR 영역을 가지는 경우도 있다. (클러스터가 512바이트면 VBR = Boot Sector)
NTFS 파일시스템은 클러스터 당 할당되는 크기가 커질 수록 VBR 영역의 할당크기 또한 커지는 구조이다.
위 그림은 NTFS의 부트 섹터 구조이며, 아래 표와 같이 클러스터 사이즈에 따라 VBR 크기 또한 달라진다.
VBR 크기가 1섹터 이상 되면 부트 섹터 뒤에는 부팅 관련 내용이 기록된다. (자세한 설명은 뒤에 함)
Cluster size | VBR Size |
512 byte |
1 Sector |
1 KB |
2 Sector |
2 KB |
4 Sector |
4 KB |
8 Sector |
부트 섹터 구조부터 확인하자, 볼륨의 맨 처음 3 byte 에 위치하는 CPU Jump Command 는 앞서 FAT파일시스템 포스팅에서 여러번 언급했듯이, 파일시스템 종류별로 값이 다르다. FAT12/16은 [EB 3C 90], FAT32는 [EB 58 90], NTFS는 [EB 52 90] 로 세팅된다. 다음 위치하는 BIOS 파라미터 블록, 부트스트랩 코드 및 에러 메세지, 시그니쳐 내용은 표 형태로 정리해보자.
Address range | size | Field Name | Description |
0x0003 – 0x000A | 8 byte | OEM ID | OEM(Original Equipment Manufacturer) 식별자. |
0x000B – 0x000C | 2 byte | Bytes per sector | 한 섹터 당 할당되는 byte 크기 |
0x000D – 0x000D | 1 byte | Sectors per cluster | 한 클러스터 당 할당되는 섹터 수 |
0x000E – 0x000F | 2 byte | Reserved | ~ |
0x0010 – 0x0014 | 5 byte | Unused | ~ |
0x0015 – 0x0015 | 1 byte | Media Type | 미디어타입, 플로피디스크를 제외하고 모두 0xF8 |
0x0016 – 0x0017 | 2 byte | Reserved | ~ |
0x0018 – 0x0019 | 2 byte | Sector per track | 트랙 당 섹터 수 |
0x001A – 0x001B | 2 byte | Number of heads | 헤더 수 |
0x001C – 0x001F | 4 byte | Hidden sectors | 볼륨 앞에 숨겨진 섹터 수 |
0x0020 – 0x0027 | 8 byte | Unused | ~ |
0x0028 – 0x002F | 8 byte | Total Sectors | 볼륨의 총 섹터수 |
0x0030 – 0x0037 | 8 byte | Cluster # for MFT | MFT가 시작하는 위치 클러스터 #(number) |
0x0038 – 0x003F | 8 byte | Cluster # for MFT Mirror | MFT mirror가 시작하는 위치 클러스터 #(number) |
0x0040 – 0x0043 | 4 byte | Clusters per MFT Entry | MFT Entry의 크기 |
0x0044 – 0x0047 | 4 byte | Clusters per index block | 인덱스 블록의 크기 |
0x0048 – 0x004F | 8 byte | Volume serial number | 파티션 볼륨 번호 |
0x0050 – 0x0053 | 4 bytce | Checksum | 오류검출 등 기능을 하는 checksum값 |
0x0054 – 0x01FD | 10 byte | Boot code and error message | 부트코드 및 에러메세지 |
0x01FE – 0x01FF | 2 byte | Signature ("0x55AA") | 시그니쳐 |
여기까지가 부트섹터의 내용이고, 이제 클러스터가 1KB 이상일 경우, 부트 섹터 다음에 추가적인 VBR영역을 가질 경우에 부팅 관련된 어떤 내용이 오는지 확인해보자. 클러스터 할당 기준은 4KB로 하겠다. 왜냐하면 대부분 4KB가 기본값으로 할당되니깐..
아래 그림은 부트섹터 바로 다음 섹터이다. 추가적인 VBR영역 이런식으로 부르던데, 내 생각엔 그냥 포괄적으로 모두 VBR이라고 본다.
일각에선 "$Boot" Sector 라고도 부른다.
네모 박스친 부분은 NTFS $FILE_NAME 속성의 인덱스 이름이다. 쉽게 말해, 부트로더가 저장된 위치를 가르키는 것,
그 앞에 보면 BOOTMGR 이라고 돼있는데, 부트로더 이름이다.
일단 NTFS 구조분석에 크게 중요한 부분이 아니라서 후에 자세히 다룰 기회가 있다면 내용추가 하겠습니당.
참고 URL
https://ko.wikipedia.org/wiki/NTFS
http://thestarman.pcministry.com/asm/mbr/NTFSBR.htm
참고 자료
(FP) NTFS.pdf - 제작자 : JK Kim
참고 도서
<파일시스템 포렌식 분석> - 저자 : 브라이언 캐리어
<START UP 디스크 포렌식> - 저자 : 이별
'IT 그리고 정보보안 > Knowledge base' 카테고리의 다른 글
소프트웨어 공학 개요 (0) | 2021.04.10 |
---|---|
윈도우 UserAssist를 통한 파일실행 흔적 분석 (0) | 2021.04.10 |
FAT (File Allocation Table) 32 (0) | 2021.04.10 |
FAT (File Allocation Table) 16 (0) | 2021.04.10 |
파일시스템(File System) 이란 무엇인가 (0) | 2021.04.10 |