zj3t

email: euntaejang@gmail.com

Latest Posts

FAT 파일시스템 – 예약된 영역 (Reserved Area)

By 오후 3:51

예약된 영역(Reserved Area)는 FAT 파일시스템에서 가장 앞 부분에 위치하는 구조로서 여러 개의 섹터로 구성된다. 예약된 영역의 크기는 기본적으로 FAT12/16 에서는 1 섹터, FAT32 에서는 32 섹터를 사용한다. 예약된 영역은 다시 부트 섹터(Boot Sector), FSINFO(File System INFOrmation) 섹터, 추가적인 섹터로 구분된다. 다음은 예약된 영역의 추상적인 구조이다.

1. 부트 섹터
부트 섹터의 크기는 1섹터로 FAT 파일시스템의 처음에 위치한다. 부트섹터(512 바이트)의 구조는 다음과 같다.
 FAT 형식 범위 설명
 10진수 16진수
 FAT12/16 0 – 2 0x0000 – 0x0002 Jump command to boot code
 FAT32
 FAT12/16 3 – 61 0x0003 – 0x003D BIOS Parameter Block (BPB)
 FAT32 3 – 89 0x000 – 0x0059
 FAT12/16 62 – 509 0x003E- 0x01FD Boot code and error message
 FAT32 90 – 509 0x005A – 0x01FD
 FAT12/16 510 – 511 0x01FE – 0x01FF Signature (0x55AA)
 FAT32

부트 섹터의 처음 3 바이트는 0x003E 또는 0x005A의 부트 코드로 점프하기 위한 점프 명령어가 위치한다. 이후 클러스터 크기, FAT 크기, 루트 디렉터리 위치, 총 섹터 수 등의 파일시스템 정보를 기록한 BPB 영역이 온다. 이후에는 해당 파일시스템을 부팅하기 위한 부트 코드가 위치한다. 부트 코드는 점프 명령에 의해 실행되는데 이때 BPB 정보를 참조하여 파일시스템을 부팅한다. (NTLDR : NT Loader 실행) 부트 코드 실행과정에서 정상적이지 않은 동작이 발생할 경우 저장된 에러 메시지를 출력하게 된다.
각 BPB 영역에 대해 자세히 살펴보면 다음과같다. 
[ FAT12/16/32 ] 공통된 데이터 구조
 범위 설명
 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

[ FAT12/16 ] 추가적인 데이터 구조
 범위 설명
 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)

[ FAT32 ] 추가적인 데이터 구조
 범위 설명
 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로 포맷한 후 덤프한 결과이다.
위의 부트 섹터는 볼륨의 0번째 섹터이다. FAT32의 경우에는 부트 섹터가 손상될 것을 대비하여 6번째 섹터에 내용을 백업해 둔다. 따라서, 파티션 복구 도구들의 경우에 부트 섹터가 정상적이지 않을 경우 백업되어 있는 부트 섹터를 복사하여 사용하여 복구하곤 한다.

2. FSINFO(File System INFOrmation)
FSINFO는 일반적으로 1번째 섹터(부트 섹터 다음)에 저장되는 구조 7번째 섹터에 내용을 백업해 둔다. 이것의 위치는 BPB에 정의되어 있기 때문에 임의로 지정이 가능하다. FSINFO 구조의 용도는 운영체제에게 첫 비할당 클러스터의 위치 전체 비할당 클러스터의 수를 알려준다.
이것이 무슨 의미가 있을까? 우선 첫번재 비할당 클러스터의 위치를 알려줌으로써 해당 볼륨에 저장하고자 하는 파일을 빠르게 할당할 수 있도록 도와준다. 그리고 전체 비할당 클러스터의 수를 통해 해당 파일이 볼륨에 할당 가능한지 여부도 알 수 있다. 특정 볼륨에 파일을 복사할 경우 여유 공간이 있는지 없는지를 파악하기 위해서는 기존에는 FAT 영역 전체를 검색해봐야 했다. 하지만 FSINFO 구조때문에 볼륨의 여유 공간을 빠르게 파악할 수 있다. 다음은 FSINFO 섹터의 데이터 구조이다. 
 범위 설명
 10진수 16진수
 0 – 3 0x0000 – 0x0003 Signature (0x41615252)
 4 – 483 0x0004 – 0x01E3 Not used
 484 – 487 0x01E4 – 0x01E7 Signature (0x61417272)
 488 – 491 0x01E8 – 0x01EB Number of free clusters
 492 – 495 0x01EC – 0x01EF Next free cluster
 496 – 509 0x01F0 – 0x01FD Not used
 510 – 511 0x01FE – 0x01FF Signature (0x55AA)
다음은 필자의 볼륨에서 FSINFO 섹터를 확인한 것이다. 내용에서 알 수 있듯이 여유 클러스터의 수는 0x032D70(208240) 이고, 첫 여유 클러스터의 주소는 0x48E1(18657) 이다.


3. 추가적인 예약된 영역
앞서 부트 섹터는 0, 6번 섹터를 사용하고, FSINFO는 1, 7번 섹터를 사용한다고 했다. 이외에도 2번 섹터는 부트 섹터의 부트 코드 영역이 부족할 경우 추가적으로 사용할 수 있는 섹터이다. 그리고 이 내용은 8번에 백업해 둔다. 이렇게 기본적으로 FAT32는 0, 1, 2, 6, 7, 8번의 섹터를 사용한다.
결과적으로 총 32섹터 중 6개 섹터만 사용하고 나머지 섹터는 만약을 대비해 예약되어 있다. 따라서 이러한 섹터는 일반적으로 어플리케이션에서 접근하지 않기 때문에 간혹 예약된 나머지 영역에 데이터를 숨겨두는 경우도 있다.

그렇다면 항상 FAT32에서 예약된 영역을 32섹터를 가질까? 다음은 필자의 USB를 FAT32로 포맷한 후 EnCase를 통해 해당 볼륨을 살펴본 것이다. 보는 바와 같이 예약된 영역이 38섹터의 크기를 가지고 있다. 결국, 예약된 영역은 장치 타입이나 포맷 소프트웨어에 따라 변할 수 있기 때문에 반드시 부트 섹터의 오프셋 14-15의 예약된 영역 섹터 수를 확인한 후 접근해야 한다.

You Might Also Like

0 개의 댓글