본문 바로가기

File System

FAT16(File Allocation Table) File System Structure Analysis

FAT File System은 FAT12, FAT16, FAT32 로 총 3가지의 파일 시스템으로 나누어 집니다.

FAT12 와 FAT16 의 차이는 클러스터(Cluster)를 표현하는 FAT Entry의 비트 수가 12개에서 16개가 된 것 외에는 동일합니다.

그렇기 때문에 FAT12말고 FAT16에 대한 내용만 알아도 충분 합니다.

FAT32는 나중에 다시 다루기로 하고 FAT16에 대해서 한번 알아 보겠습니다.

 

FAT16의 구조를 한번 알아 보겠습니다.

FAT16 File System Simple Layout

위처럼 크게 나눠 보면 4가지의 영역으로 구분이 가능하지만 좀더 세부적으로 나눠보면 아래와 같습니다.

FAT16 File System Detail Layout

FAT16 구조를 보면 위와 같습니다. 

먼저 Reserved Area(예약된 영역)을 공부해 보겠습니다.

 

1. Reserved Area (예약된 영역) - 0번 Sector

예약된 영역은 이름 그대로 예약된 영역입니다. 파티션 부분에서 가장 첫부분에 위치하게 됩니다.

FAT12/16 과 FAT32는 예약된 영역 크기(섹터)의 수가 다릅니다.

FAT16 File System Reserved Area Sector Data

FAT12/16은 예약된 영역 크기가 1로 하나의 섹터만을 가지고 있습니다.

실제로 FAT16 File System 의 Hex값을 확인해 보면 아래와 같습니다.

FAT16 File System Hex Data

섹터1번인 0x200부터는 00 00 00 로 채워져 있습니다.

 

하지만 BootSector라고 불리는 영역이 Reserved Area에 들어있다.

BootSector는 아래의 사진과 같이 1 Sector로 지정되어 있다.

FAT16 File System Reserved Area Component Layout

Boot Sector의 크기는 1섹터로 고정이 되지만 Reserved Area 가 1섹터보다 클 경우(예를 들면 FAT32일때는 Reserved Area가 32섹터이다.) Reserved Area에서 Boot Sector를 제외한 나머지 부분에 다른 데이터들이 할당 된다.

Reserved Area가 32섹터인 FAT32의 구조는 아래와 같습니다.

FAT32 File System Reserved Area Component Layout

위의 구조에서 Boot Sector가 1섹터를 차지하고, FSINFO + Boot Strap + More Reserved Sector 의 크기는 31(32-1) Sector 입니다.

위의 구조는 FAT32 File System Structure 이기 때문에 FAT32 File System Structure 분석할때 다시 확인해 보겠습니다.

 

그래서 결국 하고자 했던 말은 FAT12/16에서는 예약된 영역인 Reserved Area는 VBR 영역과 동일하다는 것 입니다.

 

이제 Reserved Area의 세부적인 구조를 알아 보도록 하겠습니다.

 

1.1 Jump Command to Boot Code (0x00 ~ 0x02, 3Byte)

Jump Command to Boot Code 라고도 불리지만 CPU Jump Command 라고도 불립니다.

CPU의 명령 실행 분기를 부트 코드로 옮기는 역할을 합니다.

아래는 Jump Command to Boot Code 에 들어가는 값이 파일시스템마다 어떻게 다른지 표현한 표입니다.

FAT16 File System Format - Jump Command Value

총 3가지의 파일 시스템으로 분류를 했습니다.

아래의 사진은 USB를 FAT16으로 포맷을 진행후 확인한 Hex값입니다.

FAT16 File System Format - Jump Command to Boot Code

1.2 OEM(Original Equipment Manufacturing) ID (0x03 ~ 0x0A, 8Byte)

FAT16 File System Format - OEM ID

FAT12/16/32는 MSDOS5.0을 표시하고 있고 NTFS는 NTFS와공백을 표시하고 있습니다.

일종의 제조사 ID 같은형식으로 박혀 있는 시그니처 입니다.

 

1.3 BPB(BIOS Parameter Block) (0x0B ~ 0x3D, 51Byte)

FAT16 File System Format - BIOS Parameter Block Data

