IT 그리고 정보보안/Knowledge base

FAT (File Allocation Table) 32

plummmm 2021. 4. 10. 06:37
반응형

FAT16에 대해 알아봤으니, 이제 마지막으로 FAT32 파일시스템에 대해 알아보고 NTFS로 넘어가야겠다.
(exFAT도 있지만.. 이건 추후에 다룰게요.)

FAT32은 FAT12, FAT16 과 구조가 좀 다르다. (뭐 사실 달라봐야 거기서 거기이긴 함;;) FAT32 내용을 작성하면서 FAT16과 동일한 부분은 간단하게 언급하고.. 그 외 부분에 대해 상세히 기술하겠습니당~ 아 그리고 FAT16 구조분석 포스팅 2개를 다 보고 왔다는 가정하에 작성할 것이니 안보셨음 보고 오셈
먼저 전체적인 구조를 그림으로 살펴보자.

1. FAT32 전체 구조

FAT32 파일시스템 전체 구조 (데이터영역 같은 유동적인 부분은 임의 작성)


FAT16과 비교하면, 비슷한 듯 다른 구조를 지니고 있다. 가장 두드러진 차이를 보이는 영역은 예약된 영역인데, 기존에 CPU Jump ~ Signature 까지가 예약된 영역이었다면, FAT32는 추가로 FSINFO, 추가적인 예약된 영역이 존재한다. 그리고 BPB도 구조가 좀 다르다.
글로만 설명하는 것보다 직접 그림을 보며 확인하는 것이 더 이해가 잘 될 것 같다. 바로 디테일하게 들어가자.

2. Reserved Area (예약된 영역 = VBR) - 1 Sector
FAT12, FAT16은 예약된 영역의 크기가 1 sector 였다. (물론, 예약된 영역이 끝난 후 FAT영역이 나올 때 까지 더 많은 영역이 할당되어 있지만)
FAT32는 파일시스템에 필요한 플래그 값들이 좀 더 추가되어 32 Sector만큼의 크기를 사용한다. 추가된 영역에는 FSINFO(FileSystem Information)과 추가적인 예약된 영역이 있다.

예약된 영역(= 부트섹터)은 보통 6번째 Sector에 백업본이 있다.



2.1. CPU Jump Command (0x0000 - 0x0002, 3 byte)
CPU명령 실횅 분기를 부트코드로 옮기는 명령이다. FAT12/16은 [EB 3C 90], FAT32는 [EB 58 90], NTFS는 [EB 52 90] 등 형태가 다양하다.
중간에 위치한 값이 Jump할 부트코드의 Offset 주소이다. FAT16 포스트에서는 [EB 3C 90]으로 확인되었지만 아래 캡쳐그림을 보면 [EB 58 90]이 세팅돼 있음

* FAT32 File System Format Disk dump - Jump command to Boot code


2.2. BPB = BIOS Parameter Block (0x0003 - 0x0059, 87 byte)

FAT16에서는 BPB 크기가 59 byte 였는데, FAT32에서는 87 byte로 늘어났다. 늘어난 만큼 Boot code & Error message 영역이 줄어들었음
첫 부분부터 'Total sector 32'가 위치한 0x0023 offset 까지는 동일한 구조이지만, 그 이후부터 FAT32는 추가적으로 속성 필드를 갖고 있다.

* FAT32 File System Format Disk dump - BIOS Parameter Block


아래 표들을 보고 BPB의 구성이 어떻게 돼있는지 알아본다.

Address range size Field Name Description
 0x0003 – 0x000A 8 byte  OEM ID   OEM(Original Equipment Manufacturer) 식별자.
 이 영역을 참조하는 작업은 없음, 단지 OEM을 나타내는 부분
 0x000B – 0x000C 2 byte  Bytes per sector  한 섹터 당 할당되는 byte 크기
 0x000D – 0x000D 1 byte  Sectors per cluster  한 클러스터 당 할당되는 섹터 수
 0x000E – 0x000F 2 byte  Reserved sector count  FAT Area가 나오기 전에 예약된 영역의 섹터 수
 0x0010 – 0x0010 1 byte  Number of FAT  FAT Area의 개수, 통상 #1, #2로 두개 있음
 0x0011 – 0x0012 byte  Root directory entry count   FAT12 / FAT16의 할당된 루트 디렉토리 엔트리 개수
 (FAT32 0으로 세팅)
 0x0013 – 0x0014 byte  Total sector 16   볼륨 상에 있는 총 섹터수
 0x0015 – 0x0015 byte  Media Type  볼륨에 어떤 미디어가 저장되어 있는지 나타냄.
 (
플로피디스크를 제외하고 모두 0xF8)
 0x0016 – 0x0017 byte  FAT size 16   FAT Area의 섹터 수를 나타냄.(FAT32에는 쓰이지 않음)
 0x0018 – 0x0019 byte  Sector per track  트랙 당 섹터 수 
 0x001A – 0x001B byte  Number of heads   헤더 수
 0x001C – 0x001F byte  Hidden sectors  볼륨 앞에 숨겨진 섹터 수
 0x0020 – 0x0023 byte  Total sector32  볼륨 상에 있는 총 섹터수
 (Total sector 16에서 표현이 불가능하면 이 필드를 쓰는듯..)

