본문 바로가기

Forensics/Disk Forensics

FAT

FAT(File Allocation Table) 파일시스템은 1977년 개발된 마이크로소프트사의 MS-DOS 및 Windows 9x 운영체제의 주 파일시스템으로 가장 간단한 파일시스템이다. 또한 모든 NT 같은 Windows 운영체제 및 유닉스에서도 지원한다. FAT은 디지털카메라와 USB 드라이버에서도 볼 수 있다. FAT 파일시스템 안에는 FAT 영역 즉 파일 할당 테이블이 존재하여 파일시스템을 말하는지 테이블을 말하는지 문맥을 살펴볼 필요가 있다. 

 

FAT는 FAT12, FAT16, FAT32, FAT64 등이 있으며 FAT 뒤에 붙어 있는 숫자는 FAT 엔트리(클러스터의 위치와 순서)의 비트 수이다.

  • FAT12: MS-DOS 초기와 플로피 디스크에 사용된다.
  • FAT16: 16비트 파일시스템으로서 최대 65,526개의 클러스터를 매핑할 수 있다. Windows 95까지 사용되었다. 최대 2GB의 하드디스크에서 사용할 수 있다. 이후 버전에서는 최대 4GB 지원할 수 있었다. 초기 SD 카드에서 사용된다. FAT16 파일시스템에서 파일 이름의 8자리 확장자는 3자리 명명 규칙을 준수해야 한다.
  • FAT32: 계산상 16TB까지 지원 가능하나 Windows 운영체제의 기능을 초과한다. 즉 Windows XP, Vista, ME 및 2000 버전은 FAT32 볼륨을 최대 32GB로 제한하였고 Windows 10과 같은 최신 Windows 운영체제도 최대 2TB 크기이다. FAT32는 최대 255자 길이의 파일 이름을 허용한다.
  • exFAT: Extended File Allocation Table의 약자로 FAT64라고도 불리기도 한다. 고용량, 고속의 플래시 메모리를 효율적으로 다루기 위해 개발되었다. 최대 2^32 - 11 = 294,964,285개의 클러스터를 관리할 수 있다. 최대 파일/파티션 크기는 권장 512TB, 이론상 128PB이다.
  FAT12 FAT16 FAT32 exFAT
0x80 클러스터 비트 수 12 16 32 64
최대 클러스터 수 4084
(2^12 - 12)
65,524
(2^16 - 12)
268,435,444
(2^28 - 12)
4,294,964,285
최대 볼륨 16MB 2GB 2TB(실제는 32GB) 64ZB(실제는 512ZB)
파일 하나 최대 크기 16MB 2GB 4GB 64ZB(실제는 512ZB)
디렉터리 최대 파일 수   16,384 65,534 2,796,202

 

FAT 파일시스템 구조

FAT 파일시스템 구조는 아래 그림처럼 크게 3부분(예약 영역, FAT 영역, 데이터 영역)으로 나눌 수 있다. VBR(예약 영역 0번 섹터)에 부트코드와 파티션의 정보(볼륨 크기, FAT 위치 등) 등이 있고 FAT 영역에 클러스터에 대한 정보를 저장하고 있으며 데이터 영역 중 Root Directory에 파일에 대한 각종 정보가 있으며 여기에서 지정된 번지에 데이터가 저장되어 있다.

 

1) 예약 영역(Reserved Area)

 

예약 영역은 FAT 파일시스템에서 파티션의 시작 부분에 존재한다. FAT32는 32 섹터를 사용하고 부트 섹터(Boot Sector), 파일시스템 정보(FSINFO, File System Information), 추가 예약센터로 이루어져 있다. 여기서 부트 섹터는 0번 섹터에 존재하는데 다른 말로 VBR(Volume Boot Record)로 불리는데 Boot Code, 볼륨 크기, FAT 위치 등 볼륨에 관한 다양한 정보를 가지고 있다.

 

