Forensic/파일-구조

FAT16(File Allocation Table) File System Structure

Ron Weasley 2022. 2. 6. 15:22

오늘은 FAT File System에 대해 배워보겠습니다.
 
  FAT File System은 FAT12, FAT16, FAT32과 같이 총 3가지의 파일 시스템으로 나누어 집니다. 원래 FAT12부터 배워야 하지만 이번에 배워볼 FAT12나 FAT16은 크게 차이가 나지 않고 클러스터를 표현하는 FAT Entry의 비트 수가 12개와 16개인 점을 제외한다면 동일하기 때문에 FAT16 파일 시스템만 공부를 하게 된다면 FAT12는 공부하지 않아도 이해 하실 수 있을것입니다. 그럼 본론으로 들어가겠습니다.
 
  먼저 FAT16의 구조를 보면서 설명하겠습니다.

FAT16 Structure LayOut

 
위의 그림을 보면 FAT16 File System의 구조는 4가지의 영역으로 나뉘어 져 있지만 Data Area를 세부적으로 나누면 이런식으로 표현이 됩니다.

FAT16 Detail Structure LayOut

 
먼저 Reserved Area에 대해서 배워 보겠습니다.
 

1. FAT16 File Systme - Reserved Area (예약된 영역) - 1 Sector

  제일 먼저 나오는 예약된 영역은 말 그대로 미리 예약된 영역입니다. 파티션의 가장 첫 부분에 위치합니다. FAT16과 FAT32의 제일 큰 차이점은 "예약된 영역" 입니다. FAT12/16은 1 Sector의 크기로 할당 되지만 FAT32는 추가적인 예약 영역을 가지게 됩니다. 또한 FAT12/16은 VBR이라는 부트 섹터가 파티션의 가장 첫번째 부분에 위치하여 표현이 되는데, 이로써 알 수 있는 사실은 FAT12/16은 VBR이 예약된 영역이라는 것을 알 수 있습니다. 표를 보시면 이해가 될 것입니다.

FAT File System Reserved Area

 
그럼 분석을 할 FAT16으로 포맷을 한 하드디스크를 HxD에디터로 열어서 Hex값을 보겠습니다.

FAT16 File System Hex Data

 
보시면 아까 예약된 영역은 1섹터를 가진다고 했는데 Sector 0을 벗어나서 Sector 1부터는 00 00으로 채워져있습니다.
그런데 아까 위에서 설명을 했지만 다시 한번 말씀드리자면 FAT16은 예약된 영역에 부트섹터가 존재 하는데,
잘 보시면 1FE ~ 1FF에 0x55AA로 적혀있는 16진수 값은 부트 섹터로 예약된 영역에 부트 섹터가 존재하는 것을 알 수 있다.
 
이제 Reversed Area 구조를 자세하게 살펴봅시다.
 

1-1) FAT16 File Systme - Jump Command to Boot Code ( 0x00 ~ 0x02, 3Byte)

FAT16 File System - Jump Command to Boot Code

 
이 영역은 Jump Command to Boot Code이지만 다른 이름으로는 CPU Jump Command라고도 불리웁니다.
CPU 명령 실행 분기를 부트 코드로 옮기는 명령을 하고, 위에서 알려주는 EB 3C 90이 Jump를 해야 할 부트코드의 Offset 주소 입니다. USB 파일 시스템 종류마다 Hex값이 다 다릅니다. 표를 보시면 쉽게 구분을 할 수 있습니다.

FAT16 Jump Command to Boot Code

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

FAT16 File System - OEM ID

 
이 영역은 OEM 식별자로 쉽게 말하면 제조사 ID라고 생각하면 되는데, FAT12/16/32는 MSDOS5.0으로 나타내고 있으며, NTFS는 다음에 NTFS를 공부할 때 다시 설명하도록 하겠습니다.
 

1-3) FAT16 File Systme - BPB(BIOS Paremeter Block) (0x0B ~ 0x3D, 51Byte)

이곳에는 많은 정보들을 포함하고 BPB에 포함된 정보들을 참조하여 파일시스템의 부팅을 진행합니다.
BPB의 특징은 마지막에 File Name을 뜻하는데 현재 분석하고 있는 하드 디스크는 FAT16이라고 적혀있다.
표과 사진을 해당 Offset값에 어떤 내용이 담겨 있는지 확인해보도록 하자. ( 지저분... )

