안녕하세요 EnIaC 입니다.

오늘 공부할 내용은 바로 FAT32 중에서도 시작이라고 할 수 있는 BR 영역에 대해 공부 하기 전에 기존 FAT 들의 레이아웃을 한번 살펴보고 시작 하도록 하겠습니다.



0. FAT Layout

우선 저희가 살펴볼 FAT 는 FAT16 과 현재 많이 사용중인 FAT32 입니다. 이 둘을 비교하는 이유는 FAT32 의 이전 버전이 FAT16 이고 비교하며 공부할때 비슷한 구조를 띈 시스템이라 쉽게 공부할 수 있기 때문입니다. 우선 FAT16 에 대한 레이아웃은 [그림 1] 입니다.

※ 점선은 유동적임을 의미합니다.

[그림 1. FAT16 Layout]


보시면 아시겠지만 상당히 단순한 구조를 띄고 있습니다. 물론 기준은 현재 가장 가장 많이 사용하는 NTFS 와 차세대 파일시스템으로 개발된 REFS 에 반해 간단하다는거죠. ㅋㅋㅋ.... 그래도 그냥 봤을때 어느정도 쉽게 이해 가능할 것 같은 그런 구조를 띄고 있습니다. 다음 [그림 2] 에서는 FAT32 레이아웃을 보여줍니다.



[그림 2. FAT32 Layout]


FAT32 또한 굉장히 단순한 구조를 띄고 있음을 보여줍니다. 하지만 FAT16 과 다른점이 하나 있죠. 바로 Root Directory 에 관한 구조 입니다. FAT16 의 경우 루트 디렉토리가 고정 되어있는 반면, FAT32 는 유동적으로 DATA 영역 안에 어디서든 존재할 수 있습니다. 다만, FAT32 를 분석 해 보시면 아시겠지만 대부분 거의 Cluster 2 에 루트 디렉토리를 위치 시킵니다. 이론적으로는 DATA 영역 어디든 존재할 수 있지요.



1. BR, BootRecord

이제 드디어 BR 영역이네요. BR 즉, BootRecord 단어 뜻에서 부터 벌써 느낌아닌 느낌이 오기 시작합니다. Boot 에 관한 내용을 Record 즉, 기록한 영역이라는 뜻이겠죠. 대부분 기술적 내용은 외국에서 만들어져서 영문 뜻을 그대로 직역만 해도 대충 무슨 뜻인지 알 수 있는것들이 대부분 입니다. 이 부트레코드가 정확히 어떤 역할을 하는지 한번 알아보도록 하겠습니다.

시스템은 우선 MBR 영역으로 부터 LBA Addr 를 제공 받아 특정 파티션의 BR 영역을 찾아갈 수 있습니다. 이전 강의 [제 3강] 에서 MBR 영역 분석에 대해 다루어 봤으니 LBA Addr 정도는 찾아가실 수 있으리라 봅니다. 이제 LBA Addr 를 계산해서 직접 FAT32 의 BR 로 이동 해 보도록 하겠습니다. 아래는 실제 필자의 VM 환경에서 촬영한 [그림 3] 입니다.


[그림 3. MBR Partition Table LBA Addr]


보시면 아시겠지만 Partition Table 영역에서 첫번째 파티션을 보고 있습니다. 그중 LBA Addr 은 빨간색 네모칸으로 표시 해 두었습니다. [그림 3] 에서 볼 수 있듯 첫번째 LBA Addr 은 바로 0x00000800 임을 알 수 있습니다. 따라서 10진수로 변환을 해주게 된다면 2048 이 되겠죠. 바로 2048이 첫번째 파티션의 시작을 알리는 BR 영역의 주소를 알려주는것 입니다.


자 그럼 위에서 구한 2048 (단위 : Sector) 로 이동 해 보도록 하겠습니다. 2048 섹터로 이동하게 되면 아래 [그림 3-1] 과 같은 화면을 볼 수 있습니다.


[그림 3-1. FAT32 Boot Record]


위 그림이 바로 FAT32 의 BR 영역 입니다. FAT32 BR 중에서도 저희가 중요시 봐야할 영역은 시작 섹터로부터 Offset 6번 까지 입니다. 따라서 96Byte 를 중요시 봐야 한다는 얘기죠.

이제 그 96Byte 영역을 좀더 확대해서 보도록 하겠습니다. 아래 [그림 3-3] 로 정리 합니다.

그리고 [그림 3-3] 을 쉽게 이해하기 위해 BR 에서 관여하는 영역을 색깔 별로 나누어 그려보자면 [그림 3-2] 와 같습니다.



[그림 3-2. FAT32 Partition Layout]


1. Boot Record : 1 Sector, Boot Record는 볼륨의 첫 번째 섹터이자 Reserved Area의 첫 번째 섹터이다. 이 영역에는 부팅하기 위한 Boot Code와 함께 FAT 파일 시스템의 값들이 저장되어 있으며 BIOS Parameter Block(BPB)라고도 한다.