FSINFO는 1번 섹터에 존재하며 운영체제에서 첫 비할당 클러스터의 위치와 전체 비할당 클러스터의 수를 알려주는 역할을 하여 새로운 클러스터를 어디에 할당할 것인지 결정하는 데 필요한 정보를 가지고 있다.

 

VBR이 손상되면 볼륨의 정상적인 인식이 불가능하며 의도적으로 볼륨의 존재를 숨기기 위해 VBR를 훼손하는 경우가 존재한다. VBR 손상 시에는 인식이 불가능한 중요한 문제가 발생하므로 6번째 섹터에 Backup VBR이 존재한다. 이를 통해 복구가 가능하다.

 

FAT32 VBR

파티션의 0번 섹터를 열어보면 아래와 같으며

의미 내용
Jump Boot Code Boot Strap Code로 점프하기 위한 부분이다.
OEM Name OEM 회사를 나타내는 문자열로써, FAT32는 MSDOS 5.X로 표시된다.
Byte PerSector 한 섹터가 몇 byte로 구성되어 있는지를 나타낸다. 기본 512byte이다.
SP 클러스터를 구성하는 섹터의 수이다.
기본적으로 8개의 섹터를 사용한다. (4,096byte)
RS (Reserved Sector) 예약된 섹터의 개수이다.
Media Type 볼륨이 어떤 미디어 매체를 이용하는지를 나타낸다.
고정식 디스크는 0xF8이 쓰인다.
FAT Size 32 FAT 영역의 섹터 수를 나타낸다. 단, FAT 1개에 대한 크기이다.
File System Version FAT32의 버전 정보를 나타낸다.
Root Directory Cluster 루트 디렉터리의 시작 위치를 나타낸다.
File System Information FSInfo 구조체에 대한 정보가 어디에 저장되어 있는지를 나타낸다.
BR 기준 보통 1번 섹터에 저장된다.
Boot Record Backup Sector BR이 백업된 섹터 번호를 나타낸다. 기본값으로 6을 사용한다.
Volume ID 볼륨 시리얼 번호를 나타낸다.
Volume Label(1, 2) 볼륨의 이름을 기록한다.
File System Type 해당 파일시스템의 타입을 나타낸다. FAT32의 값을 저장한다.

 

각 영역별 정보에 대한 해석 결과는 다음과 같다.

  • Backup Boot Sector: 0x6
    • 6번째 섹터에 Backup Boot Sector가 존재한다.
  • BPS(Bytes Per Sector): 0x200
    • 섹터 1개의 크기가 512 Bytes이다.
  • SP(Sector Per cluster): 0x20
    • 1개의 클러스터는 32개의 섹터로 구성되어 있다.
    • 일반적으로 1개 클러스터는 8개 섹터로 구성되어 있다.
  • Reserved Sec Cnt(Reserved Sector Count): 0xC70
    • VBR의 크기가 3184 섹터이다.
  • Total Sector 32: 0x39CF000
    • 파티션이 차지하는 총 섹터 수가 60,616,704개이며, 이를 통해 볼륨 용량을 구할 수 있다.
    • 볼륨 용량 = 총 섹터 수 * 섹터 크기 - (VBR + FAT#1 + FAT#2가 차지하는 섹터 수) * 섹터 크기
  • FAT Size 32: 0x39C8
    • FAT#1, FAT#2 영역의 크기는 각각 14,792 섹터이다.
  • Root Directory Cluster: 0x2
    • 파일시스템의 가장 최상위 root 폴더를 2번 클러스터로 정의한다.

 

2) FAT 영역

예약 영역 바로 다음에 FAT 영역이 존재한다. FAT 영역은 존재하는 클러스터에 데이터가 할당되었는지 여부 즉 클러스터 할당 상태 및 연결 클러스터를 표시해 주는 파일 할당 테이블이다. FAT 영역은 FAT1과 FAT2 2개가 존재하며 FAT1과 FAT2 안의 내용은 동일하다. FAT2는 FAT1이 손상된 경우 복구 용도의 백업이다. 아래 그림에서 보듯이 4byte씩 클러스터의 할당 여부가 표시되어 있다. 0x00000000인 경우 비어있는 클러스터이며 0x?0000002 ~ 0x?FFFFFEF가 오면 할당된 클러스터이다.