이 부분까지는 FAT16과 동일한 구조이다. 아래 0x0024 부터 나오는 BPB 필드들은 FAT32에만 존재하는 것들이다.

Address range Size Field Name Description
 0x0024  0x0027 4 byte FAT Size 32 FAT영역 하나의 할당된 크기
0x0028 - 0x0029 2 byte Ext flags FAT영역을 여러 개 사용할 경우를 위한 설정값
0x002A - 0x002B 2 byte FileSystem Version 파일시스템의 버전
0x002C - 0x002F 4 byte Root Directory Cluster 루트디렉토리가 위치한 클러스터 값
0x0030 - 0x0031 2 byte FileSystem Information FSINOF 구조체가 저장된 섹터 위치
0x0032 - 0x0033 2 byte Backup Boot Record 백업된 부트섹터의 섹터 위치값 (보통 0x06)
0x0034 - 0x003F 12 byte Reserved 사용안함
0x0040 - 0x0040 1 byte Drive Number x86 계열에서 사용하는 INT 0x13 사용시 필요한 필드
(Floppy=0x00, Hard Drvie=0x80)
0x0041 - 0x0041 1 byte Reserved 사용안함
0x0042 - 0x0042 1 byte Boot signature 확장부트 서명
0x0043 - 0x0046 4 byte Volume Serial Number 해당 볼륨의 고유 시리얼 번호가 기록됨
0x0047 - 0x0051 11 byte Volume Label 해당 볼륨 레이블
0x0052 - 0x0059 8 byte FileSystem Type 파일시스템 형식

여기까지가 FAT32의 BPB 필드 내용이다. 그 이후에는 FAT16과 마찬가지로 부트코드 및 에러메세지, 시그니쳐가 포함된다.

2.3. Boot code & Error messages / Signature (0x005A - 0x01FF, 422 byte)

Address range size Field Name Description
 0x005A – 0x01FD  420 byte   Boot code Error massage  부트코드 에러 메세지 
 0x01FE – 0x01FF  2 byte   Signature  서명 0x55 0xAA 


3. FSINFO = File System Information (1 Sector)
FSINFO 구조체는 보통 맨 처음 나오는 부트섹터 바로 다음에 위치한다. FAT32에서 처음 등장하는 구조체로, 전체적인 클러스터의 여유 공간 관리에 대한 내용이 담겨있다. FAT16에서는 사용 가능한 클러스터 공간을 FAT Entry를 통해 하나씩 탐색해야 했다면, FAT32는 이 FSINFO 구조체의 필드들을 확인하여 빠르게 탐색이 가능하다는 장점이 있다.
FSINFO 영역은 7번째 Sector에 백업본이 있다.

* FAT32 File System Format Disk dump - FSINFO Structure


FSINFO 구조체를 보면 좀 특이하다. 1 Sector를 쓰면서 대부분이 사용되지 않는 영역이다. 아래 표를 참고하여 세부내용을 알아보자.

Address range Size Field Name Description
 0x0000  0x0003 4 byte Signature 고정된 시그니쳐값 (0x41615252)
0x0004 - 0x01E3 480 byte not used not used
0x01E4 - 0x01E7 4 byte Signature 고정된 시그니쳐값 (0x61417272)
0x01E8 - 0x01EB 4 byte Number of free Clusters 사용 가능한 클러스터 수
0x01EC - 0x01EF 4 byte Next free Cluster 사용 가능한 클러스터 시작 위치
0x01F0 - 0x01FD 14 byte not used not used
0x01FE - 0x01FF 2 byte Signature 고정된 시그니쳐값 (0x55 0xAA)

위 표를 토대로 예제 캡쳐 화면을 확인하면, 여유 클러스터는 0x0001ECE0 = 126,176개이다. 클러스터 당 할당 용량이 4096 byte 니까, 계산하면 총 492MB가 사용가능한 상태가 된다. 실제로 확인해봐도 동일한 결과가 나온다.

예제 FAT32 디스크 사용가능 공간


