Digital Forensics/File System

#1 MBR - Master Boot Record

geunyeong 2021. 12. 26. 21:38

Table of Contents

    Abstract

    MBR은 도스 파티션 시스템의 다른 이름이다. 본 글에서는 볼륨과 파티션의 차이에 대해 간단하게 짚어보고 도스 파티션 시스템을 해석하는 방법을 알아본다. 도스 파티션은 446 바이트의 부트 코드와 64 바이트의 파티션 테이블, 2 바이트의 부트 레코드 시그니처로 나뉜다. 부트 레코드는 운영체제가 설치된 부팅 가능한 파티션을 찾아 해당 파티션에 저장된 VBR로 점프하는 역할을 하며, 파티션 테이블은 파티셔닝 된 디스크에서 각 파티션의 시작 위치와 크기를 나타낸다.

    MBR

    Partition & Volume

    먼저 파티션과 볼륨에 대해 알아보고 넘어가자. 흔히 파티션과 볼륨을 혼용해서 쓰기도 하고, 크게 구분하지 않는 탓에 동일한 것으로 취급하지만 둘은 엄연히 다르다.

    파티션은 물리적인 디스크의 저장 공간을 논리적으로 나눈 것이다. 쉽게 말해 몇번 섹터부터 몇개 섹터만큼 각 파티션 영역의 범위를 나타내는 것이다. 때문에 어느 파티션은 몇번 섹터부터 몇개 섹터를 자신의 영역으로 가지고, 또 다른 파티션은 몇번 섹터부터 몇개 섹터를 자신의 영역으로 가지는 지를 나타낸 정보가 필요하다. 우리는 이러한 정보가 담긴 영역을 Partition Table이라고 한다. 그래서 파티션을 추가하는 건 쉬워도 기존 파티션의 용량을 늘리거나 줄이는 일은 힘들다. 이 경우 해당 파티션 정보 담긴 Partition Table Entry를 삭제하고, 새 Partition Table Entry를 작성해야 하기 때문이다.

    볼륨은 하나의 파일 시스템을 갖춘 저장 영역을 의미한다. 운영체제나 어플리케이션들이 파일을 저장하고 읽고, 쓸 수 있는 영역이다. Windows는 볼륨으로의 접근을 위해 C:, D: 같은 Driver Letter를 볼륨마다 할당하고, Linux 계열은 루트 디렉토리 하위의 임의의 디렉토리에 원하는 볼륨을 Attach하는 형태로 볼륨 접근 인터페이스를 제공한다. Windows에서는 기본적으로 하나의 파티션에 하나의 파일 시스템 구조라 파티션=볼륨으로 취급해도 큰 무리가 없지만, RAID 처럼 여러 개의 파티션을 하나로 묶고 이렇게 만들어진 거대한 파티션에 하나의 파일 시스템을 할당하면 하나의 볼륨에 여러 개의 파티션이 담긴 형태가 만들어지는 것이다. 이렇게 보면 개념상 볼륨 ≥ 파티션처럼 보이지만 APFS처럼 하나의 파티션에 여러 개의 볼륨이 존재할 수도 있다. 이처럼 파티션과 볼륨은 누가 더 큰 개념이다로 나타낼 수 없다.

    파티션은 물리적 디스크의 저장 영역을 나눈 것이고, 볼륨은 운영체제나 어플리케이션이 디스크에 파일을 읽고 쓸 수 있도록 접근 인터페이스가 만들어진 영역이라고 생각하면 된다.

    DoS Partition

    우리가 흔히 MBR이라고 부르는 파티션 형식은 사실 도스 파티션이다. 1980년대 소규모 시스템 용으로 설계되었는데, 정확한 명세가 제공되지 않고 있다. Microsoft에서는 도스 파티션 시스템을 MBR(Master Boot Record) 디스크라고 하고 있다. 그 옛날 도스 시스템을 비롯해 오늘날 윈도우, 리눅스 등 다양한 시스템이 도스 파티션 시스템을 지원하고 있다.

    도스 파티션 시스템은 디스크의 첫 섹터(일반적으로 512바이트)에 부트 코드와 파티션 테이블을 가지고 있다. 파티션 테이블은 최대 4개의 파티션 엔트리를 저장할 수 있는데, 얼핏 간단한 구조일 것으로 보이지만 적은 수의 파티션 테이블 엔트리를 확장하기 위해 확장 파티션이라는 기능을 제공하다 보니 의외로 복잡한 구조를 가진다는 게 특징이다.

    아래 그림은 도스 파티션의 구조를 보기 쉽게 나타낸 것이다.

    시작 바이트 오프셋 바이트 크기 영역
    0 446 부트 코드
    446 64 파티션 테이블
    510 2 부트 레코드 시그니처

    DOS Partition Structure

    Boot Code

    0 바이트 오프셋부터 445 바이트 오프셋 까지 446 바이트가 부트 코드다. 위 그림에서 붉게 표시된 영역이다. 부트 코드는 파티션 테이블에서 부팅 가능한 파티션을 찾아 해당 파티션의 부트 코드로 점프하는 역할을 한다. 텍스트로 디코딩된 영역을 보면 "Invalid partition table", "Error loading operating system", "Missing operating system" 같은 에러 메시지도 볼 수 있다. 내용에서 알 수 있듯 파티션 테이블을 분석하고 부팅 가능한 파티션을 찾는다는 걸 알 수 있다.

    부트 코드에서 에러 메시지의 뒷 부분중 440 바이트 오프셋부터 443 바이트 오프셋까지 4바이트는 디스크 시그니처를 나타낸다. 디스크 매체를 고유하게 식별하는데 사용되는 32비트 값으로, Windows NT 버전 3.5부터 도입되어 지금은 Linux 2.6 이상 등 다양한 시스템에서 사용하고 있다. 

    DOS Partition Disk Signature

    Windows에서 현재 시스템에 연결된 디스크 장치의 디스크 시그니처들은 레지스트리에서 볼 수 있다.

    HKLM\SYSTEM\MoutedDevices\

    MountedDevices Registry

    MountedDevices 레지스트리에는 현재 시스템에 Attach된 물리/가상 디스크들을 볼 수 있다. 각 디스크는 \DosDevices를 접두사로 하는 MS-DOS Device Name 형식으로 Windows 시스템에서 접근할 수 있는데, MountedDevices 서브키에 해당 이름이 Value로써 존재한다. 각 Value의 Data는 바이너리 데이터가 저장되는데, 이 중 첫 4바이트가 부트 코드에서 볼 수 있는 디스크 시그니처다. 위 그림의 첫 4바이트인 'AF 1C 4F C2'와 DoS Partition Disk Signature 그림의 디스크 시그니처를 비교하면 동일하다는 걸 알 수 있다.

    디스크 시그니처 뒤 2바이트는 복사 방지된 경우 '5A 5A'로 설정된다고 한다.

    Partition Table

    446 바이트 오프셋부터 509 바이트 오프셋까지 64 바이트가 파티션 테이블이다. 파티션 테이블의 각 엔트리는 16바이트 크기이기 때문에 도스 파티션의 파티션 테이블에는 최대 4개 엔트리가 저장될 수 있다. 확장 파티션 기능을 이용하면 그 이상도 가능하다.

    파티션 테이블 엔트리의 구조는 아래와 같다.

    Partition Table Entry Structure

    부팅 플래그는 운영체제가 설치된 파티션, 즉 부팅 가능한 파티션임을 나타내기 위한 필드다. 운영체제가 설치되지 않은 저장장치(외장하드 등)나 멀티 부팅 시에는 필요하지 않다. 부팅 가능한 파티션인 경우 0x80, 그렇지 않으면 0x00 값을 가진다.

    파티션 시작 CHS 주소와 끝 CHS 주소는 파티셔닝 된 영역의 시작 섹터 주소와 마지막 섹터 주소를 CHS(Cylinder, Head, Sector) 형식으로 나타낸 값이다. CHS 주소는 3바이트 크기인데 실린더가 10비트, 헤드가 8비트, 섹터가 6비트를 차지하는 구조다. CHS는 8기가 바이트 이하 디스크에서만 사용 가능하기 때문에 오늘날엔 CHS 주소 필드는 사실상 의미를 갖지 못한다. 

    파티션 타입은 해당 파티션에 적용된 파일 시스템을 나타낸다. 대표적으로 0x07은 NTFS, 0x83은 Linux 파일 시스템, 0xA8은 Mac OS X를 나타낸다. 더 많고 자세한 파티션 타입 값은 아래 링크를 참조하자.

    https://www.win.tue.nl/~aeb/partitions/partition_types-1.html

    시작 LBA 주소는 파티셔닝 된 영역의 시작 섹터 LBA를 나타낸다. 끝 주소를 나타내는 CHS 방식과 다르게 모든 물리적 섹터를 리니어하게 취급하는 LBA 방식은 끝 LBA가 아닌 파티셔닝 된 영역이 가지는 섹터의 개수를 추가적으로 가진다. 때문에 LBA 방식에서 마지막 섹터 주소를 구하는 방법은 시작 LBA에 크기(섹터 개수)를 더하는 것이다. 보통 이 마지막 섹터 위치에 VBR 백업본이 있는 경우가 있으니 알아두면 유용하다.

    Signature

    바이오스는 운영체제를 부팅하기 위해 디스크의 첫 섹터(섹터 0)을 읽어들이고 부트 코드를 실행하게 된다. 부트 코드를 실행하기 전에 읽어들인 첫 섹터의 마지막 2바이트가 Boot Record Signature인 '55 AA'인지를 검사하는데, 이 시그니처가 올바르지 않으면 올바르게 부팅되지 않는다. 비단 MBR 뿐만 아니라 여타 파일 시스템의 VBR에도 부트 시그니처인 '55 AA'가 존재한다.

    Github

    https://github.com/geun-yeong/mbr_parser

    MBR 파서로 MBR 이미지를 전달하면 아래와 같이 출력된다.

    MBR Parser Result

    'Digital Forensics > File System' 카테고리의 다른 글

    #3 GPT - GPT 복구  (0) 2022.01.08
    #2 GPT - GUID Partition Table (2)  (0) 2022.01.08
    #1 GPT - GUID Partition Table (1)  (0) 2022.01.06
    #3 MBR - 파티션 테이블 복구  (1) 2022.01.02
    #2 MBR - Extended Partition Table  (0) 2022.01.02