BPB Area
BPB Area
BIOS Parameter Block

 
위 항목 중 FAT16과 FAT32가 공통적으로 해당되는 부분도 있는 반면, FAT16만 가지고 있는 고유한 부분도 있습니다.

FAT16 File System Format - BPB

 
이렇게 살색은 FAT16/32가 공통적으로 가지고 있는 항목이고, 하늘색은 FAT16만 전용으로 가지고 있는 항목입니다.
 

1-4) FAT16 File Systme - Boot Code Error Message + Signature (0x3E ~ 0x1FF, 449Byte)

Boot Code Error Message + Signature

 
해당 부분을 살펴 보면 빨간 부분은 Error 메세지를 뜻하고 파란색은 시그니처를 뜻하는데 0x55AA가 시그니처 입니다.

Boot Code Error Message + Signature

 
1-3 까지 살펴봤던 BPB영역 이후로 나오는 449byte는 447bytr의 Error메세지와 2byte의 시그니처를 표현합니다.
지금까지 살펴봤던 512byte는 Reserved Area(예약된 영역)입니다. 이제는 FAT Area #1, #2를 살펴봐야 하는데 그전에 BPB에서 봤던 FAT Area #1이 나오기 전 Sector의 수를 알 수 있는 값이 존재합니다. 바로 0x0E ~ 0x0F의 값을 보면 되는데 해당 값은 2byte로 구성되어 있으며 포스팅 하기위해 만든 실습파일은 0x0008로 8번 Sector에 FAT Area가 존재합니다.

FAT16 File System - FAT Area

2. FAT16 File Systme - FAT Area #1, #2 (File Allocation Table)

FAT Area는 #1, #2로 영역이 나뉘어져 있습니다. 보통 FAT Area는 FAT영역과 FAT영역의 백업본으로 구성되어 있습니다.
왜 두 가지의 영역으로 나뉘냐면 #1이 만약에 손상이 되었을 경우를 대비해서 #2가 존재하는것 입니다.그럼 이제 현재 분석하고 있는 디스크의 FAT Area #1의 Sector는 8번 Sector에 있다고 했고, FAT 영역의 크기를 구해야 하는데 이것 또한 BPB에서 구할 수 있습니다. 표를 보면 0x16 ~ 0x17이 FAT 16 Size를 구할 수 있습니다. 계산을 해보면

0x16 ~ 0x17 : 0x0100 = 256Sector, 1Sector는 512byte = 256 * 512 = 131,072byte입니다. 16진수로 표현하면 0x20000입니다.
 

이 영역뒤에는 Data 영역에 할당 되어 있는 클러스터들의 상태를 표시하게 되는데, 위에서 언급했듯이 FAT16은 클러스터를 16bit로 표현을 하게 설정이 되어 있습니다. 또한 해당 테이블은 클러스터를 연결 리스트 형식으로 관리합니다.

FAT16 File System - FAT Area

 
FAT Area에서는 FAT Entry 0, 1번은 저장 매체 종류와 파티션 상태를 표현하기 위해 미리 예약된 영역이고, 그 뒤를 이어서 Entry 2번부터 데이터 영역의 클러스터와 대응된다. FAT Entry는 쉽게 말해서 FAT12, 16, 32가 가지는 FAT 영역의 각 바이트를 말하는데 FAT12,16은 2byte를 가지고 FAT32는 4byte를 가진다.
 
다음 그림은 FAT16 File System의 FAT 엔트리 구조입니다.

FAT16 File System Detail Layout

 
일단 이 위 사진은 위에서 봤던 FAT16 구조를 자세하게 나타낸 것입니다.

그리고 밑에 사진은 위 FAT16 구조에서 Root Directory와 Data Area사이에 클러스터가 존재하는데, 이 Cluster는 0번부터 가 아니라 2번부터 시작을 하게 됩니다. 이유는 0번은 저장 매체의 유형 복사본을 저장하고, 1번은 파일시스템의 불량 상태를 저장합니다. 그래서 그림과 같이 Media TypePartition Status로 보이게 되는것 입니다.
 
다음은 FAT 엔트리 값 설명으로써 아래의 표와 같이 특별한 값을 가지게 됩니다.

FAT16 File System Cluster Data

 
0xF8과 0xFF 밖에 없는 위 FAT Area를 보면 어떠한 클러스터도 없다는 것을 알 수 있습니다.