BPB를 확인해 보면 진짜 다양한 정보들을 포함하고 있으며 BPB 마지막 부분을 보면 FAT16이라고 되어있는데 파일 시스템 종류가 적혀 있습니다.

파티션 정보들을 포함하고 있어서 BPB에 포함되어 있는 정보를 바탕으로 파일시스템이 부팅을 진행하게 됩니다.

 

BPB에 포함되어 있는 내용을 확인해 보겠습니다.

FAT16 File System Format - BIOS Parameter Block Data

위의 항목중에서 FAT16과 FAT32와 공통적은 부분도있고, 고유한 부분도 존재합니다.

아래의 사진을 보시면 이해가 쉽게 될것 입니다. ( FAT32의 구조는 FAT32 File System Structure Analysis에서 알아볼 예정입니다. )

FAT16 File System Format - BIOS Parameter Block Layout

위 사진을 보면 0x00 ~ 0x23 까지는 공통적인 값들을 가지는것을 확인 할 수 있습니다.

 

1.4 Boot Code Error Message + Signature

위의 구조들을 제외하고 1섹터(1024byte)에서 남은 나머지의 부분을 Boot Code Error Message라고 이야기 하고 맨마지막 2바이트에 특정 시그니쳐가 들어 있습니다.

FAT16 File System Format - Boot Code Error Message + Signature

실제로 파란색 부분이 Error Message 를 담고 있고, 빨간색 부분이 Signature를 의미합니다.

FAT16 File System Format - Boot Code Error Message + Signature Contents

이 부분(0번섹터 전체) 까지가 Reserved Area입니다.

이제 FAT Area가 나올 차례인데 앞서 본 BIOS Parmeter Block 에서 0xE ~ 0xF 에 있는 값이 Reserved sector count로 FAT Area가 나오기전에 존재하는 섹터의 수가 적혀잇습니다.

 

해당 FAT File System 에서는 0x0002 이기 때문에 2번 섹터에서 FAT Area 가 있는 것을 확인 할 수 있습니다.

FAT16 File System Format - FAT16 Area Data

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

FAT Area은 두 가지의 영역으로 나뉘어 지는데, 일반적인 FAT Area 하나와 일반적인 영역의 백업본으로 구성되어 있습니다.

 

FAT Area의 위치를 구하는 방법은 바로위에서 구했기 때문에 그냥 넘어가도록 하겠습니다.

현재 사용하고 있는 USB FAT File System 에서의 FAT Area #1 은 2섹터인 0x400 부터 있습니다.

또한 FAT 16 이기 때문에 FAT 영역의 크기는 Reserved Area의 FAT Size 16 필드 에 있습니다.

FAT Size 16은 0x16 ~ 0x17 에 존재 하기 때문에 확인해 보면 0x00EF( 0xEF = 239 Sector = 0xEF * 0x200 = 0x1DE00 Byte ) 입니다.

 

이 영역에서는 뒤에 나오는 Data 영역에 할당 되어 있는 클러스터들의 상태를 표시합니다.

FAT16은 각각의 클러스터의 할당정보를 16Bit(2Byte) 크기로 설정되어 있습니다.

또한 해당 테이블은 클러스터를 Linked List 형식으로 관리를 합니다.

FAT16 File System Format - FAT16 Area Data

위의 FAT Area에서는 처음 2개의 엔트리에 특별한 값을 저장하고 그 뒤의 엔트리에서는 클러스터를 관리 하는 테이블 들이 나열 되어 있습니다.

FAT16은 FAT32와 달리 FAT 영역의 각 바이트( 2byte : FAT12/16 , 4byte : FAT32 )를 FAT Entry라고 이야기 합니다.

 

아래의 구조는 FAT16 File System의 FAT Area 영역을 자세히 그린 것입니다.

위의 구조에서 데이터 영역의 클러스터가 0번 부터가 아닌 2번부터 시작한다는 점이 좀 특이합니다.

0번과 1번은 미디어 타입과 파티션의 상태를 나타내기 위해서 사용합니다.

 

FAT 엔트리는 아래의 표와 같이 특별한 값을 가지게 됩니다.

FAT16 File System Format - FAT16 Area Cluster Data

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