FAT 엔트리 내용 설명
0x?0000000 비어있는 클러스터
0x?0000001 예약된 클러스터
0x?0000002 ~ 0x?FFFFFEF 사용하고 있는 클러스터(Allocated Cluster)
0x?FFFFFF0 ~ 0x?FFFFFF6 예약된 클러스터
0x?FFFFFF7 불량 클러스터(Bad Cluster)
0x?FFFFFF8 ~ 0x?FFFFFFF  

 

0번 FAT 엔트리는 미디어의 타입을 나타내고 1번 FAT 엔트리 파티션의 상태를 나타내므로 데이터 영역의 클러스터는 2부터 시작한다.

 

1개 클러스터를 차지하는 파일을 2개 생성시키면 2번 클러스터에 0F FF FF FF로 마지막 클러스터(EoC, End of Cluster)를 나타내어 하나의 cluster로 파일이 생성되었음을 알 수 있다. 또한 3번 클러스터에도 EoC이므로 하나의 cluster로 또 다른 파일이 생성되었음을 알 수 있다.

 

1개 클러스터를 차지하는 파일을 1개 생성시키고 5개의 클러스터의 용량을 가진 파일을 하나 더 생성시키면 2번 클러스터에 EoC로 하나의 cluster로 파일이 생성되었음을 알 수 있고 3번 클러스터에 4, 그러므로 4번 클러스터에 가면 5, 5번 클러스터에 6, 6번 클러스터에 7, 7번 클러스터에 EoC이므로 5개의 cluster로 또 다른 파일이 생성되었음을 알 수 있다. 즉 각각의 FAT 영역에서의 FAT Entry들은 자신이 다음 클러스터의 값을 담고 있다. 

 

파일은 디렉터리 엔트리에 파일의 속성 정보 및 시작 클러스터가 기록되어 있으며, FAT 테이블에 시작 클러스터가 오면 연결된 파일의 다음 클러스터가 기록되게 하는 단일 연결목록(Linked List) 형식으로 표현된다.

 

3) 데이터 영역

- 디렉터리 엔트리(Directory 엔트리)

 

데이터 영역에 존재하는 데이터는 디렉터리 엔트리와 실제 파일이 있다. 디렉터리 엔트리에는 파일의 이름, 확장자, 속성, 파일 저장 시작 클러스터 위치, 파일 크기, 파일 시간 정보가 있다.

 

디렉터리 엔트리의 크기는 32byte이며 아래 그림은 디렉터리 엔트리의 구조이다.

 

시간은 2진수로 변환 후 5비트(hhhhh)/6비트(mmmmmm)/5비트(sssss)로 나누어 계산하여야 하고 날짜는 7비트(yyyyyyy)/4비트(mmmm)/5비트(ddddd)로 나누어 계산하여야 한다.

 

실제 아래 그림의 ABC.TXT가 저장된 디렉터리 엔트리를 해석해 보면 아래와 같다.

  • 이름: ABC
  • 확장자: TXT
  • 파일 속성: 0x20, 일반 파일