FAT16 File System - FAT Area

 
하지만 다음과 같은 사진처럼 0xF8과 0xFF뿐 아니라 뒤에 추가적으로 내용이 더 있는것을 볼 수 있는데, 0x1000오프셋에 0xF8FFFFFF 이후부터 ~ 0xFFFFFFFF까지 부분들은 클러스터에 데이터가 할당된 부분으로 생각할 수 있는데 이 부분까지만 나왔다면 파일시스템을 포맷하자 마자 바로 본 Hex값이라 클러스터가 없는것이고, 제가 분석한 디스크에서는 사용하다가 분석을 했던것으로 추가적으로 0x0006, 0x0007같이 값이 00이 아니므로 값이 설정 되어있는 부분들은 클러스터가 존재하므로 2바이트씩 생각하면 Cluster6, Cluster7 ....Cluster30까지 볼 수 있습니다. 그 이후 0xFFFFFFFF를 기록하여 파일의 끝을 알렸고 이를 EOC(End Of Cluster)라고 합니다.
 

3. FAT16 File Systme - Data Area

이제 알아볼 영역은 Data Area부분 입니다.

FAT16 File System Detail Layout

 
FAT16 File System의 전체구조를 나타내는 그림입니다.
위에서 FAT Area #1 #2를 알아보았는데요. 다음에 Root Directory가 나오게 되는데 위치를 한번 알아 보겠습니다.
FAT Area의 크기는 Reserved Area에서 0x16 ~ 0x17에 나타나 있습니다.
0x00FC으로 되어 있기 때문에 252섹터를 의미합니다.
 
추가적으로 분석하고 있는 디스크에 아래와 같은 파일과 폴더를 추가했습니다.

폴더와 파일을 추가한 후 8섹터 + 252섹터 * 2 = 504 + 8 = 512 섹터를 가보면 파일 시스템을 볼 수 있습니다.
위 계산식은 사용자마다 달라 8섹터는 BPB의 Reversed Sector Count를 의미합니다.
(제가 참고한 블로그에서는 2섹터로 나와있습니다.)

FAT16 Root Directory Hex Data

 
간단하게 해당 파일에 대해서 알아보겠습니다.
System Volume Information 폴더는 FAT16으로 포맷을 했을 때, 기본적으로 들어있던 폴더이며, FAT16 폴더는 실습을 위해서 제가 추가 해준 폴더이고, FAT16 폴더 안에 Flag.txt, Serial Key.txt도 같이 추가 해줬습니다. 그리고 RECYCLEBIN은 휴지통으로써 가상환경을 만들었는데 자동적으로 생겨났습니다..
 
Data Area는 말 그대로 데이터들이 저장되는 영역이며, Cluster 단위로 구성되어 있다고 위에서 말씀드렸습니다.
그리고 데이터가 저장되는 형태는 파일, 디렉토리 2가지 형태로 구분됩니다.
 
지금 분석하고 있는 FAT16은 구조 상 FAT Area #2 바로 뒤에 Root Directory가 오는것을 알 수 있습니다.
하지만 다음에 배울 FAT32에서는 FAT Area #2 뒤에 오는게 아니라 데이터의 영역 중 무작위로 루트 디렉터리를 위치 시킬 수 있습니다. 왜냐하면 위치를 FAT16처럼 바로 뒤에 오게 할 시 찾기는 쉬우나 FAT32에서는 디렉터리 갯수 제한이 존재 하기 때문에 바뀌었습니다.
 
본론으로 FAT16의 루트디렉토리 개수는 BPB에서 확인할 수 있었듯 0x0200이였습니다.

FAT16 Root Directory Entryt Count

 
Root Directory Entry Count = 512입니다.
FAT16에서 Root Directory는 32섹터이기 때문에 Data Area에서 구한 512 Sector + 32 Sector = 544 Sector에서 찾을 수 있었습니다.

FAT16 File System - Root Directory Data Area

 
아까 위에서 기본적으로 생성되었던 파일인 System Volume Information 폴더에 들어있는 파일들을 볼 수 있습니다.
Root Directory 개수는 512개로 한정적이지만 하위 Sub Directory의 개수는 무제한입니다.
 
이제 Data Area에서 Root Directory와 Sub Directory에 존재하는 Directory Entry를 보겠습니다.
 

4. FAT16 File Systme - Root Directory / Sub Directory