그이유는 해당 FAT16 FileSystem 은 파일시스템 포맷을 하자마자 바로 본 Hex값 이기 때문에 클러스터가 하나도 없는것으로 보입니다.

 

3. Data Area

앞서 FAT 16 Area #1 과 #2 를 알아 보았습니다.

FAT16 File System Detail Layout

FAT16 File System 전체 구조를 확인해 보면 FAT Area #2 다음에 Root Directory 가 나오게 되는데 위치를 한번 알아 보겠습니다.

 

FAT Area 의 크기는 Reserved Area에서 0x16~0x17에 나타나 있습니다.

0xEF 로 되어 있기 때문에 239섹터를 의미합니다.

 

2섹터 + 239섹터 * 2 = 480 섹터 에 가보면 아래와 같습니다.

FAT16 File System Root Directory Hex Data

또한 위의 HEX값은 Data Area를 분석하기 위해서 아래와 같은 파일과 폴더를 추가 했습니다.

USB Data #1
USB Data #2
USB Data #3

위와 같은 폴더 들이 존재 합니다.

System Volume Information 폴더는 기본적으로 들어있는 폴더이고 data 라는 폴더에 data.txt, Digital Forensic.txt 라는 파일을 만들었습니다.

 

Data Area은 이름 그대로 데이터들이 저장되는 공간이며, Cluster 단위로 구성이 되어 있습니다.

데이터 저장형식으로는 파일과 디렉터리 2가지의 형태로 구분이 됩니다.

 

FAT32와 달리 FAT16은 FAT Area #2 바로 뒤에 Root Directory 가 오지만 FAT32는 데이터의 영역 아무 곳이나 루트 디렉터리를 위치 시킬수 있습니다.

위처럼 데이터 영역의 아무곳이나 루트 디렉터리를 위치하게한 이유는 FAT16처럼 위치를 FAT Area #2 바로 뒤에 위치 할시에 찾는것은 금방 찾을 수 있지만 디렉터리 갯수 제한(최대 32개 섹터 사용가능)이 존재 하기 때문에 바뀌었다고 합니다.

 

서브 디렉터리와 루트 디렉터리의 구조는 동일하기 때문에 분리시켜서 이해할 필요가 없을 것으로 보입니다.

 

FAT16의 루트디렉터리의 개수 제한은 512개( 32 Sector / Directory Entry Size = 16384/32 = 512 ) 입니다.

위와 같이 계산을 하셔도되고 Reserved Area에 Root Directory Entry Count 필드가 존재 하는데 여기서 값을 확인 할 수 있습니다.

FAT16 File Syst em Root Directory Entry Count Hex Data

Root Directory Entry Count = 0x200 = 512

 

FAT16 에서 Root Directory는 32섹터 이기 때문에 Root Directory의 Data Area의 위치는 480섹터 + 32섹터 = 512 섹터 입니다.

FAT16 File System Root Directory Data Area Hex Data

실제로 System Volume Information 안에 들어있는 파일들이 눈에 보입니다.

 

또한 Root Directory 개수는 512개로 한정적이지만 하위의 Sub Directory 의 개수는 무제한으로  제한이 없습니다.

 

아래의 사진은 위에서 여러번 봤을테지만 매우 중요한 구조사진 입니다.

FAT16 File System Detail Layout

이제 알아볼 내용은 Root Directory(루트 디렉터리) / Sub Directory(서브 디렉터리) 에 존재하는 구조인 Directory Entry를 다룰 예정입니다.

 

3.1 Root Directory / Sub Directory

Root Directory 영역과 Sub Directory 영역에서는 Directory Entry 라고 하는 구조체로 이루어져 있다.

FAT16 파디션에 저장되어 있는 파일과 디렉터리의 메타데이터가 들어있는 영역입니다.

 

직접 파일이나 디렉터리를 보지 않아도 기본적인 메타데이터를 HEX값으로 확인이 가능합니다.

여기에서 기본적인 메타데이터란?

파일 또는 디렉터리의 이름, 확장자, 생성 날짜/시간, 최종 실행 날짜, 최종 수정 날짜/시간, 할당 된 클러스터의 위치 등과 같은 정보가 담겨 있습니다.

 

파일의 메타 데이터를 저장하는 디렉터리 엔트리 구조는 32바이트로 구성되며 아래와 같은 구조를 띄고 있습니다.

