예약된 영역(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  0×0000 – 0×0002  Jump command to boot code
 FAT32
 FAT12/16  3 – 61  0×0003 – 0x003D  BIOS Parameter Block (BPB)
 FAT32  3 – 89  0×000 – 0×0059
 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  0×0000 – 0×0002  Jump command to boot code (usually 0xEB5890)
 3 – 10  0×0003 – 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  0×0010 – 0×0010  Number of FAT tables
 17 – 18  0×0011 – 0×0012  Root directory entry count (FAT12/16=512, FAT32=0)
 19 – 20  0×0013 – 0×0014  Total sector 16 (FAT12/16=variable, FAT32=0)
 21 – 21  0×0015 – 0×0015  Media Type
 22 – 23  0×0016 – 0×0017  FAT size 16 (FAT12/16=variable, FAT32=0)
 24 – 25  0×0018 – 0×0019  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  0×0020 – 0×0023  Total sector32

 

[ FAT12/16 ] 추가적인 데이터 구조

 범위  설명
 10진수  16진수
 36 – 36  0×0024 – 0×0024  INT 0×13 drive number (Floppy=0×00, Hard Drvie=0×80)
 37 – 37  0×0025 – 0×0025  Not used
 38 – 38  0×0026 – 0×0026  Boot signature
 39 – 42  0×0027 – 0x002A  Volume serial number
 43 – 53  0x002B – 0×0035  Volume label (ASCII)
 54 – 61  0×0036 – 0x003D  File system type
 62 – 509  0x003E – 0x01FD  Boot code and error message
 510 – 511  0x01FE – 0x01FF  Signature (0x55AA)

 

[ FAT32 ] 추가적인 데이터 구조

 범위  설명
 10진수  16진수
 36 – 39  0×0024 – 0×0027  FAT size 32
 40 – 41  0×0028 – 0×0029  Ext flags
 42 – 43  0x002A – 0x002B  FAT32 volume version
 44 – 47  0x002C – 0x002F  Root directory cluster offset
 48 – 49  0×0030 – 0×0031  FSINFO(File System INFOrmation) offset
 50 – 51  0×0032 – 0×0033  Backup boot sector offset
 52 – 63  0×0034 – 0x003F  Reserved
 64 – 64  0×0040 – 0×0040  INT 0×13 drive number (Floppy=0×00, Hard Drive=0×80)
 65 – 65  0×0041 – 0×0041  Not used (typically 0)
 66 – 66  0×0042 – 0×0042  Boot signature
 67 – 70  0×0043 – 0×0046  Volume serial number
 71 – 81  0×0047 – 0×0051  Volume label (ASCII)
 82 – 89  0×0052 – 0×0059  File system type
 90 – 509  0×0060 – 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  0×0000 – 0×0003  Signature (0×41615252)
 4 – 483  0×0004 – 0x01E3  Not used
 484 – 487  0x01E4 – 0x01E7  Signature (0×61417272)
 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의 예약된 영역 섹터 수를 확인한 후 접근해야 한다.

Tagged with:
 
  • 이루니

    File System 세미나 준비하면서 정말 많은도움이 된것같습니다.
    최고의 블로그인것같아요
    감사합니다.

    • http://forensic-proof.com 프로니어

      ㅡㅡ;;