Root Directory와 Sub Directory에서는 디렉터리 엔트리(Directory Entry)라는 구조체로 이루어져 있습니다.
FAT16 파티션에 저장되어 있는 파일과 디렉터리의 메타데이터인 파일 속성, 크기, 클러스터 시작 위치, 날짜, 시잔 정보를 포함하고 있으며, 디렉터리 엔트리 구조는 32바이트로 구성되어 있습니다.
 
Directory Entry 구조를 보겠습니다.

FAT16 Directory Entry LayOut

 
앞에서 생성한 FAT16 디렉터리를 봐야합니다. 그래서 Hex값으로 찾아봐야 하는데, 조금 까다롭습니다. 그래도 간단하게 설명을 할터이니 같이 실습환경을 구축해서 따라해봅시다!
 

FAT16 Starting Cluster

 
현재 0x14 ~ 0x15 하고, 0x1A ~ 0x1B에는 위 보시던것과 같이 Starting Cluster 값이 들어 있습니다.
위 값을 확인해보면 0x00000004 인것을 확인할 수 있습니다. 왜 0x00040000이 아니냐면 high와 low입니다. 이 부분은 high를 먼저 입력하고 low를 입력합니다. 그래서 리틀엔디안으로 0x0000 0x0004를 합쳐서 0x00000004가 되는겁니다.
 
결론은 해당 파일이 4번째 클러스터에 있다는 것을 확인할 수 있습니다.
클러스터는 FAT 영역이 끝나고 데이터 영역(Root Directory)부터 시작이 되는데, 먼저 Root Directory의 시작 섹터는 위에서 512 섹터 였습니다. 그다음 Root Directory의 시작 섹터인 (512섹터) + FAT16의 Root Directory는 (32섹터)를 하게되면 544섹터가 클러스터 2번이면서 Data Area의 시작 주소가 됩니다. 참고로 최대 클러스터 크기는 32KB로 최대 클러스터 크기를 가졌을 경우 섹터의 수는 64개입니다.
 
이렇게 Data Area의 시작 주소를 구했으면,
다음 Reserved Area의 BPB영역에서 0x0D에 표현된 Sector per Cluster의 값에 따라 정해집니다.

FAT16 Reserved Area - Sector Per Cluster

 
0x40 = 64로 클러스터 3번은 544 + 64 = 608 섹터입니다.
그렇다면 앞에서 FAT16의 디렉터리의 하위 디렉터리 및 파일은 클러스터 0x00000004에 있다고 했습니다.
계산을 해보면 544섹터 + ((4-2) * 64섹터) = 544 + 128 = 672섹터에 존재하게 됩니다.

실제로 FAT16 디렉터리 하위에 존재하는 FLAG.txt, Serial.txt를 볼 수 있습니다. 파일명은 Hex값에서 전부 대문자로 표기됩니다.
 
본론으로 FAT16 디렉터리와 하위 디렉터리를 찾는 방법에 대해서 계산을 해봤는데...많이 어려워도 차근차근 해보십쇼!!
 

4-1) FAT16 File System - File Name(0x00 ~ 0x07, 7Byte)

FAT16 File Name(Smaller than 7Bytes)

 
이 부분은 File Name이 있는 필드입니다.
기본적으로 아스키코드 값이 들어 있지만 0x00에 특수한 값이 들어 있는 경우가 가끔씩 있습니다. 표를 한번 봅시당.

FIle Name Property Layout

파일이름의 길이가 7바이트 이하일 경우 위 보시던것 처럼 전부 표시가 되고, 공백 부분에 대해서는 0x20으로 채워지고, 만약 파일의 이름이 길이가 7바이트 보다 클 경우 파일명은 6바이트로 표시되고 뒤에 ~1 이라고 적히게 됩니다.

FAT16 File System - File Name(Larger than 7Bytes)

 
4-2) FAT16 File System - Extension(0x08 ~ 0x0A, 3Byte)

FAT16 File System - Extension (확장자 txt)
FAT16 File System Extension (space)

 
이 부분은 Extension으로 파일의 확장자를 표시합니다. 디렉터리와 파일 상관없이 확장자가 없으면 공백(0x20)으로 채워지고 flag.txt와 serial.txt는 TXT라고 확장자를 표시합니다.
 

4-3) FAT16 File System - Attribute(0x0B, 1Byte)

FAT16 File System - Attribute

 
이 부분은 Attribute로 파일의 속성을 의미합니다. 해당 offset에 들어가는 값은 다음과 같습니다.