FAT16 File System Directory Entry Layout

먼저 앞서 생성한 DATA 디렉터리를 HEX 값으로 한번 확인해 보겠습니다.

FAT16 File Syst em Directory Entry - File Name( Smaller than 7 bytes)

0x00 ~ 0x07은 File Name이 있는 필드 이다.

기본적으로는 아스키 코드값이 들어 있지만 0x00 offset 에 특수한 값이 들어 있는 경우가 존재합니다.

어떠한 경우에 0x00에 특수한 값이 들어가는지 확인해 보겠습니다.

└ 0x00 : 파일이름이 사용된 적이 없음

└ 0xe5 : 파일이 이미 삭제 되었지만 파일의 이름은 확인이 가능한 상태

└ 0x05 : 파일명의 첫번째 문자가 'σ' 인 경우 ('σ' 의 아스키 코드 값이 0xe5 이기 때문에 0x05로 표기됨)

 

파일이름의 길이가 7바이트 이하일 경우 전부 표시가 되고 위의 파일명처럼 4바이트라면 남은 부분은 0x20 으로 채워진다.

만약 파일 이름의 길이가 7바이트 보다 클경우에 아래와 같이 "파일명6바이트"~1 이라고 적히게 됩니다.

FAT16 File Syst em Directory Entry - File Name(Larger than 7 bytes)

7바이트 이하의 파일명을 가지고 있는 파일를 SFN(Short File Name)구조 라고 하고 7바이트 보다 큰 파일 명을 가진 파일을 LFN(Long File Name)구조 라고 합니다. 

 

LFN 은 SFN과 같이 따로 글을 올릴 예정입니다.

FAT16 File System Structure Analysis 에서는 SFN 만 다루겠습니다.

 

FAT16 File Syst em Directory Entry - File Extension

0x08 ~ 0x0A 은 파일의 확장자가 들어있는 공간입니다.

확장자가 없는 파일이라면 0x202020으로 채워 집니다.

 

FAT16 File Syst em Directory Entry - File Attribute

0x0B는 파일의 속성을 의미합니다.

해당 offset에 들어가는 값은 아래와 같습니다.

└ 0x01 : 읽기 전용 파일

└ 0x02 : 숨긴 파일

└ 0x04 : 운영체제 시스템 파일

└ 0x08 : 속성값 대신 디스크 볼륨 레이블을 포함한 엔트리를 나타냄

└ 0x10 : 서브 디렉터리를 가짐 (= 디렉터리 파일)

└ 0x20 : 일반 파일

 

FAT16 File Syst em Directory Entry - Reserved Area

이 영역은 예약된 영역입니다.

 

FAT16 File System Directory Entry - Time Stamp Data

표시한 부분을 순서대로 확인해 보면 아래와 같습니다.

Create Time : 생성 시간(0x5C49)

Create Date : 생성 날짜(0x5043)

Last Accessed Date : 마지막 접근 날짜(0x5047)

Last Written Time : 마지막 수정 시간(0x5C4A)

Last Written Date : 마지막 수정 날짜(0x5043)

 

각각의 Time Stamp 에서는 2바이트의 크기를 가지게 됩니다.

변환 방법은 2가지가 있는데 시간 과 날짜로 나눌수 있습니다. 시간은 Create Time을 예시로 변환을 하고, 날짜는 Create Date을 예시로 변환을 해보겠습니다.

 

먼저 시간 변환을 해보겠습니다.

0x5C49 를 2진수로 변환을 해보면 아래와 같습니다.

0x5C49 = 0101 1100 0100 1001 입니다.

 

5비트(hhhhh) / 6비트(mmmmmm) / 5비트(sssss)로 나눠 보면 아래와 같이 나눌 수 있습니다.

01011 / 100010 / 01001 로 변환이 가능합니다.

11시 34분 9초 로 해석이 가능합니다.

하지만 실제 폴더의 속성을 확인해 보면 11시 34분 18초로 나와 있는것을 확인할 수 있습니다.

FAT16 File Syst em Directory Entry - Create Time View

시간중 초에 해당 하는 부분은 hex값 *2를 해야한다고 합니다.