그 다음, 사용가능한 첫 클러스터의 주소가 0x00000022 로 나타난다. 이 것은 클러스터 넘버를 의미한다. 22번째 클러스터부터 사용가능하다는 의미,
해당 테스트용 디스크에 txt파일을 1byte 기록 후 저장하고 다시 Next free  Cluster를 확인하니 0x00000023으로 확인됨


4. More Reserved Area(추가적인 예약된 영역) - 크기 유동적
추가적인 예약된 영역은 이름 그대로 예약된 영역이 모자라는 경우에 쓰라고 할당해 놓은 것이다. 이 추가적인 예약된 영역의 맨 처음 1 Sector는 부트섹터의 부트코드 영역이 부족할 경우를 대비하여 할당(부트코드 추가 할당 <- 이라고 쓰겠음) 된 것인데, 8번째 Sector에 백업본이 있다.
그 뒤에는 만약을 대비하여 할당된 영역들이다. 예제 디스크 캡쳐를 보면 "Reserved Sector count"가 0x184A(=6218) 인데, 할당된 영역이 무려 6218 Sectors나 된다. 기본적으로 사용하는 "예약된 영역 + FSINFO + 부트코드 추가할당" *2(각각의 백업본) 총 6 Sectors를 제외하면 모두 만약을 대비하여 할당된 영역이라는 뜻이다.
 

5. FAT(File Allocation Table) Area - 크기 유동적
FAT32에서도 마찬가지로 FAT영역을 찾기 위해선 "Reserved Sector count" 필드를 확인한다. 금방 추가적인 예약된 영역에서 보았듯이, 0x184A(=6218)로 세팅 돼있으므로 시작지점에서 6218섹터 만큼 이동하면 FAT영역이 등장한다. (FAT16에서 FAT 영역 위치가 6 Sector 였던 것에 비해 엄청 멀리 있음;)

* FAT32 File System Format Disk dump - FAT Area


FAT16에서는 FAT영역의 크기를 "FAT Size 16"이라는 BPB 필드에서 확인했지만, FAT32에서는 새롭게 추가된 "FAT Size 32"의 값을 보고 확인한다.
FAT32에선 "FAT Size 16" 필드가 쓰이지 않으므로 '0x0000' 으로 세팅돼 있다. 해당 필드로 표현할 수 있는 주소가 16 bit 뿐이라서 새로 필드를 추가한듯..
파일시스템 숫자가 16 -> 32 로 늘어난 만큼, FAT Entry(클러스터 할당정보를 나타내는 테이블)의 크기도 2배로 늘어났다.
FAT12는 12 bit, FAT16는 16 bit, FAT32는 32 bit이다.

FAT32 에서도 이전 버전과 마찬가지로 FAT Entry 첫번째, 두번째는 특별한 내용이 포함된다. 최초 4 byte에는 Media type, 그 다음 4 byte에는 Partition state 값이 설정돼있다. 실제 데이터 영역의 클러스터들에 대한 FAT Entry는 3번째 Entry부터 시작한다고 보면 된다. 각 엔트리들에 할당된 값들이 뜻하는 내용은 아래 표를 참고하면 될 것 같다.



6. Data Area (데이터 영역)
내용이 FAT16과 동일하여.. 똑같은 내용을 굳이 복붙할 필요가 없다고 느껴 설명은 넘어간다. (http://s2kiess.blog.me/221158543853 참고)
차이점 한 가지만 설명하겠다. 먼저, FAT16에서의 루트 디렉토리는 위치가 반드시 FAT 영역 바로 뒤에 와야했다. 하지만 FAT32에서는 루트 디렉토리의 위치를 바꿀 수도 있다. (바꿀 수 있긴하지만 보통 FAT영역 바로 뒤에 온다.) 그 위치는 BPB 필드 중 "Root Directory Cluster"를 확인하면 된다.

 

참고 URL
http://forensic-proof.com/archives/372
https://m.blog.naver.com/PostView.nhn?blogId=bitnang&logNo=70184195032&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F
https://en.wikipedia.org/wiki/Design_of_the_FAT_file_system
http://hyd3.tistory.com/125
http://forensic.korea.ac.kr/DFWIKI/index.php/%EA%B5%AC%EC%A1%B0%EB%B6%84%EC%84%9D/FAT
http://www.tavi.co.uk/phobos/fat.html


참고 자료
(FP) FAT12,16,32 FileSystem.pdf - 제작자 : JK Kim

참고 도서
<START UP 디스크 포렌식> - 저자 : 이별
<파일시스템 포렌식 분석> - 저자 : 브라이언 캐리어

 

반응형