MS-DOS 파일 시스템 중 하나, 크게 FAT 12, 16, 32 로 나눌 수 있으며 FAT 뒤에 붙는 숫자의 경우 클러스터 번호의 비트와 같기 때문에 종류 별로 파일 시스템에서 관리하는 최대 클러스트의 개수가 달라짐.
FAT32 방식으로 포맷을 할 경우 지원하는 드라이브의 최대 크기는 32GB.
개별 파일 하나당 저장할 수 있는 최대 크기는 4GB. (고용량 파일을 다루는데에 단점이 있음.)
Reserved Area / FAT Area #1, #2 / Data Area 로 나뉘어져 있다.

Volume Boot Record 로 부팅 가능한 파티션(볼륨)의 첫 번째 섹터에 존재.
Boot Sector, Volume size, FAT 위치, $MFT 위치 등 볼륨에 관한 정보를 포함.
Boot Sector / FSINFO / Boot Strap / More reserved sectors 로 나뉜다.
0, 6번 섹터의 경우 Volume Boot Sector (원본과 백업본 위치)
1, 7번 섹터의 경우 FSINFO(File System Information) 구조체
2, 8번 섹터의 경우 Boot Strap Code
※ BIOS Parameter Block을 포함하는 섹터를 VBR이라고 부르나?
| Offset | Size (byte) | Field Name |
|---|---|---|
| 0x0000 ~ 0x0002 | 3 | Jump command to Boot Code |
| 0x0003 ~ 0x0059 | 57 | BPB (BIOS Parameter Block) |
| 0x005A ~ 0x01FD | 420 | Boot Code / Error msg |
| 0x01FE ~ 0x01FF | 2 | Signature (0x55AA) |
Boot Sector는 다시 Jump command, BIOS Parameter Block, Error message, signature 영역으로 구분.
Jump command와 BIOS Parameter Block 영역으로 부터 볼륨에 대한 정보를 얻을 수 있음.
| Offset | Size (byte) | Field Name | Description |
|---|---|---|---|
| 0x0003 ~ 0x000A | 8 | OEM ID | 운영체제 버젼별 ID |
| 0x000B ~ 0x000C | 2 | Bytes Per sector | 섹터 당 바이트 수 |
| 0x000D | 1 | Sectors Per cluster | 클러스터 당 섹터 수 |
| 0x000E ~ 0x000F | 2 | Reserved sector count | 예약된 영역 섹터의 수 (FAT Area 시작) |
| 0x0010 | 1 | Number of FAT tables | FAT 테이블의 수 |
| 0x0011 ~ 0x0012 | 2 | Root directory entry count | |
| 0x0013 ~ 0x0014 | 2 | Total sector 16 | |
| 0x0015 | 1 | Media Type | |
| 0x0016 ~ 0x0017 | 2 | FAT size 16 | |
| 0x0018 ~ 0x0019 | 2 | Sector Per track | |
| 0x001A ~ 0x001B | 2 | Number of heads | |
| 0x001C ~ 0x001F | 4 | Hidden sectors | |
| 0x0020 ~ 0x0023 | 4 | Total sector 32 | 4Byte크기의 파티션 총 섹터 수 |
| 0x0024 ~ 0x0027 | 4 | FAT size 32 | FAT 하나의 영역이 가지는 4Byte크기의 섹터수 |
| 0x0028 ~ 0x0029 | 2 | Ext flags | |
| 0x002A ~ 0x002B | 2 | FAT32 system version | 파일시스템의 주버전과 하위버전 |
| 0x002C ~ 0x002F | 4 | Root directory cluster offset | root 디렉토리가 위치한 클러스터 값 |
| (FAT32 경우 정해져있지않지만 보통 클러스터 2번 사용) | |||
| 0x0030 ~ 0x0031 | 2 | FSINFO offset | |
| (= File System Information) | FSINFO 구조체가 저장된 섹터 번호 | ||
| (보통 0x01) | |||
| 0x0032 ~ 0x0033 | 2 | Backup boot sector | 백업된 부트 섹터의 위치 |
| (보통 0x06) | |||
| 0x0034 ~ 0x003F | 12 | Reserved Area | |
| 0x0040 | 1 | INT 0x13 drive number | |
| 0x0041 | 1 | Not used | |
| 0x0042 | 1 | Boot signature | |
| 0x0043 ~ 0x0046 | 4 | Volume serial number | |
| 0x0047 ~ 0x0051 | 11 | Volume label (ASCII) | |
| 0x0052 ~ 0x0059 | 8 | File system type | 해당 파일 시스템의 타입 |
| Offset | Size (byte) | Field Name | Description |
|---|---|---|---|
| 0x0000 ~ 0x0003 | 4 | Signature | signature (0x52526141) |
| 0x0004 ~ 0x01E3 | 480 | Not Used | Not Used |
| 0x01E4 ~ 0x01E7 | 4 | Signature | signature (0x72724161) |
| 0x01E8 ~ 0x01EB | 4 | Number of free Clusters | 사용 가능한 클러스터 수 |
| 0x01EC ~ 0x01EF | 4 | Next tree Cluster | 사용 가능한 클러스터 시작 위치 |
| 0x01F0 ~ 0x01FD | 14 | Not Used | Not Used |
| 0x01FE ~ 0x01FF | 2 | Signature | signature (0x55AA) |
FAT 파일 시스템은 FAT 영역에 의해 관리되고, 백업본이 하나 더 있어서 두 개(FAT #1, FAT #2)로 나뉨.
같은 값을 가진 영역이 두 개이고, FAT #2는 FAT Mirror라고도 말함.
FAT Area는 Data Area의 cluster 할당 상태를 표시.
파일 시스템 종류에서 “FAT” 뒤에 붙은 숫자를 기준으로 할당 상태를 표시하므로, FAT32는 32bit(=4bytes)로 Data Area의 시작 cluster부터 마지막 cluster까지의 할당 상태를 표시함.
한 섹터 당 128개의 클러스터 표현이 가능. (512 byte / 4 byte = 128 cluster)
FAT Area의 시작 위치를 찾기 위해서는 BPB - Reserved sector count 를 확인.
ex) 0x106E 는 10진수로 4,206.
즉, 4,206 sector가 FAT Area의 시작이라고 볼 수 있음.
FAT Area의 크리는 BPB - FAT32 Size 를 확인.
ex) 0x07C9 는 10진수로 1,993.
즉, FAT Area #2의 시작위치 = FAT Area #1 시작 위치 (4,206 sector) + FAT Area 길이 (1,993 sector) = 6,199 sector.
FAT32에서는 1개의 sector 당 128개의 FAT Entry를 표현할 수 있다.
각 FAT Entry는 Data Area의 cluster와 대응됨. 그러나 FAT Entry의 0번부터 대응되는 것은 아님.
FAT Area의 첫 4 bytes와 그 다음 4 bytes, 총 8 bytes는 예약된 영역.
각각 FAT Entry 0번은 Media Type, FAR Entry 1번은 Partition Status를 나타냄.
그리고 2번부터 실제 Data Area의 cluster와 대응됨.
즉, FAT Entry 2번부터 Data Area의 각 cluster가 사용되고 있는지의 유무와 특정 파일이 점유하고 있는 cluster의 위치를 나타냄.
| FAT Entry Value | Cluster Status | Description |
|---|---|---|
| 0x ?000 0000 | 미할당 상태 | 새로운 파일 및 디렉터리 저장시 0x00을 찾아, 할당 정책에 따라 할당함 |
| 0x ?000 0001 | - | Reserved |
| 0x ?000 0002 ~ 0x ?FFF FFEF | 할당 상태 | 클러스터가 점유하고 있는 파일의 다음 데이터가 있는 클러스터를 가리킴 |
| 0x ?FFF FFF0 ~ 0x ?FFF FFF6 | - | Reserved |
| 0x ?FFF FFF7 | 불량 클러스터 | 배드 섹터가 포함된 클러스터가 발견된 경우, 이후 사용되지 않음 |
| 0x ?FFF FFF8 ~ 0x ?FFF FFFF | 할당 상태 | 파일이 하나의 클러스터만 사용하거나 파일에 할당된 마지막 클러스터. 즉, 파일의 끝 |
트리 형태로 표현되는 FAT 파일 시스템에서, 가장 중요한 요소는 최상위 Root Directory.
이전에는 Directory Entry의 크기가 32 bytes로 최대 Entry의 제한이 있어 Root Directory 내에 최대 생성할 수 있는 파일 및 디렉터리의 제한이 있었지만, FAT32에서는 Root Directory에 생성할 수 있는 파일, 디렉토리의 개수 제한이 없어짐.
FAT32의 Root Directory는 DATA Area의 어느 곳에나 올 수 있음. (기본적으로 FAT Area가 끝난 바로 다음에 옴.)
만약 임의의 위치로 이동한다면, BPB의 Root Directory Cluster Offset 을 통해 찾을 수 있음.
Data Area에 저장되는 데이터는 크게 디렉토리 및 파일로 나뉨.
디렉토리는 디렉토리 내부에 포함되는 하위 디렉토리와 파일 이름, 확장자, 시간 정보, 크기 등을 표현하기 위해 Directory Entry라는 구조를 사용함.