Attribute Property Layout

 
4-4) FAT16 File System - Reserved Area(0x0C, 1Byte)

 FAT16 File System - Reserved Area

이 부분은 Reserved Area로 예약된 영역입니다.
 

4-5) FAT16 File System - Create Time(Tenth of second) (0x0D, 1Byte)

FAT16 File System - Create Time(Tenth of second)

 
이 부분은 파일의 생성 시간을 10분의 1초, 0.1초 단위로 나타냅니다.
 

4-6) FAT16 File System - Create Time(0x0E ~ 0x0F, 2Byte)

FAT16 File System - Create Time

 
이 부분은 파일의 생성 시간을 나타냅니다. 시, 분, 초로 이루어져 있으며 시간을 계산하는 방법은 다음과 같습니다.

Create Time 변환

설명하자면 먼저 16진수를 리틀엔디안으로 입력을 해줍니다. 입력을 한 후, 2진수로 변환을 시키면 됩니다.
변환을 하였으면 시간은 5비트, 분은 6비트, 초는5비트로 나누어주고 저 2진수들을 10진수로 변환을 시킵니다.
그럼 13시 6분 11초가 되는데, 이때 초는 *2를 해주셔야 되기 때문에 22초가 됩니다. 그럼 확인을 해봅시다.

FAT16 File System - Create Time View

 
제대로 계산이 된 것을 볼 수 있습니다.
 
4-7) FAT16 File System - Created Date(0x10 ~ 0x11, 2Byte)

FAT16 File System - Created Date

 
이 부분은 파일의 생성 날짜를 나타냅니다. 년, 월, 일로 이루어져 있으며 날짜를 게산하는 방법은 다음과 같습니다.

Create Date 변환

 
설명하자면 먼저 16진수를 리틀엔디안으로 입력을 해줍니다. 입력을 한 후, 2진수로 변환을 시키면 됩니다.
변환을 하였으면 년도는 7비트, 월은 4비트, 일은 5비트로 나누어주고 저 2진수들을 10진수로 변환을 시킵니다.
그럼 42년 2월 6일이 되는데, 이때 년는 1980을 더해주셔야 되기 때문에 1980 + 42 = 2022년이 됩니다.

FAT16 File System - Create Date View

 
4-8) FAT16 File System - Last Accessed Date, Last Written Time, Last Written Data(0x12 ~ 0x13, 0x16 ~ 0x17, 0x18 ~ 0x19, 각 2byte씩)

FAT16 File System - Last Accessed Date, Last Written Time, Last Written Data

 
이 부분은 각각 순서대로 파일의 마지막 접근 날짜, 마지막 수정 시간(시, 분, 초), 마지막 수정날짜입니다. 계산하는 방법은 앞서 Create Time, Create Date랑 동일하니 시간을 구하고 싶다면 Create Time방법을 날짜를 구하고 싶다면 Create Date를 이용하시면 됩니다.
 
4-9) FAT16 File System - Starting Cluster High, Starting Cluster Low(0x14 ~ 0x15, 0x1A ~ 0x1B)
이 부분은 아까 위에서 File Name을 하기 전 디렉터리 위치를 구한다고 했던 부분입니다. 위에 내용을 참고해주세요.
 
이제 이때까지 분석했던 디스크 파일 이미지의 섹터를 한번에 표현해보겠습니다.

클러스터는 BPB Sector per Cluster에서 보셨듯이 64섹터여서 클러스터 #2와 클러스터 #3의 공간이 64섹터 입니다.
 
4-10) FAT16 File System - File Size(0x1C ~ 0x1F, 4Byte)
이 부분은 파일의 사이즈를 나타내는 공간이지만, 지금 분석하고 있는 FAT16 디렉터리는 파일이 아니기 때문에 크기가 없습니다. 그래서 Serial Key.txt 파일을 한번 살펴보겠습니다.

0x00000003으로 3바이트 만큼 크기가 들어있는데, Serial Key.txt에는 다음과 같은 문구가 들어 있습니다.

그래서 3바이트 크기로 hxd에디터에서 볼 수 있던겁니다.
 
5. Unallocated Area(비할당 영역)
비할당 영역은 디렉터리 엔트리 정보가 사라지고 파일 데이터만 남아있는 공간을 뜻합니다.
FAT영역에서 0x00의 값을 갖는 클러스터가 비할당 클러스터인데 이 부분을 순차적으로 연결하면 카빙이 가능합니다.