본문 바로가기

File System

MBR(Master Boot Record) Partition Structure Analysis

이번에 분석 해볼 파일은 물리적인 저장 장치에서 확인 할 수 있는 영역인 MBR 파티션 영역 입니다.

최근에는 HDD 라고 불리는 하드디스크 뿐만 아니라 솔리드 스테이트 드라이브 라고 불리는 SSD 가 생겨났습니다.

 

SSD의 등장에 따라서 디스크의 용량이 증가 함에 따라서 MBR의 한계이 생기게 되었습니다.

그래서 MBR이 다룰수 있는 용량의 제한으로 인해서 MBR 대신 GPT(GUID Partition Table) 라고 불리는 영역이 생기게 되었습니다.

이번 포스팅에서는 MBR 만 다루고 다음 포스팅에 GPT를 자세히 다뤄 보겠습니다.

 

MBRMaster Boot Record 의 약자로 저장매체의 첫번째 섹터인(0번섹터)에 위치하는 512바이트 크기의 영역입니다.

 

저장장치의 구조를 한번 살펴 보면 아래와 같은 구조를 띄고 있습니다.

Abstract Sturcture of Storage System

앞에서 말했다 싶이 MBR 이라고 불리는 영역은 저장 장치 에서 0섹터에 위치해 있습니다.

MBR은 모든 저장 장치의 가장 처음에 존재하는 구조로 최근에는 MBR의 단점을 보완한 GPT 가 사용됩니다.

 

MBR Slack 영역은 MBR과 VBR의 사이에 있는 영역으로 낭비 되는 공간 입니다.

해당 영역에 부트킷, 랜섬 웨어와 같은 악성코드가 악용되는 공간 이기도 하면서, 보안 솔루션으로 사용되는 공간이기도 합니다.

 

윈도우 XP/2K3 는 VBR의 위치가 63섹터 라고 이야기를 하고 윈도우 Vista/7/8의 VBR의 위치가 2048 섹터라고 이야기 합니다.

좀더 정확한 VBR의 위치는 뒤에서 다뤄볼 MBR의 파티션 테이블에 적혀있는 hex 값을 확인 하는 것이 정확합니다.

 

VBR 영역은 볼륨의 시작에 위치하는 구조로 VBR에는 해당 볼륨의 파일 시스템의 메타 데이터(BPB)가 있고, 부트로더 로딩 코드를 담고 있습니다.

볼륨의 부트로더를 로딩해서 운영체제를 부팅시키는 코드를 VBR 이라고 합니다.

 

Volume Data 영역은 파일 시스템에 의해서 할당 된 볼륨의 데이터가 들어있는 공간으로 메타 데이터와 파일의 데이터로 구성되어 있습니다. 

Volume Data 영역의 상세한 내용은 각 파일시스템 분석 자료를 읽어보시는 것을 추천 드립니다.

 

이제 MBR의 구조를 한번 알아 보겠습니다.

MBR은 저장장치의 첫번째 섹터 512바이트 크기의 영역을 이야기 합니다.

MBR Area Layout

위의 구조에 포함되는 내용은 아래의 표를 통해서 확인 할 수 있습니다.

MBR Area Chart

1. MBR Boot Code 

 

MBR Boot Code는 부팅시에 POST 과정 이후에 저장매체에 존재하는 첫번째 섹터를 호출 하게 되는데 그때 호출된 섹터에 존재하는 내용입니다.

운영체제를 부팅하기 위해서 진행하는 부팅과정을 간단하게 나타내면 아래와 같습니다.

 

BIOS -> Pre POST -> POST(Power On Self Test) -> MBR 읽어오기 -> VBR 읽어오기 의 과정으로 운영체제가 부팅이 됩니다.

 

저장장치 에서 첫번 째 섹터인 MBR은 자신의 부트 코드를 수행합니다.

 

부트 코드는 다음과 같은 작업을 합니다.

- MBR 파티션 테이블에서 부팅 가능한 파티션을 찾기

- 부팅 가능한 파티션을 찾았을 경우 해당 파티션 테이블에 적혀있는 VBR의 위치로 이동

- 부팅 가능한 파티션이 없을 경우, 오류 메시지를 출력

 

오류의 메시지는 부트 코드 아래 부분(0x163 ~ 0x1B1)에 적혀 있습니다.

Invalid partition table , Error loading operating system , Missing operating system

 

부트 코드를 확인해 보면 아래와 같습니다.

MBR Area - Boot Code hex data in HxD #1

위의 부트 코드에서 중요하게 봐야 하는 내용은 아래와 같습니다.

MBR Area - Boot Code hex data in HxD #2

0x1B5 ~ 0x1B7 은 Error Message Offset을 의미합니다.

0x1B8 ~ 0x1BB 는 Device GUID(MBR Device Signature)를 의미합니다. 

 

Device GUID는 레지스트리 키에서도 확인 할 수 있습니다.

HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices 하위에서 확인 할 수 있습니다.

Find Device GUID in Registry Key

