Forensic/파일-구조

FAT32(File Allocation Table) File System Structure

Ron Weasley 2022. 2. 13. 19:15

저번 시간에는 FAT16의 구조를 분석해봤습니다. 여기서 중간중간 FAT16의 내용이 나올텐데, 모르겠으면 여기를 참고해주시길 바라겠습니다. https://lemonpoo22.tistory.com/41

이번 시간에는 FAT32에 대해서 알아 보겠습니다.

FAT32는 FAT16보다 복잡한 파일 구조를 띄고 있습니다. 다음 그림은 FAT32의 구조입니다.

FAT12와 16은 Reserved Area영역의 크기가 1섹터로 고정적이지만, FAT32는 32섹터로 구성되어 있습니다.
그리고 FAT32의 Reserved Area의 32섹터중에서 0, 6은 Boot Sector, 1, 7은 FSINFO, 2,8은 Boot Strap입니다.

실습환경을 구축해, 분석을 진행하기 전 저는 2GB의 가상 하드를 FAT32로 포맷시켜 분석을 진행하겠습니다.

Virtual Disk Format FAT32

1. Reserved Area (예약된 영역) -> Boot Sector : 0, 6번 Sector

FAT32 파일의 0번 섹터에 존재하는 Reserved Area(예약된 영역)을 보겠습니다.

FAT32 File System Hex Data

 

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

Jump Command to Boot Code

이 부분은 Jump Command to Boot Code로써 CPU의 명령 실행 분기를 부트 코드로 옮기는 역할을 하는 영역입니다.
CPU Jump Command 라고도 불리며, 포맷된 파일 시스템에 따라 값이 다 다릅니다. 값은 다음과 같습니다.

File System Jump Command to Boot Code Value

위 예제의 Hex Data는 FAT32 파일 시스템으로 0xEB5890을 띄고있고, 리틀엔디안으로는 0x9058EB입니다.

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

Original Equipment Manufacturing ID

FAT12/16/32는 위 처럼 "MSDOS5.0" 으로 표시가 되며, NTFS 파일시스템은 NTFS와 공백을 표시하고 있습니다.
일종의 제조사 ID 같은형식으로 지정되어 있는 시그니처이며, 운영체제 버전별로 생성되는 값이 달라집니다.
( 리눅스는 mkdosfs 입니다 )

1-3) BPB(BIOS Parameter Block) (0x0B ~ 0x59, 78Byte)

BPB 영역을 그림으로 한번 보겠습니다.

FAT32 File System BPB Layout
FAT32 File System BPB

FAT16은 0x20에 있는 Total Sector32까지만 표현했습니다. 하지만 뒤에 FAT Size32부터는 FAT32 파일시스템에만 존재하는 영역입니다. BPB를 확인해보면 다양한 정보들을 포함하고 있는것을 알 수 있습니다. 우측에 FAT32라고 적혀있는 곳은 파일 시스템 종류가 적혀있습니다. 만약 FAT16이라면 FAT16이라고 적혀 있습니다.

즉, BPB영역에는 파티션 정보들을 포함하고 있어서 BPB에 포함되어 있는 정보들을 바탕으로 파일시스템이 부팅을 진행하게 됩니다. BPB에 포함되어 있는 영역들의 내용들을 세부적으로 보겠습니다.

BIOS Parameter Block


이 표를 보고 값을 찾아서 정보들을 얻으면 됩니다.

1-4) Boot Code Error Message (0x5A ~ 0x1FD, 419Byte)

Boot Code Error Message


이 부분은 Boot Code Error Message의 영역으로 에러 메세지를 뜻합니다.

1-5) FAT32 File System VBR Area Signature (0x1FE ~ 0x1FF, 2Byte)

VBR Area Signature

이 부분은 VBR영역의 시그니처입니다. 0x55AA로 고정입니다.

2. Reserved Area (예약된 영역) -> FSINFO : 1, 7번 Sector

FSINFO는 File System Information의 약자입니다.
FSINFO 구조체는 부트 섹터인 0섹터 다음에 위치합니다. 보시다시피 1섹터입니다.
FSINFO 구조체는 전체적인 클러스터의 여유 공간 관리에 대한 내용이 담겨 있습니다.

FAT16에서는 사용이 가능했던 클러스터 공간을 FAT Entry를 통해서 탐색을 하였으나,
지금 분석중인 FAT32에서는 FSINFO 구조체의 필드를 이용해서 탐색이 가능합니다.

FSINFO를 자세하게 보겠습니다.

FSINFO Layout

위 레이아웃에 포함된 내용을 세부적으로 표현했습니다.

FSINFO Data

FSINFO 구조체는 총 512Byte로 구성되어 있으며, 다양한 정보들을 얻을 수 있습니다. 하나씩 살펴보겠습니다.

2-1) Signature (0x00 ~ 0x03, 4Byte)

FSINFO First Signature

이 영역은 FSINFO 구조체의 시작을 나타내는 시그니처입니다.
다음 480Byte는 사용하지 않는 부분으로써, 생략하겠습니다.

2-2) Signature (0x1E4 ~ 0x1E7, 4Byte)

FSINFO Second Signature

이 영역은 FSINFO 구조체가 끝나기 전, 두 번째 시그니처입니다. 첫 시그니처가 "RRaA" 였다면, 이 시그니처는 대소문자를 뒤집은 "rrAa" 입니다.

2-3) Number of Free Clusters (0x1E8 ~ 0x1EB, 4Byte)

FSINFO Number of Free Clusters