2. Reserved Area : 32 Sector(이중 맨처음 1 Sector는 Boot Record), 나중을 위해 비워둔 예약된 공간이다.

3. FAT #1 / FAT #2 : 클러스터를 관리하기 위한 테이블이 모여 있는 공간으로 이 공간은 HDD 내의 파일들과 연결된 클러스터에 대한 정보들이 있으므로 만약 손상이 되면 해당 파일을 사용할 수 없게 된다. 이 때문에 FAT #1과 동일한 정보를 FAT #2에 백업하여 두게 된다.

4. Root Directory : Data Area 내의 아무 곳에나 존재해도 관계 없으며 그 위치를 Boot Record에 기록하게 된다. 하지만 FAT 32 이전의 파일 시스템 즉 FAT 16등에는 FAT 영역 바로 다음에 Root Directory 가 존재하였으므로 일반적으로는 FAT 32에서 역시 FAT 영역 바로 뒤에 둔다.

5. Data Area : 파일 또는 디렉토리가 저장되어있는 영역으로 이전 영역과의 차이는 이전 영역의 경우 Sector 단위로 읽기 쓰기를 하지만 Data Area의 경우 Cluster 단위로 읽기와 쓰기를 진행한다.



[그림 3-3. FAT32 Boot Record Detail]


저희가 중요시 보아야 할 목록을 뽑아보자면 아래와 같습니다.

1. Jump Boot Code (부팅 가능한 파티션이라면 부트 코드로 이동)

2. Byte Per Sector (한 섹터당 몇 바이트를 할당 할 것인지)

3. Secter Per Cluster (한 클러스터당 몇 섹터를 할당 할 것인지)

4. Reserved Sector Count

5. Number of FATs (기본값 0x02)

6. Total Sector 32 (= MBR Partition Table - Size in Sector)

7. Boot Record Backup Sector


1-1. FAT32 area, analyzing and Introduction

1. Jump Boot Code : Boot Code 로 점프하기 위한 코드

2. OEM Name : OEM 회사를 나타내는 문자열이 들어있음

3. Bytes per Sector : 한 개 섹터를 구성하는 바이트 수

4. Sector per Cluster : 한 개 클러스터를 구성하는 섹터 수 → Sector Per Cluster * Bytes Per Sector = Cluster 의 크기

5. Reserved Sector Count : [그림 3-1]의 Reserved Area 의 섹터 개수

6. Number of FATs : 해당 볼륨에 존재하는 FAT 영역의 개수

7. Root Directory Entry Count : Root Directory 내에 몇 개의 파일/디렉토리를 수용할지에 대해 기록하는 항목으로 반드시 Bytes Per Sector의 짝배수로 구성이 되어야 한다. 하지만 FAT 32에서는 반드시 0으로 채워져야한다.

8. Total Sector 16 : FAT 16에 해당되는 항목으로 FAT 32에서는 0으로 채워진다.

9. Media : 해당 볼륨에 어떤 미디어가 저장되어있는지 기록되며 플로피 디스크를 제외한 모든 장치의 경우 0xF8로 기록이 된다.

10. FAT Size 16 : FAT 영역의 섹터 수를 저장하는 부분으로 FAT 32에서는 0으로 채워진다.

11. Sector Per Track : Track 당 Sector의 개수를 의미하는데 Window 계열에서는 더이상 이 값을 참조하지 않는다.

12. Number Of Heads : 해당 저장 장치의 헤더 수를 의미하며 Window 계열에서는 더이상 이 값을 참조하지 않는다.

13. Hidden Sector : 해당 볼륨 앞의 숨겨진 섹터 수를 의미하며 Window 계열에서는 더이상 이 값을 참조하지 않는다.

14. Total Sector 32 : 해당 볼륨 상의 총 섹터 수를 의미한다. (MBR 에서 Size in Sector)

15. FAT Size 32 : FAT 영역의 섹터 수를 의미하는데 이 수는 FAT #1 과 FAT #2의 합산이 아닌 한 개의 FAT 영역의 섹터 수를 의미한다.

16. Ext Flags : FAT 테이블의 사용 여부 등의 여러가지 설정 값을 기록한다.

17. File System Version : FAT32의 버전 정보로 상위 1Byte는 주, 하위 1Byte는 부 버전을 의미한다. 하지만 실제로는 특정 값이 적히지 않고 0x00으로 기록된다.

18. Root Directory Cluster : FAT32는 이전 버전들과는 달리 Root Directory가 Data Area 내 아무 위치에 와도 상관 없기 때문에 그 시작 위치를 Root Directory Cluster 에 기록한다.

19. File System Information : File System 구조체의 위치가 기록되나.

