MBR(Master Boot Record), Partition Table 분석
DFIR/File System

MBR(Master Boot Record), Partition Table 분석

MBR이라는 용어를 들어보신 적이 있으신가요?

디스크 구조에 대해서 접해보셨다면 한 번 쯤은 들어보셨을지도 모르겠습니다.

이번 포스팅에서는 MBR이 뭔지, MBR의 구조는 어떻게 되어있는지에 대해서 알아보도록 하겠습니다.

MBR을 살펴보기에 앞서 GPT(GUID Partition Table)라는 개념이 있습니다.

이는 저장매체의 용량이 증가하게 되면서 MBR이 다룰 수 있는 용량적인 한계를 개선하기 위해서 도입된 개념입니다.

GPT에 대해서는 다음에 자세히 다뤄보도록 하겠습니다.


저장매체 구조

MBR(Master Boot Record)은 풀네임 그대로 부트레코드들의 마스터라고 보면 되겠습니다.

쉽게 얘기해서 컴퓨터가 부팅이 될 때 가장 먼저 참조하는 영역입니다.

저장매체를 섹터단위로 구분했을 때 0번 섹터에 MBR이 위치하게 되며 1섹터(512byte)를 차지하고 있습니다.

저장매체 구조

저장매체는 위와 같은 구조를 가지고 있습니다. 가장 앞인 0번 섹터에 MBR이 오고 그 뒤로 MBR Slack이 위치합니다.

그리고 볼륨의 개수만큼 VBR과 볼륨의 데이터 영역이 반복되는 형식입니다.

MBR 뒤에 오는 MBR Slack 영역은 역할이 정해져있지는 않고 비어있습니다. 그래서 악성코드나 기타 프로그램에 의해서 사용이 되는 경우가 있습니다.


MBR 구조

 

 

MBR은 위와 같이 446 byte의 부트 코드, 64 byte의 파티션 테이블, 2 byte의 시그니처 영역으로 구성이 되어 있습니다.

부트 코드 영역은 시스템을 부팅할 때 필요한 영역이며 파티션 테이블 영역은 파티션 하나 당 16 byte 씩 총 4개의 파티션에 대한 데이터가 저장되는 영역입니다. 시그니처 영역은 2 byte 크기인 0x55AA 값이 항상 고정되어 있으며 마지막에 위치하고 있어 MBR의 끝을 알 수 있는 값입니다.

위 사진에서 빨간색 네모 영역은 해당 저장매체의 GUID(Globally Unique Identifier) 값으로 저장매체의 고유 식별자 값입니다. 위 값은 레지스트리의 HKLM\SYSTEM\MountedDevices 에서도 확인할 수 있는 값입니다.

HKLM\SYSTEM\MountedDevices

 


Boot Code

컴퓨터가 부팅이 되면 다음과 같은 과정이 진행됩니다.

BIOS에 의해 POST(Power On Self-Test) 과정이 진행되고 추가 BIOS(SCSI, Video 등)가 로드됩니다. 이어서 POST 과정에 의해 처리된 데이터도 로드가 됩니다. 

앞선 과정을 거치고나면 주 하드디스크 드라이브의 MBR 부트 코드를 호출합니다. (주 하드디스크는 BIOS 셋업 설정에서 변경할 수 있음)

MBR의 부트 코드는 16bit 기계어 코드들로 이루어져 있습니다. 부트 코드는 MBR의 파티션 테이블을 참조하여 부팅이 가능한 파티션을 구분한 뒤, 해당하는 파티션의 VBR 부트 코드를 호출하는 기능을 수행합니다. 그러면 VBR의 부트 코드가 운영체제를 로드하는 것입니다. (윈도우즈는 VBR 부트 코드에서 NT Loader를 로드합니다)

