File Systems2010/03/21 20:12
Proneer | Security is a people problem...


VBR (Volume Boot Record)



VBR(Volume Boot Record)는 NTFS 구조에서 가장 앞부분에 위치하는 영역이다. VBR은 FAT 예약된 영역과 유사하게 부트 섹터와 추가적인 부트 코드가 저장된다.



VBR의 크기는 고정된 크기를 가지지 않고 다음과 같이 클러스터 크기에 의존한다. 파일이 클러스터 크기로 할당된다는 점에서 이상하지 않을지 모르지만 앞서 FAT 파일시스템에서 예약된 영역이 파일시스템 타입에 따라 고정된 크기를 가지는 것과는 사뭇 다르다.

 Cluster Size (Byte) VBR Size (Sector)
 512  1
 1K  2
 2K  4
 4K  8


부트 섹터 (Boot Sector)
VBR의 첫 번째 섹터는 부트 코드를 포함한 부트 섹터가 위치한다. FAT 파일시스템 예약된 영역의 부트 섹터와 그 내용이 같다고 이해하면 될듯 하다. 결국, 클러스터 크기가 512인 경우는 VBR 자체가 부트 섹터가 된다. VBR 크기가 1섹터를 넘는 경우, 나머지 섹터들은 추가적인 부트 코드를 저장하기 위한 용도로 사용되거나 NTLDR(NT Loader)을 빠르게 로드하기 위해 NTLDR의 위치를 저장하기 위한 용도로 사용된다.

다음은 부트 섹터의 데이터 구조이다.

 Byte Range  Description
Decimal Hexadecimal
 0 - 2  0x0000 - 0x0002   Jump command to boot code (usually 0xEB5290)
 3 - 10  0x0003 - 0x000A  OEM ID (typically "NTFS      ")
 11 - 12  0x000B - 0x000C   Bytes per sector
 13 - 13  0x000D - 0x000D  Sectors per cluster
 14 - 15  0x000E - 0x000F  Reserved
 16 - 18  0x0010 - 0x0012  Always 0
 19 - 20  0x0013 - 0x0014  Unused
 21 - 21  0x0015 - 0x0015  Media descriptor
 22 - 23  0x0016 - 0x0017  Always 0
 24 - 25  0x0018 - 0x0019  Sector per track
 26 - 27  0x001A - 0x001B  Number of heads
 28 - 31  0x001C - 0x001F  Hidden sectors
 32 - 35  0x0020 - 0x0023  Unused
 36 - 39  0x0024 - 0x0027  Unused
 40 - 47  0x0028 - 0x002F  Total secotrs
 48 - 55  0x0030 - 0x0037  Logical cluster Number for the file $MFT
 56 - 63  0x0038 - 0x003F  Logical cluster Number for the file $MFTMirr
 64 - 67  0x0040 - 0x0043  Clusters per file record segment
 68 - 71  0x0044 - 0x0047  Clusters per index block
 72 - 79  0x0048 - 0x004F  Volume serial number
 80 - 83  0x0050 - 0x0053  Checksum
 84 - 509  0x0054 - 0x01FD  Boot code and error message
 510 - 511  0x01FE - 0x01FF  Signature ("0x55AA")

다음은 필자의 NTFS 부트 섹터를 덤프한 내용이다. 위의 데이터 구조와 함께 살펴보자.



VBR의 부트 코드 역시 MBR에서 부팅 가능한 파티션을 찾은 후 해당 볼륨의 첫 섹터로 점프한다. NTFS가 부팅 가능한 파티션일 경우 부트 섹터로 점프하면 위의 점프 명령어가 실행될 것이다. 점프 명령어는 BPB(BIOS Parameter Block)을 지난 오프셋 0x54로 점프하게 된다.

이후 BPB 항목을 참조하여 해당 볼륨의 운영체제를 로드하는 부트 코드가 실행된다. 위 부트 코드 역시 BIOS에서 해석 가능하도록 16비트 명령어로 이루어져 있다. 


추가적인 VBR 영역 (Bootstrap Code Area)
VBR의 첫 섹터를 제외한 나머지 섹터에는 일반적으로 NTLDR을 빠르게 로드하기 위해 NTLDR에 대한 정보와 추가적인 부트 코드가 저장된다. 다음은 VBR의 두 번째 섹터에 대한 덤프이다. 섹터의 윗부분에 NTLDR와 함께 "$I30"이라는 문자가 보일 것이다. "$I30"은 NTFS에서 $FILE_NAME 속성을 인덱싱할때 사용하는 인덱스 이름이다.

쉽게 말해 FAT 파일시스템의 루트 디렉터리부터 하위 디렉터리까지 탐색하기 위한 구조로 디렉터리 엔트리를 사용하였지만, NTFS에서는 이것을 위해 $FILE_NAME을 트리 형태로 인덱싱하여 하위 디렉터리를 빠르게 탐색할 수 있도록 지원한다. 결과적으로 NTLDR이 위치한 정보를 기록해 놓은 셈이 된다. 이로 인해 더 빠르게 NTLDR를 로드하여 운영체제를 부팅할 수 있게 만든다.



저작자 표시 비영리 변경 금지
Creative Commons License
Creative Commons License
Posted by Proneer

TRACKBACK http://forensic-proof.com/trackback/75 관련글 쓰기

댓글을 달아 주세요