0x01 읽기 전용 파일
0x02 숨김 파일
0x04 운영체제 시스템 파일
0x08 속성값 대신 디스크 볼륨 레이블을 포함한 엔트리 표시
0x10 서브 디렉터리를 가짐
0x20 일반 파일
  • Create Time: 40 48(리틀 엔디안 변환) -> 48 40 -> 이진화(01001/000010/00000) = 9/2/0 = 9시 2분 0초
  • Create Date: F0 52(리틀 엔디안 변환) -> 52 F0 -> 이진화(0101001/0111/10000) = 2021(1980 + 41)/7/16
  • Last Accessed Date: F0 52로 Create Date와 같음
  • Last Written Time: 2D 48(리틀 엔디안 변환) -> 48 2D -> 이진화(01001/000001/01101) = 9/1/13 = 9시 1분 13초
  • File Size: 0x40 -> 64byte
  • File Data 접근하기
    • 클러스터 번호 = Starting Cluster High + Low = 17 00 = 23
    • File Data 위치 = (클러스터 번호 - 2) * 클러스터당 섹터 수 + 클러스터2(Root Directory) = (23 - 2) * 8 + 18,432 = 18,600 섹터

 

- 긴 파일 이름 디렉터리 엔트리

 

8 자 이내의 짧은 파일의 이름은 하나의 디렉터리 엔트리로 표현되지만 최대 255자리까지 이름이 가능하기 때문에 8자를 넘어가는 파일의 이름은 8자로 축약된 파일 이름의 디렉터리 엔트리 구조가 생기고 위로 순차적으로 전체 파일 이름을 표시하는 엔트리가 생성된다.

 

- 생성한 파일 찾아가기

 

FAT 파일시스템에서 파일이 생성되는지를 알아보기 위해 mydir이란 폴더를 만들고 그 안에 myfile.txt를 만들어 어떠한 형태로 찾아가야 하는지를 알아보자.

 

  1. 드라이브를 열고 MBR의 파티션 테이블로부터 원하는 파티션의 시작 섹터를 얻는다.
  2. 찾은 파티션의 섹터 0의 VBR을 참고하여 FAT 위치, 데이터 영역 위치, 루트 디렉터리 위치를 파악한다.
  3. 루트 디렉터리에서 mydir 시작 클러스터(Starting Cluster High + Starting Cluster Low)를 찾고, 시작 클러스터로 이동하여 myfile.txt의 시작 클러스터(Starting Cluster High + Starting Cluster Low)를 찾는다.
  4. 찾은 클러스터를 복사하여 새 파일로 만들면 원하는 파일의 전체 데이터를 얻을 수 있다.

 

- 파일 삭제 및 복구 과정

 

운영체제는 생성된 파일 찾아가기와 같은 과정으로 파일을 삭제한다.

 

즉 디렉터리 엔트리에서 파일의 시작 클러스터를 확인한 후 FAT 영역에서 연결된 모든 클러스터의 FAT 구조체 엔트리 모두를 0x00000000으로 설정하여 할당 해제한다. 그러고 나서 디렉터리 엔트리의 첫 바이트를 0xE5로 변경한다. 실제 파일 내용이 삭제가 되진 않으나 이렇게 되면 탐색기로는 해당 파일에 접근이 불가능하다.

 

위의 과정을 살펴보면 디렉터리 엔트리의 첫 바이트가 0xE5로 설정되고 연결된 FAT 엔트리가 0이 되는 것이 파일의 삭제이다. 파일을 복구하기 위해서는 파일의 시작 클러스터 및 연결 클러스터를 알아야 한다. 복구하려는 파일의 이름을 알면 디렉터리 엔트리 내에 첫 바이트가 0xE5로 바뀐 것 같은 이름을 찾음으로써 시작 클러스터 및 파일 크기를 알 수 있게 되며 몇 개의 클러스터인지는 확인 가능하지만 정확히 연결된 클러스터는 알 수 없다. 따라서 아래와 같은 연속적인 클러스터 할당의 경우에는 복구가 가능하나 두 번째 그림 같은 비연속적인 클러스터가 할당이 되거나 다른 내용으로 일부 덮어 쓰인 경우 복구가 어렵다.

'Forensics > Disk Forensics' 카테고리의 다른 글

GPT(GUID Partition Table)  (0) 2025.02.09
$UsnJrnl  (0) 2025.02.09
NTFS  (0) 2025.02.04
파티션과 MBR  (0) 2025.02.03
파일시스템 관련 기본개념  (0) 2025.01.26