17. Boot Record Backup Sector : Boot Record 를 백업한 위치를 기록하는 것으로 일반적으로는 6번 섹터를 이용한다. 만약 이 위치에 0이 기록되어있다면 백업을 하지 않았음을 의미한다.

18. Reserved : 예약된 영역으로 항상 0으로 채워진다.

19. Dirve Number : Window 계열에서는 더 이상 참조하지 않는다.

20. Reserved1 : Windows NT 계열에서 사용하려고 만든 예약된 영역이며 0으로 채워져 있다.

21. Boot Signature : 확장 부트 서명으로 0x29 라는 값이 들어간다(이후에 3가지 항목이 더 존재함을 의미).

22. Volume ID : 볼륨의 시리얼 번호

23. Volume Label : 볼륨 레이블을 적어준다.

24. ile System Type : 항상 FAT32로 적혀 있다.




위 표에 대한 정리는 아래의 표로 다시 한번 정리 하겠습니다.


2. FAT12 & FAT16 & FAT32 Common area

 범위 설명
 10진수 16진수
 0 – 2 0x0000 – 0x0002 Jump command to boot code (usually 0xEB5890)
 3 – 10 0x0003 – 0x000A OEM ID (Win95=MSWIN4.0, Win98=MSWIN4.1,
 Win2K/XP/Vista=MSDOS5.0, Linux=mkdosfs)
 11 – 12 0x000B – 0x000C Bytes per sector
 13 – 13 0x000D – 0x000D Sectors per cluster
 14 – 15 0x000E – 0x000F Reserved sector count (FAT12/16=1)
 16 – 16 0x0010 – 0x0010 Number of FAT tables
 17 – 18 0x0011 – 0x0012 Root directory entry count (FAT12/16=512, FAT32=0)
 19 – 20 0x0013 – 0x0014 Total sector 16 (FAT12/16=variable, FAT32=0)
 21 – 21 0x0015 – 0x0015 Media Type
 22 – 23 0x0016 – 0x0017 FAT size 16 (FAT12/16=variable, FAT32=0)
 24 – 25 0x0018 – 0x0019 Sector per track (typically 32 for hard drive)
 26 – 27 0x001A – 0x001B Number of heads (typically 255 for hard drive)
 28 – 31 0x001C – 0x001F Hidden sectors
 32 – 35 0x0020 – 0x0023 Total sector32


3. FAT12 & FAT16 Additional data structure

 범위 설명
 10진수 16진수
 36 – 36 0x0024 – 0x0024 INT 0x13 drive number (Floppy=0x00, Hard Drvie=0x80)
 37 – 37 0x0025 – 0x0025 Not used
 38 – 38 0x0026 – 0x0026 Boot signature
 39 – 42 0x0027 – 0x002A Volume serial number
 43 – 53 0x002B – 0x0035 Volume label (ASCII)
 54 – 61 0x0036 – 0x003D File system type
 62 – 509 0x003E – 0x01FD Boot code and error message
 510 – 511 0x01FE – 0x01FF Signature (0x55AA)



4. FAT32 Additional data structure

 범위 설명
 10진수 16진수
 36 – 39 0x0024 – 0x0027 FAT size 32
 40 – 41 0x0028 – 0x0029 Ext flags
 42 – 43 0x002A – 0x002B FAT32 volume version
 44 – 47 0x002C – 0x002F Root directory cluster offset
 48 – 49 0x0030 – 0x0031 FSINFO(File System INFOrmation) offset
 50 – 51 0x0032 – 0x0033 Backup boot sector offset
 52 – 63 0x0034 – 0x003F Reserved
 64 – 64 0x0040 – 0x0040 INT 0x13 drive number (Floppy=0x00, Hard Drive=0x80)
 65 – 65 0x0041 – 0x0041 Not used (typically 0)
 66 – 66 0x0042 – 0x0042 Boot signature
 67 – 70 0x0043 – 0x0046 Volume serial number
 71 – 81 0x0047 – 0x0051 Volume label (ASCII)
 82 – 89 0x0052 – 0x0059 File system type
 90 – 509 0x0060 – 0x01FD Boot code and error message
 510 – 511 0x01FE – 0x01FF Signature (0x55AA)



다시한번 정리 하자면 FAT32 의 BR 에서 36Byte 는 이전 FAT16 과 동일한 구조를 띄고 있으며 FAT32 에서만 추가된 영역은 그 다음부터 있습니다.


이로써 FAT32 BR 에 대한 이야기가 끝났네요. 다음 강의에서는 FAT32 BR 영역 바로 다음에 오는  FSINFO (File System Infomation) 영역에 대해 간단하게 이야기 해 보도록 하겠습니다.


감사합니다.




WRITTEN BY
EnIaC
WhiteHackerGroup 『LockDown』 EnIaC 입니다.

,