위의 hex 데이터는 현재 D드라이브에 마운트가 된 디스크인데 위의 레지스트리 키를 보면 D드라이브에 마운트 되어있는 디스크의 GUID 값을 확인해 보면 F4 F5 0F 22 를 띄고 있는 것을 확인 할 수 있습니다.

나머지 00 00 10 00 00 00 00 00 값은 각 파티션의 시작 섹터의 위치를 의미합니다.

 

파티션 테이블 엔트리가 총 4개 까지 보유 할 수 있기 때문에 부팅 가능한 주 파티션은 4개 까지 생성이 가능합니다.

따라서 멀티 부팅할 경우에 4개의 운영체제를 설치 할 수 있습니다.

하지만 주 파티션이 아닌 데이터 저장을 위한 논리 파티션은 4개 이상 생성 하는 것이 가능합니다.

 

 

2. Partition Table Entry

 

파티션 테이블은 총 3가지의 종류 입니다.

- Primary Partition

- Extended Partition

- Logical Patition

 

이번에는 파티션 테이블 엔트리를 확인 해보겠습니다.

MBR Area - Partition Table Entry hex data in HxD

앞에서 이야기 했던것 처럼 MBR 영역에는 총 4개의 파티션 테이블 엔트리를 가지고 있습니다.

위의 HEX값을 구조로 한번 확인해 보겠습니다.

MBR Area - Partition Table Entry Layout

2.1 Boot Flag(0x1BE, 1Byte)

 

부팅 단계에서 해당 파티션이 부팅이 가능한지 아닌지 확인 할 때 쓰이는 Flag값입니다.

부팅 가능한 파티션 : 0x80

부팅 불가능한 파티션 : 0x00

 

2.2 Starting CHS Address(0x1BF~0x1C1, 3Byte)

 

시작 CHS 주소로 주소 지정 방식이 CHS일 경우에 파티션의 시작 위치를 담고 있습니다.

CHS 주소 지정방식은 하드디스크의 구조에서 실린더(C), 헤더(H), 섹터(S)를 기준으로 작성된 주소 방식 입니다.

 

2.3 Partition Type(0x1C2, 1Byte)

 

해당 파티션의 유형을 나타낸 값 입니다.

위의 디스크는 0x07 값을 띄고 있는데 0x07 값은 Advanced Unix, exFAT, NTFS 를 의미하는데 제가 사용하는 운영체제는 NTFS여서 저런 값을 갖습니다.

파티션 유형 값을 조작해서 숨긴 파티션을 생성할 수도 있습니다.

 

Type과 관련된 값은 아래의 URL에 정리가 잘 되어 있습니다.

Partition Type URL :  https://datarecovery.com/rd/hexadecimal-flags-for-partition-type/

 

2.4 Ending CHS Address(0x1C3~0x1C5, 3Byte)

 

주소 지정 방식이 CHS일 경우에 CHS 주소의 끝의 주소를 가지고 있습니다.

 

2.5 Starting LBA Address(0x1C6~0x1C9, 4Byte)

 

주소 지정 방식이 LBA일 경우에 파티션의 시작 섹터 위치를 가지게 됩니다.

위의 HEX값을 확인해 보면 0x800 으로 되어 있기 때문에 2048 섹터로 가보면 NTFS 파일시스템의 VBR을 확인 할 수 있습니다.

No.1 VBR Hex Data Layout

2.6 Size in Sector(0x1CA~0x1CD, 4Byte)

 

파티션 LBA 에 할당 된 총 섹터 수를 가지고 있습니다.

예시로 사용하고 있는 Hex 값을 파티션 크기를 확인해 보면 아래와 같습니다.

 

0xE8E07800 * 512(Sector Size) = 3,907,024,896 * 512 = 2,000,396,746,752‬ Byte = 1863.0146484375 GB

No.1 Partition Size

해당 파티션 테이블이 인식 가능한 최대의 파티션의 크기를 구해보면 아래와 같습니다.

0xFFFFFFFF * 512(Sector Size) = ‭4,294,967,295 * 512 = ‬ ‭2,199,023,255,552‬ Byte = 2 TB

Full Partition Size

3. Signature

 

시그니처의 구조를 확인해 보면 아래와 같습니다.

MBR Area - Signature Layout

시그니처 값은 0x55AA 라는 값을 가지고 있습니다.

 

 

번외로 파티션 테이블이 1개가 아닌 여러개인 디스크를 한번 확인해 보겠습니다.

 

위의 디스크는 파티션이 1개이기 때문에 파티션이 3개인 디스크 파일을 하나 만들어서 파티션 테이블을 확인 해보겠습니다.

New Partition Table Entry Hex Data in HxD

해당 값을 표로 나타내 보면 아래와 같습니다.

New Partition Table Entry Chart

파티션 1번 Starting LBA Address + 파티션 1번 Size in Sector 값을 연산해 보면 파티션 2번 Starting LBA Address 인것을 확인 할 수 있습니다.

0x00000800 + 0x00A00000 = 0x00A00800 이라는 것을 알 수 있습니다.