## What is VBR? VBR은 Volume Boot Record의 줄임말로 컴퓨터를 부팅하는데 필요한 코드(부트 코드), NTLDR 가 들어있는 영역이다. 그 크기가 가변적인데, 클러스터 단위를 기준으로 가변적이다. 바로 밑에서 다루도록 할 예정이다. VBR 영역에서는 OEM ID나, 부트코드, 볼륨 크기, MFT 시작 주소, 클러스터의 크기와 같은 정보가 들어있다. > [!Note] Cluster 란? > 디스크 공간에서 파일을 저장하기 위해 할당하는 가장 작은 단위의 크기 > > [!Note] NTLDR? > NT Loader 를 의미하는 말이다. 마이크로소프트 윈도우 계열 운영체제들을 부팅하게 하는 영역이다. > ![[Untitled 10.png]] ## 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] **TIP!** > VBR 사이즈가 얼만큼인지 모르겠다 싶을 때 > `0x55AA`라는 Footer(End Signature)를 찾으면 된다. > ![[Untitled 11.png]] | | | | | |---|---|---|---| |Offset|Size|Name|Description| |0x00|3|Jump CMD|0xEB는 JMP 명령어이다. 0x52는 어디로 Jump 할지, 그리고 0x90은 NOP다. <br>즉 0x52 오프셋(부트 코드)으로 가서 코드를 실행한다는 분기점이 되겠다.| |0x03|8|OEM-ID|Original Equipment Manufacturer Identification <br>즉 장치에 대한 ID를 나타내는데 어떤 파일시스템을 사용하는지를 여기서 확인해볼 수 있다. <br> <br>사진에서는 NTFS 파일시스템을 사용한다는 것을 알 수 있겠다.| |0x0B|2|Bytes in Cluster|하나의 클러스터가 몇 바이트로 구성되어 있는지 명시해준다. <br> <br>사진의 예시를 보고 2바이트라고 해석하면 큰일난다. <br>(혹시 2바이트라고 해석했다면 Endian에 대해서 검색해보고 오자)| |0x0D|1|Cluster in Sector|하나의 섹터가 몇개의 클러스터로 구성되어 있는지 명시해준다.| |0x0E|2|???|Reserved 영역이다. 뭔가 추후에 사용하기 위해서 비워놓은 값인데 아무 쓸모없는 부분이다.| |0x10|3|Padding|다른 파일시스템과의 호환성을 위해 0으로 기록되는 부분이다.| |0x15|1|Media Descriptor|디스크가 어떤 방식으로 운용되는지에 대한 정보이다. 비트 단위의 플래그를 활용한다. <br> <br>싱글 사이드/더블 사이드 <br>트랙 당 섹터 갯수 <br>트랙 밀도 <br>디스크 유형 <br> <br>과 같은 정보를 다룬다| |0x16|2|Padding|다른 파일시스템과의 호환성을 위해 0으로 기록되는 부분이다.| |0x18|2|Sector in Track|하나의 트랙이 몇개의 섹터로 구성되었는지 알려주는 값이다. <br>(NTFS에서는 크게 활용하지 않는 값이다)| |0x18|2|Number of Heads|헤드의 갯수이다. <br>(NTFS에서는 크게 활용하지 않는 값이다)| |0x1A|2|Hidden Sector|잘 모르겠다. FAT에서 사용하는 정보인듯 한데 좀더 알아보고 수정하겠다. <br>(NTFS에서는 크게 활용하지 않는 값이다)| |0x1C|12|???|Unused| |0x28|8|Number of Sectors|전체| |0x30|8|$MFT Cluster #|$MFT가 몇번째 클러스터에 위치해 있는지 알려주는 정보이다.| |0x38|8|$MFTMirr <br>Cluster #|$MFTMirr가 몇번째 클러스터에 있는지 알려주는 정보이다.| |0x40|4|Clusters in <br>FILE record|MFT 엔트리 사이즈를 의미한다. <br>엔트리 하나가 FILE 레코드로 구성되어 있다.| |0x44|4|Clusters in Index|인덱스 사이즈를 의미한다.| |0x48|8|VSN|볼륨 시리얼 번호 <br>볼륨 포맷 시간을 기준으로 하여 생성된다. <br> <br>실제 이용되는건 4바이트지만 나중에 시간값이 커지는 것을 고려하여 8바이트를 할당했다.| |0x50|4|Checksum|전체 VBR 영역에 대한 검증 값이다.| ## 백업 VBR의 경우 그 백업이 존재한다. NTFS, FAT 등 파일시스템 별로 백업 되는 위치는 다르지만 NTFS의 경우 VBR 주소 + 전체 크기 -1 부분에 백업본이 위치한다. `EB 52 90 4E 54 53 20 20 20` 시그니처 값을 검색해 본다면 찾아볼 수 있을 것이다. ## 결론 이걸 왜 알아야 하나? 라고 생각될 수 있는 부분이다. 그렇게 느끼는 이유는 요즘 도구들에서 이를 자동으로 분석해서 결과를 출력해 주기 때문에 그렇게 느껴진다고 생각한다. 실제로 VBR 영역에서는 운영체제의 아키텍쳐, 볼륨의 고유 식별자, 생성 시간, $MFT의 위치 등 많은 정보를 얻을 수 있는 영역인 만큼 간과하면 안된다. 아는만큼 보인다는 말이 있듯, 사소한 부분에서 정보를 놓쳐 전체 결과에 영향을 미치는 일이 없도록 하는 것이 중요하다고 생각한다.