(출처 : http://forensic-proof.com/archives/439)

 

BIOS -> POST -> MBR Boot Code -> MBR Partition Table -> VBR Boot Code -> OS Load

 


Partition Table

위에서 MBR의 부트 코드는 파티션 테이블을 참조하여 부팅이 가능한 파티션을 구분한다고 했습니다.

파티션 테이블의 종류에는 주 파티션, 확장 파티션, 논리 파티션 이렇게 있는데 이번 포스팅에서는 주 파티션에 대해서만 다루겠습니다. 주 파티션에는 부팅이 가능한 파티션으로 최대 4개까지 사용을 할 수 있으며 부팅 용도 외의 파티션은 추가로 생성이 가능합니다. 파티션의 개수가 4개가 넘으면 확장 파티션이라는 개념을 사용하게 되며 주 파티션의 4번째 파티션이 확장 파티션으로 지정이 되는데 이는 다음에 자세히 살펴보도록 하겠습니다.

그렇다면 파티션 테이블은 어떤 구조로 되어 있는지 살펴보겠습니다.

오프셋 크기 필드 네임
0x1BE ~ 0x1CD 16 byte Partition Table Entry #1
0x1CE ~ 0x1DD 16 byte Partition Table Entry #2
0x1DE ~ 0x1ED 16 byte Partition Table Entry #3
0x1EE ~ 0x1FD 16 byte Partition Table Entry #4

 

파티션 테이블은 16 byte 크기의 파티션 엔트리 4개가 순차적으로 저장이 되어 있으며, 하나의 엔트리에는 또 6가지 항목으로 나뉘게 됩니다.

 

오프셋 크기 설명 TMI
0x00 ~ 0x00 1 byte 부트 플래그 0x00 : 부팅 불가, 0x80 : 부팅 가능한 파티션
0x01 ~ 0x03 3 byte CHS Address 시작 주소 실린더, 헤드, 섹터에 기반한 주소 지정 방식 시작 주소
0x04 ~ 0x04 1 byte 파일시스템 타입 0x07 : NTFS, exFAT, HPFS | 0x0b, 0x0c : FAT32 등..
0x05 ~ 0x07 3 byte CHS Address 끝 주소 실린더, 헤드, 섹터에 기반한 주소 지정 방식 끝 주소
0x08 ~ 0x0B 4 byte LBA Address 시작 주소 섹터 단위에 기반하여 순차적으로 주소를 지정하는 방식
0x0C ~ 0x0F 4 byte 해당 파티션 총 섹터 수 해당 파티션의 총 섹터 개수

 

파티션 테이블은 사이즈를 따서 1,3,1,3,4,4로 쉽게 외울 수 있습니다.

숫자를 먼저 외우고 순서대로 설명을 외우니 금방 외워지더라구요 ㅎㅎ;

각 항목에 대한 설명은 간단하게 위 표에서 TMI로 작성을 해두었습니다.

추가적으로 설명이 필요한 부분은 CHS 주소지정방식과 LBA 주소지정방식에 대한 내용입니다.

CHS(Cylinder-Head-Sector) 주소지정방식은 예전에 사용하던 물리적인 구조를 기반으로 한 방식이며 저장매체의 용량이 커지면서 지금은 사용하지 않는 방식입니다. 현재에는 CHS를 대신해서 LBA 주소지정방식을 사용하고 있습니다.

LBA 주소지정방식은 물리적인 구조에 대한 정보가 불필요하며 48 bit 주소방식을 사용하여 고용량 디스크도 지원을 하는 주소지정방식입니다.

 

파티션 테이블 구조

 

파티션 번호 부트 플래그 CHS 시작주소 파일시스템 타입 CHS 끝주소 LBA 시작주소 파티션 섹터 수
No. 1 0x80 0x002120 0x07 0x06397F 0x00000800 0x00019000
No. 2 0x00 0x063A7F 0x07 0xFFFFFE 0x00019800 0x01644B93
No. 3 - - - - - -
No. 4 0x00 0xFFFFFE 0x27 0xFFFFFE 0x026F5000 0x0010A000

 

MBR은 리틀엔디안 방식을 사용하고 있기 때문에 파티션 테이블을 읽을 때 숫자를 뒤에서 부터 읽어줘야 합니다.

ex) 00080000 -> 0x00000800(2,048)

위 표에서 LBA 시작주소에 해당하는 값을 10진수로 변환하고 해당하는 값의 섹터로 이동을 하면 해당 파티션의 VBR 시작 영역이 나오게 됩니다.

첫 번째 파티션의 크기를 구하려면 파티션 섹터 수에 해당하는 값에 512byte(byte per sector)을 곱해주면 됩니다.

-> 0x19000(1,024,000) * 0x200(512) = 52,428,800 byte

이로써 첫 번째 파티션은 부팅이 가능한 파티션이며, VBR 시작 주소는 2,048 섹터, 크기는 52,428,800 byte, 파일 시스템은 NTFS를 사용중임을 알 수 있습니다.