이 영역은 Number of Free Clusters입니다. 사용 가능한 클러스터의 수를 나타냅니다.
0x0007F4FE는 10진수로 521,455입니다. 클러스터 당 이루고 있는 섹터는 BPB영역에서 확인 가능하며, 분석중인 디스크에서는 8개입니다. 그래서 1개의 섹터가 512Byte니까 521,455 * 8 * 512 = 2,135,879,680Byte 입니다.

여유 공간과 계산한 값이 일치합니다.

2-4) Next Free Cluster (0x1EC ~ 0x1EF, 4Byte)

FSINFO Number of Free Clusters

이 영역은 Next Free Cluster입니다. 사용 가능한 클러스터의 시작 위치를 나타내줍니다.
0x00000013으로 19번째 클러스터 입니다. 다음 14바이트는 사용하지 않으므로 생략 하겠습니다.

2-5) Signature (0x1FE ~ 0x1FF, 2Byte)

FSINFO Last Signature

이 영역은 FSINFO 구조체의 마지막 시그니처입니다. 부트 섹터와 같은 "55AA" 값을 가집니다.

3. BootStrap ->2번 8번 : Sector

BootStrap은 2번 섹터와 8번 섹터의 영역입니다. 이 영역은 부트 섹터의 부트 코드 영역이 부족할 경우, 추가적으로 사용할 수 있도록 존재하는 영역입니다. 따라서 추가적 작업이 필요하지 않을 경우 데이터가 비어있고, 이 부분에 데이터가 존재한다면 은닉된 데이터일 가능성도 있습니다.

4. FAT(File Allocation Table) Area

FAT Area는 2가지의 영역인 #1, #2로 나뉘어져 있는데, 하나는 원본 FAT Area이고, 나머지 하나는 백업용 입니다.

FAT32 Structure Layout

FAT Area는 데이터 영역의 클러스터 할당 상태를 표시합니다. 파일 시스템 종류에 따라서 FAT뒤에 붙은 숫자를 기준으로 할당 상태를 표시하므로, FAT32는 32Bit 즉, 4Byte로 데이터 영역의 시작 클러스터부터 마지막 클러스터까지의 할당 상태를 표시합니다.

FAT Area 위치를 찾는 방법에 대해서 설명하겠습니다. 먼저 BPB영역을 보겠습니다.

BPB Reserved Sector Count

BPB 영역에서 0xE ~ 0xF에 있는 Reserved Sector Count를 확인하면 FAT 영역이 나오기 전까지 예약된 영역이 몇 섹터인지 알 수 있습니다. 해당 영역을 보면 0x202A로 되어 있습니다. 0x202A는 10진수로 8,234로 8,234 섹터가 FAT Area의 시작 위치라고 볼 수 있습니다.

FAT32 Area #1

위에서 언급했듯이 FAT Area는 2개로 구성되어 있습니다.
그래서 FAT Area의 사이즈를 알아보기 위해서 BPB영역에서 0x24 ~ 0x27의 데이터인 FAT32 Size 라는곳을 보겠습니다.

BPB FAT32 Size

0x0FEB은 4,075섹터로 FAT Area의 크기는 4,075섹터인 것을 알 수 있습니다.
위에서 FAT Area #1의 시작 위치를 구했습니다. 그래서 두 개를 더해주면 FAT Area #2의 위치를 알 수 있습니다.
8,234 + 4,075 = 12,309섹터로 가시면 백업용 FAT Area #2가 존재하는 것을 알 수 있습니다.

FAT32 Area #2

위에서 FAT32 파일 시스템은 4Byte로 클러스터의 할당 유무를 표시한다고 하였습니다. 이 4Byte를 FAT Entry또는 클러스터 번호라고 하며, FAT32에서는 한 섹터 당 128개의 FAT Entry를 표현할 수 있습니다. 각 FAT Entry는 Data Area의 클러스터와 대응되며, 0번부터 대응되는 것은 아닙니다.
 
FAT Entry 구조는 다음과 같이 표현됩니다.

FAT Entry Structure Layout

Cluster가 0번부터 시작하지 않는 것을 확인할 수 있습니다. 0번 클러스터에서는 Media Type을 표현하고 1번 클러스터에서는 파티션 상태에 대해서 표현합니다. 실제로 클러스터 2번부터 실제 Data Area의 클러스터와 대응됩니다.

FAT Area #1 Media Type, Partition Status

이 부분이 Media Type과 Partition Status입니다.
FAT Entry는 다음과 같은 특별한 값을 가집니다.

FAT32 - FAT Entry Value

제가 분석하고 있는 실습환경에서는 주로 0x?FFFFFF8과 0x?FFFFFFF만 보이는 것을 확인할 수 있는데, 이유는 실습환경을 구축하고 바로 분석을 했기 때문에 그렇습니다.
 

5. Root Directory 위치

FAT32는 FAT12/16과는 달리 Root Directory는 Data Area의 영역 중 어느 곳에서 올 수 있다고 했습니다. 하지만 구조상, FAT Area가 끝난 바로 다음에 오게됩니다. 그래서 Root Directory의 위치를 찾아 보겠습니다.
 
Root Directory는 주로 클러스터 2번을 사용하기 때문에 BPB영역에서도 ( 0x2C ~ 0x2F )가 0x02인것을 볼 수 있다.
섹터로 찾아가려면 FAT Area #2의 시작 섹터 12,309 와  FAT Area의 사이즈인 4,075를 더한 16,384 섹터에서 Root Directory를 찾을 수 있었습니다.

Root Directory

System Volume Information이 디스크를 할당했을 때 바로 생기는 시스템 파일입니다.
 

6. Data Area

이 부분은 FAT16과 동일하기 때문에 링크를 드린 블로그에서 보면 될 것 같습니다.
https://lemonpoo22.tistory.com/41