VBR

What is VBR?

VBR은 Volume Boot Record의 줄임말로 컴퓨터를 부팅하는데 필요한 코드(부트 코드), NTLDR 가 들어있는 영역이다.
그 크기가 가변적인데, 클러스터 단위를 기준으로 가변적이다. 바로 밑에서 다루도록 할 예정이다.
VBR 영역에서는 OEM ID나, 부트코드, 볼륨 크기, MFT 시작 주소, 클러스터의 크기와 같은 정보가 들어있다.
Cluster 란? 디스크 공간에서 파일을 저장하기 위해 할당하는 가장 작은 단위의 크기
NTLDR? NT Loader 를 의미하는 말이다. 마이크로소프트 윈도우 계열 운영체제들을 부팅하게 하는 영역이다.

VBR Size

VBR은 그 크기가 가변적이라고 했는데 클러스터의 크기에 따라 달라지는 양상을 보인다.
아래 표에 제시된거와 같은 크기를 가지는데, 클러스터 크기 512바이트마다 1섹터씩 늘어난다고 생각하면 된다.
잘 짚고 넘어가야 하는 부분은 VBR 사이즈가 1섹터인 경우는 다른 컨텐츠 없이 부트 섹터만 들어있다고 봐도 무방하다. (부트 “섹터”인데 섹터가 한개만 있으니까)
Cluster Size
VBR Size
512 Byte
1 Sector
1024 Byte
2 Sector
2048 Byte
4 Sector
4096 Byte
8 Sector

VBR Contents

VBR 영역에는 그럼 어떤 정보가 있는지 확인해보도록 하자.
좀더 편하게 볼 수 있게 해당 오프셋에 맞는 범위에 색칠을 해 놓았다. 표와 매핑해서 볼 때 예시로 아래 사진을 참고하면 좀 더 도움이 될 것이다.
아래 표에 명시되어 있지 않은 항목 중 VBR 영역에 있는 내용은 부트 코드이다.
TIP! VBR 사이즈가 얼만큼인지 모르겠다 싶을 때 0x55AA라는 Footer(End Signature)를 찾으면 된다.
Offset
Size
Name
Description
0x00
3
Jump CMD
0xEB는 JMP 명령어이다. 0x52는 어디로 Jump 할지, 그리고 0x90은 NOP다. 즉 0x52 오프셋(부트 코드)으로 가서 코드를 실행한다는 분기점이 되겠다.
0x03
8
OEM-ID
Original Equipment Manufacturer Identification 즉 장치에 대한 ID를 나타내는데 어떤 파일시스템을 사용하는지를 여기서 확인해볼 수 있다. 사진에서는 NTFS 파일시스템을 사용한다는 것을 알 수 있겠다.
0x0B
2
Bytes in Cluster
하나의 클러스터가 몇 바이트로 구성되어 있는지 명시해준다. 사진의 예시를 보고 2바이트라고 해석하면 큰일난다. (혹시 2바이트라고 해석했다면 Endian에 대해서 검색해보고 오자)
0x0D
1
Cluster in Sector
하나의 섹터가 몇개의 클러스터로 구성되어 있는지 명시해준다.
0x0E
2
???
Reserved 영역이다. 뭔가 추후에 사용하기 위해서 비워놓은 값인데 아무 쓸모없는 부분이다.
0x10
3
Padding
다른 파일시스템과의 호환성을 위해 0으로 기록되는 부분이다.
0x15
1
Media Descriptor
디스크가 어떤 방식으로 운용되는지에 대한 정보이다. 비트 단위의 플래그를 활용한다. 싱글 사이드/더블 사이드 트랙 당 섹터 갯수 트랙 밀도 디스크 유형 과 같은 정보를 다룬다
0x16
2
Padding
다른 파일시스템과의 호환성을 위해 0으로 기록되는 부분이다.
0x18
2
Sector in Track
하나의 트랙이 몇개의 섹터로 구성되었는지 알려주는 값이다. (NTFS에서는 크게 활용하지 않는 값이다)
0x18
2
Number of Heads
헤드의 갯수이다. (NTFS에서는 크게 활용하지 않는 값이다)
0x1A
2
Hidden Sector
잘 모르겠다. FAT에서 사용하는 정보인듯 한데 좀더 알아보고 수정하겠다. (NTFS에서는 크게 활용하지 않는 값이다)
0x1C
12
???
Unused
0x28
8
Number of Sectors
전체
0x30
8
$MFT Cluster #
$MFT가 몇번째 클러스터에 위치해 있는지 알려주는 정보이다.
0x38
8
$MFTMirr Cluster #
$MFTMirr가 몇번째 클러스터에 있는지 알려주는 정보이다.
0x40
4
Clusters in FILE record
MFT 엔트리 사이즈를 의미한다. 엔트리 하나가 FILE 레코드로 구성되어 있다.
0x44
4
Clusters in Index
인덱스 사이즈를 의미한다.
0x48
8
VSN
볼륨 시리얼 번호 볼륨 포맷 시간을 기준으로 하여 생성된다. 실제 이용되는건 4바이트지만 나중에 시간값이 커지는 것을 고려하여 8바이트를 할당했다.
0x50
4
Checksum
전체 VBR 영역에 대한 검증 값이다.

백업

VBR의 경우 그 백업이 존재한다. NTFS, FAT 등 파일시스템 별로 백업 되는 위치는 다르지만 NTFS의 경우 VBR 주소 + 전체 크기 -1 부분에 백업본이 위치한다. EB 52 90 4E 54 53 20 20 20 시그니처 값을 검색해 본다면 찾아볼 수 있을 것이다.

결론

이걸 왜 알아야 하나? 라고 생각될 수 있는 부분이다. 그렇게 느끼는 이유는 요즘 도구들에서 이를 자동으로 분석해서 결과를 출력해 주기 때문에 그렇게 느껴진다고 생각한다.
실제로 VBR 영역에서는 운영체제의 아키텍쳐, 볼륨의 고유 식별자, 생성 시간, $MFT의 위치 등 많은 정보를 얻을 수 있는 영역인 만큼 간과하면 안된다.
아는만큼 보인다는 말이 있듯, 사소한 부분에서 정보를 놓쳐 전체 결과에 영향을 미치는 일이 없도록 하는 것이 중요하다고 생각한다.