FAT Area
FAT Area: 파일 혹은 디렉토리의 데이터를 저장할 때, 디스크 상에 할당되는 클러스터의 정보를 엔트리 형태로 저장하는 영역이다.
FAT Area는 'FAT #1'과 'FAT #2'라는 두 개의 영역으로 구성되며, 'FAT #2'는 'FAT #1'의 백업 본으로써 내용은 동일하며 'FAT #1'의 다음 섹터부터 시작한다.
Cluster Entry: 파일 혹은 디렉토리의 데이터를 저장할 때, 디스크상에 할당되는 클러스터 체인의 다음 클러스터 정보를 저장하여 다음 클러스터로의 연결 상태를 나타내는 데 사용되는 Entry이다. 만약 n 번째 클러스터부터 데이터 저장이 시작된 파일의 시작 Cluster Entry는 n+1로 다음 클러스터 번호를 가리킨다. 데이터의 마지막을 의미하는 값은 0xFF FF FF 0F로 파일에 할당된 마지막 클러스터를 의미한다.
FAT Area는 각각 4byte (32bit, FAT32 명칭의 유래) 크기의 엔트리들로 구성되어 있다. 이 중 0 번째 엔트리(Media Type)와 1 번째 엔트리(Partition Status)는 시스템에 의해 사용되는 특별한 엔트리이고, 2 번째 엔트리부터는 파일이나 디렉토리가 디스크에 저장될 때 할당받는 디스크의 클러스터 정보를 나타낸다. Root Directory의 데이터 저장 시작 클러스터가 2 번째 클러스터 엔트리이기 때문이다. 다음은 이러한 엔트리 값들이 나타내는 데이터의 의미에 대하여 간략하게 정리해 보았다.
FAT #1은 VBR의 BPB 영역에서 "Reserved Sector Count" 정보를 참고하여 "VBR 섹터 + Reserved Sector Count"를 계산하면 접근할 수 있고, 추가적으로 FAT #2는 BPB 영역에서 "FAT Size" 정보를 참고하여 "FAT #1 섹터 + FAT Size"를 계산하면 접근할 수 있다.
FAT #1은 Reserved Area 다음 섹터부터 존재하고, FAT #2는 FAT #1의 다음 섹터부터 존재하기 때문에, FAT32의 구조를 도식화해 보면 이해하기 쉽다.
VBR (128번 섹터) + Reserved Sector Count (0x10 1A = 4,122) = FAT #1 (4,250번 섹터)
FAT #1 (4,250번 섹터) + FAT Size (0x07 F3 = 2,035) = FAT #2 (6,285번 섹터)
Entry Value | Information |
0x00 00 00 00 | Unassigned (available) |
0x(Entry Number) | Allocated (in use) |
0x?F FF FF 0F | End of Marker |
0xFF FF FF F7 | Bad Cluster |
FAT Area Cluster Entry Allocation
FAT Area의 Cluster Entry의 정확한 구조를 파악하기 위해 세 개의 txt 파일과 하나의 png 파일을 만들어 직접 테스트해 보았다.
아래의 표에 파일 이름, 파일 크기, 파일 저장 시 할당되는 클러스터 개수를 정리해 두었다.
디스크의 조건은 "Bytes Per Sector = 512 Byte, Sector Per Cluster = 8 Sector, Bytes Per Cluster = 4,096 Byte"이다.
File Name | Size (Byte) | Allocation Cluster |
test.txt | 4 | 1 |
long_name_test.txt | 12,288 | 3 |
cluster_test.txt | 12,289 | 4 |
image_test.png | 1,421,030 | 347 |
아래는 테스트 이전 초기화 직후의 FAT #1 (4,250번 섹터)이다.
2개의 시스템 클러스터와 4개의 클러스터가 기본적으로 할당된 상태이다.
생성한 test.txt, test_long_name.txt, test - 복사본.txt, cluster_test.txt, Image_test.png 파일을 순차적으로 저장해 보았다.
첫 번째로 test.txt 파일 저장이다. 해당 파일 저장 시 할당 클러스터 개수 즉, 생성되어야 할 Cluster Entry가 1개임에도 불구하고, 3개의 독립적인 Cluster Entry(초록색)가 생성되었다. (Cluster Entry는 1개의 클러스터를 할당할 때, 시작 Cluster Entry 값이 마지막 Cluster Entry이므로, 0xFF FF FF 0F 하나의 Cluster Entry만이 생성된다.) 이는 디스크가 초기화 이후 첫 번째 파일(test.txt)이 저장될 때, 데이터 크기가 1 클러스터 미만의 시스템 파일이 2개 자동으로 생성됨을 유추할 수 있다. Data Area 분석 시 확인하나 $RECYCLEBIN이 생성된다.
두 번째로 test_long_name.txt 파일 저장이다. 해당 파일 저장 시 생성되어야 할 Cluster Entry가 3개이며, 3개의 연속적인 Cluster Entry(파란색)가 생성됨을 확인할 수 있다. (연속적인 Cluster Entry는 Cluster Entry의 번호를 Cluster Entry 이름으로 갖는 파일인 경우이다. 연속적인 Cluster Entry의 끝은 마지막 Cluster Entry 값인 0xFF FF FF 0F 값이 나타날 때까지이다.)
세 번째로 test - 복사본.txt 파일 저장이다. 해당 파일 저장 시 생성되어야 할 Cluster Entry가 1개이며, 1개의 독립적인 Cluster Entry(하늘색)가 생성됨을 확인할 수 있다.
네 번째로 cluster_test.txt 파일 저장이다. 해당 파일 저장 시 생성되어야 할 Cluster Entry가 4개이며, 4개의 연속적인 Cluster Entry(보라색)가 생성됨을 확인할 수 있다.
마지막 다섯 번째로 Image_test.png 저장이다. 해당 파일 저장 시 생성되어야 할 Cluster Entry가 347개이며, 347개의 연속적인 Cluster Entry(검은색)가 3개의 섹터에 거쳐 생성됨을 확인할 수 있다.
Stating Cluster Entry: 0x12 = 18(d)
Ending Cluster Entry: 0x01 6B = 363(d)
Allocation Cluster Size = Ending Cluster Entry (363) - Stating Cluster Entry (18) + 2 (Stating, Ending) = 347
메인 글
"[Digital Forensic] FAT32 File System Detailed Analysis"