| Size (byte) | Field Name | Description |
|---|---|---|
| 1 | File Name or Status Byte | 0x5E : 삭제된 파일, 0x00 : 비어 있는 파일 |
| 7 | File Name | 최대 8바이트. 남은 공간은 0x02로 표현. 영문 : ASCII, 한글 : 한글 완성형 |
| 3 | File Extension | 확장자 표현. 최대 3자리. 남은 공간 0x02 표현 디렉토리의 경우에도 0x02로 채워짐 |
| 1 | Attributes | 0x01(읽기전용) 0x02(숨긴파일) 0x04(시스템파일) 0x08(해당 파일의 이름이 곧 볼륨 이름 루트 디렉토리에 위치 시작 클러스터는 0) 0x0F(긴 파일 이름 엔트리, 8 bytes 초과일 시 LFN) 0x10(디렉토리) 0x20(일반파일) |
| 1 | Reserved (NT Resource) | Window NT 예약된 공간. 0으로 채워져 있음. |
| 1 | Created Time (tenths of second) | 파일이 생성된 시간을 1/10초 단위로 기록 |
| 2 | Created Time | 파일 생성 시간 |
| 2 | Created Date | 파일 생성 날짜 |
| 2 | Last Accessed Date | 마지막 접근 날짜 |
| 2 | Starting Cluster High 2 Bytes | 파일이 위치한 시작 클러스터의 상위 2byte |
| 2 | Last Written Time | 마지막 수정 시간 |
| 2 | Last Written Date | 마지막 수정 날짜 |
| 2 | Starting Cluster Low 2 Bytes | 파일이 위치한 시작 클러스터의 하위 2byte |
| 4 | File Size | 바이트 단위의 파일 크기 |
Data Area - Attributes 값이 0x0F인 경우. 즉, 8 byte 초과의 크기로 File Name을 표현해야 할 때, LFN으로 표현해야함.