그렇기 때문에 11시 34분 9초로 해석한 시간에서 초만 *2한 결과 값인 11시 34분 18초로 해석을 해야 한다는 것 입니다.

 

 

이번에는 날짜를 한번 해석해 보겠습니다.

0x5043 을 2진수로 바꾸면 아래와 같습니다.

0x5043 = 0101 0000 0100 0011 입니다.

 

날짜는 시간과 달리  7비트(yyyyyyy) / 4비트(mmmm) / 5비트(ddddd)로 나눠야 합니다.

0101000 / 0010 / 00011 로변환이 가능합니다.

 

40 / 2 / 3 으로 나오는데 년도 부분이 조금 이상하다는 것을 알 수 있습니다.

그 이유는 년도에서 -1980 한 값이 들어있기 때문입니다.

 

그렇기 때문에 재대로 계산을 해보면 2020 / 2 / 3 으로 해석이 가능하다는 것을 알 수 있습니다.

FAT16 File System Directory Entry - Create Date View

이번에는 할당 된 클러스터의 시작 위치를 확인해 보겠습니다.

 

FAT16 File System Directory Entry - Starting Cluster

0x14 ~ 0x15 와 0x1A ~ 0x1B 에는 Starting Cluster 값이 들어 있습니다.

위의 값을 확인해 보면 0x00000005 인것을 확인 할 수있고, 해당 파일은 5번째 클러스터에 있다는 것을 알 수 있습니다.

 

클러스터는 FAT 영역이 끝나고 데이터 영역(Root Directory)부터 시작됩니다.

먼저 Root Directory 의 시작 섹터는 480 섹터 였습니다.

Root Directory의 시작 섹터인 480섹터 + 32섹터 = 512섹터가 클러스터2번이면서 Data Area의 시작 주소입니다.

 

그 이후부터 다음 클러스터의 섹터 값은 Reserved Area 에서 0x0D에서 표현된 Sector Per Cluster의 값에 따라 정해집니다.

FAT16 File System Reserved Area - Sector Per Cluster

0x40 = 64 이므로 클러스터 3번은 512섹터 + 64섹터 인 576섹터 입니다.

 

그렇다면 앞서 DATA 디렉터리의 하위 디렉터리및 파일은 클러스터 5번 위치에 있다고 했기 때문에 

 

512섹터(2번) + ((5-2)*64섹터) = 512섹터 + 192섹터 = 704섹터에 존재 하게되는 것입니다.

FAT16 File System Sub Directory of Root Directory

실제로 data 디렉터리 하위에 존재하는 data.txt 와 Digital Forensic.txt가 존재합니다.(파일명은 Hex값에서 전부 대문자로 표기 됩니다.)

 

해당 디스크 이미지의 섹터를 한번에 표현을 하자면 아래와 같습니다.

FAT16 File Syst em Detail  Layout & Sector and Cluster Value

이번엔 마지막 필드 인 파일 크기 필드를 알아 보겠습니다.

FAT16 File System Directory Entry - File Size

파일 크기를 나타내는 필드 이지만 해당 파일은 디렉터리 이기 때문에 크기가 없습니다.

 

Root Directory를 시작으로 Sub Directory, Directory Area 의 모든 내용은 Directory Entry 구조를 가지고 있습니다.

그렇기 때문에 위에 나와있는 구조를 이용해서 적용을 해보시면 확인이 가능합니다.

 

3.2 Unallocated Area(비할당 영역)

비할당 영역은 디렉터리 엔트리 정보가 사라지고 파일 데이터만 남아있는 공간을 뜻합니다.

FAT영역에서 0x00의 값을 갖는 클러스터가 비할당 클러스터인데 이부분을 순차적으로 연결하면 데이터 카빙이 가능해집니다.

  • c0wb3ll 2020.04.12 04:25 신고

    ㅇ0ㅇ 항상 좋은 글 써주셔서 감사합니다. ㅎㅎ!

    • ws1004 2020.04.12 04:54 신고

      감사합니다 ㅎㅎ 매일매일 더좋은 글을 적어볼 수 있도록 노력하겠습니다.

      또한 보고 싶은 주제가 있으시면 주제 추천 해주세요 ㅎㅎ 공부 소재 주시면 공부하고 블로그로 옮겨 보겠습니다 ^^