32바이트 구조를 가짐.
| Offset | Size (byte) | Field Name | Description |
|---|---|---|---|
| 0x00 ~ 0x07 | 7 | File Name | 파일 이름 |
| 0x08 ~ 0x0A | 3 | Extension | 파일 확장자. 확장자가 없을 시 0x202020으로 채워짐. |
| 0x0B | 1 | Attr | 파일 속성. (0x01: 읽기 전용파일, 0x02: 숨긴 파일, 0x04: 운영체제 시스템 파일, 0x08: 속성값 대신 디스크 볼륨 레이블을 포함한 엔트리를 나타냄.) |
| 0x0C ~ 0x0D | 2 | Reserved | 예약된 영역 |
| 0x0E ~ 0x0F | 2 | Create Time | 파일 생성 시간 |
| 0x10 ~ 0x11 | 2 | Create Date | 파일 생성 날짜 |
| 0x12 ~ 0x13 | 2 | Last Accessed Date | 파일 마지막 접근 날짜 |
| 0x14 ~ 0x15 | 2 | Starting Cluster Hi | 시작 클러스터 상위 offset값 |
| 0x16 ~ 0x17 | 2 | Last Written Time | 파일 마지막 수정 시간 |
| 0x18 ~ 0x19 | 2 | Last Written Date | 파일 마지막 수정 날짜 |
| 0x1A ~ 0x1B | 2 | Starting Cluster Low | 시작 클러스터 하위 offset값 |
| 0x1C ~ 0x1F | 4 | File Size | 파일 사이즈 |

N 개의 LFN File Structure 와 SFN File Structure로 구성됨.
ex)

Seq Num의 경우 0x40 or LFN 파일 구조 개수로 하여 값이 들어감.
if LFN 파일 구조 개수가 2개이면 마지막 LFN 구조의 Seq Num에는 0x42가 들어가고, 기본 LFN 구조에는 0x1이 들어간다.
하나의 LFN 파일 구조에는 13 byte의 파일명이 들어가기 때문에 13 byte를 초과하면 LFN 파일의 개수가 하나씩 늘어나게 된다.
FileName: 2 byte에 파일 명이 1 글자 씩 들어간다.
Attr: 항상 0x0F 값을 갖는다.
Reserved: Type을 나타내기도 하는데, 매번 0x00 값을 갖는다.
Checksum: SFN에 존재하는 파일명에 대응하는 값이 채워진다.
First Cluster Low: 해당 파일의 내용이나 해당 디텍터리의 하위 데이터들이 들어있는 클러스터 번호를 가지고 있다.
https://hec-ker.tistory.com/268
https://blog.naver.com/eslectures/80138263290
https://gsk121.tistory.com/265
https://blog.forensicresearch.kr/2