Forensic/파일-구조

MBR(Master Boot Record) Structure

Ron Weasley 2021. 8. 16. 21:37

저번 시간에는 ZIP Structure(구조)에 대한 내용을 배워보았는데요. 이제는 FAT32, FAT16과 같은 파일 시스템들을 배우기 전에 하드 디스크의 첫번째 데이터 저장 공간(0번 섹터)인 MBR에 대해서 배워보겠습니다.
 

MBR이란?

파티션의 스타일을 가르키는 약자입니다. MBR은 물리적인 저장 장치에서 확인 할 수 있는 영역으로써, HDD(하드디스크)에 첫 번째 데이터 저장 공간(0번 섹터)를 뜻하며, 하드디스크의 파티션 정보를 지니고 있습니다. 이 영역은 512byte(바이트) 크기의 영역입니다. 하지만 단일 파티션에서는 MBR이 존재하지 않고, 다중 파티션의 경우 MBR이 존재합니다.

* Partition(파티션)
파티션은 단순하게 제한된 저장매체 공간(볼륨)을 보다 효율적으로 사용하기 위한 수단입니다. 한마디로 연속된 저장 공간을 하나 이상의 연속되고 독립된 영역으로 나누어서 사용할 수 있도록 정의한 규약이고 저장장치의 공간을 사용자가 필요에 맞게 논리적으로 나누어 사용합니다. 예를 들어 사무실에서 공간을 활용하기 위해 책상이나 책꽂이를 배치하는것과 같은 원리입니다. 파티션을 논리적으로 나누지 않는 것을 단일 파티션이라고 하고, 논리적으로 여러 개 나누는 것을 다중 파티션이라고 합니다. 그림을 한번 봅시다.

단일 파티션
다중 파티션

단일 파티션과 다중 파티션의 큰 차이점은 MBR의 존재 유무입니다. 공통적으로 파티션의 첫 번째 섹터에는 VBR이라는 Volume Boot Record가 위치하게 되는데, VBR은 파티션에 설치된 OS를 부팅 해주는 역할을 담당하고 있습니다. 즉, OS 실행을 위한 부트로더를 호출하게 됩니다. 단일 파티션의 경우, 파티션을 나누지 않았기 때문에 VBR이 MBR의 위치에 바로 기록되기 때문에 MBR의 영역이 필요가 없게 표현이 되고, 다중 파티션의 경우 각 파티션의 VBR 위치 정보를 저장하는 MBR이 필요하기 때문입니다.
 
* Volume(볼륨)
볼륨은 운영체제가 사용 가능한 섹터들의 집합입니다. 물리적으로 연속된 공간의 사용 여부와 관계없이 섹터들의 집합 개념인 것입니다.

* Sector(섹터)
섹터는 하드 디스크의 구조를 잘 알고있어야 하는데요. 쉽게 설명해서 하드디스크에 데이터를 저장하는 공간이 있습니다. 이것을 트랙(Track)이라고 부르는데 트랙을 잘게잘게 쪼갰을 때 작은 조각이 생길텐데 이 작은 조각을 섹터라고 부릅니다. 섹터는 하드 디스크에서 데이터 기록의 가장 작은 단위이며, 실제 데이터 저장으로 사용되는 영역은 512byte입니다.

하지만 최근 기술이 발달 하면서 SSD(Solid-State-drive) 가 생겨났습니다. 그리고 개개인이 사용하는 컴퓨터에 대한 디스크 용량이 크게 증가하면서 MBR의 한계점이 생기게 되었습니다. 왜냐하면 MBR이 다룰수 있는 용량이 2TB로 한정적이다 보니 한계에 다다른것입니다.
 

예) 하드 디스크가 4TB짜리가 한 개 있습니다. 이 하드 디스크를 MBR로 파티션을 설정하게 되면 나머지 2TB는 사용이 불가합니다.

이 한계를 극복하기 위해 2TB이상의 디스크에는 GPT(GUID Partition Table) 파티션 스타일을 사용하게 되는데 이 파티션 스타일은 MBR이 다룰 수 있는 용량을 극복하고 2TB이상의 디스크를 사용할 수 있습니다. 그렇다고 2TB이하인 디스크에는 꼭 MBR을 고집할 필요없이 GPT로도 파티션을 사용할 수 있습니다.

그러면 이제 저장 장치의 구조를 한번 살펴보겠습니다.

출처 : https://blog.forensicresearch.kr/11 

왼쪽에서부터 0번 섹터입니다. 위에서 말씀 드렸다시피 MBR은 섹터 0번에 위치하고 있습니다.
MBR은 모든 저장 장치의 가장 첫 번째에 존재하며, 512바이트의 크기를 가지고 있고, 최근에는 GPT가 사용됩니다.

MBR Slack영역은 MBR과 VBR사이에 존재하는 영역입니다. 낭비되는 공간이라고 불리며, 의미가 없는 공간입니다. 하지만 블랙햇에 의해서 랜섬웨어, 부트킷 등 악성 코드가 악용되는 공간이기도 하며, 보안 솔루션으로 사용되는 공간입니다.
크기는 운영체제마다 다 다르며 이렇게 구성 되어 있습니다.

Windows XP와 2K3는 VBR의 위치가 63섹터라고 이야기를 하고 윈도우 Vista/ 7 / 8은 VBR의 위치가 2048섹터라고 이야기를 합니다. VBR의 위치는 MBR의 파티션 테이블에 적혀있는 hex값을 확인하여 정확히 파악해 보겠습니다.

VBR(Volume Boot Record)영역은 볼륨의 시작에 위치하는 구조로, 볼륨의 클러스터 크기만큼 할당됩니다. VBR에는 해당 볼륨의 파일 시스템의 메타 데이터(BPB)가 있고, 부트로더 로딩 코드를 담고 있습니다. 볼륨의 부트로더를 로딩하여 운영체제를 부팅하기 때문에, 해당 영역이 손상되면 제대로 된 부팅이 불가능하게 됩니다.

(클러스터 : 여러 섹터를 묶은 파일 시스템에서의 파일 저장 시 최소 단위이며, 볼륨 포맷 시 지정)
(BPB : 볼륨과 파일 시스템구조 레이아웃에 관해 정보가 저장되어있는 block)


Volume Data영역은 파일 시스템에 의해 할당된 볼륨 데이터이므로, 파일의 전체적인 간단한 구조를 나타내는 메타데이터와 파일데이터로 구성되어 있습니다.

* 메타데이터 영역
디렉토리 및 파일의 구조를 표기하는 영역으로, 파일명, 타입, 위치, 크기, 시간정보, 날짜, 삭제 유무 등이 기록되어 있습니다. 파일 삭제 시 복구할 수 있는 이유는 실제 파일데이터 영역을 삭제하는 것이 아닌, 메타데이터 영역에 삭제 유무만 변경되기 때문입니다.

포렌식 조사관은 메타데이터 영역을 분석을 할 때 파일이 만들어진 날짜, 시간정보를 토대로 그 날짜와 시간대 별로 범위를 좁혀서 수사를 진행하지만, 파일은 쉽게 위.변조가 될 수 있기 때문에 무조건 이 범위내에 있다고 생각하면 안됩니다.

* 파일데이터 영역
삭제 파일의 데이터가 기록되는 영역입니다. 즉, 파일데이터 영역의 일부가 다른 데이터로 덮어 씌워진다면 복구가 불가능합니다.

이제부터 MBR의 구조를 살펴보도록 하겠습니다.
MBR의 구조는 이러한 형태로 만들어져 있습니다.

MBR Structure


MBR의 일반적인 구조는 부트코드(446Byte), 파티션테이블(64Byte), 시그니처(2byte)로 총 512byte로 구성되어 있습니다. 그리고
구조에 포함되는 내용은 전부 다릅니다. MBR 데이터 구조는 다음과 같은 표로 나타납니다.

주소 범위(Address range)사이즈(Size)필드 이름(Field Name)설명(Decription)
0x0000 - 0x01BD446ByteBoot Code부트 코드
0x01BE - 0x01CD16BytePartition Table entry # 1파티션 테이블 엔트리 # 1
0x01CE - 0x01DD16BytePartition Table entry # 2파티션 테이블 엔트리 # 2
0x01DE - 0x01ED16BytePartition Table entry # 3파티션 테이블 엔트리 # 3
0x01EE - 0x01FD16BytePartition Table entry # 4파티션 테이블 엔트리 # 4
0x01FE - 0x01FF2ByteSignature시그니처 (0x55AA : 고정값)
MBR 구조의 총 데이터 사이즈 0x0000 ~ 0x01FF로 512Byte 입니다.

1. MBR Boot Code영역

MBR Boot Code는 운영체제가 부팅될 때 POST 과정 이후 저장매체에 존재하는 첫번째 섹터를 호출 하게 됩니다. 이때 호출된 섹터에 존재하는 내용입니다. 부팅 과정은 이렇게 이루어집니다.

전원켜짐 -> BIOS -> Pre(미리) POST -> POST(Power On Self Test) -> MBR 로드 -> VBR 로드 의 과정으로 운영체제가 부팅이 됩니다.

 

* POST(Power On Self Test)
POST는 시동 자체 시험이라고 불리는데, 말 그대로 컴퓨터가 부팅될 때 BIOS가 주변장치인 키보드, 마우스 등을 검사하게 되는데 이 과정을 POST라고 합니다. 간단하게 말해서 그냥 고장난 장치가 있으면 비프음을 울려서 어떤 장치가 고장났는지 알려주는것이고 정상적이면 MBR을 읽고 VBR로 위치 이동을 합니다.


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

부트코드는 말 그대로 부팅을 하기 위한 코드입니다. 부트코드가 하는일을 살펴봅시다.

1. 파티션 중 부팅이 가능한 파티션을 찾습니다.
2. 부팅 가능한 파티션을 찾았을 때 해당 파티션 테이블에 적혀있는 VBR의 위치로 이동시킵니다.
3. 부팅 가능한 파티션이 없으면 부트코드에 저장된 오류 메세지를 출력합니다.

오류 메세지는 다음과 같습니다.

- Invalid partition table
- Error loading operating system
- Missing operating system
오류 메세지는 부트 코드 영역을 살펴보면 0x163 ~ 0x1B1까지의 영역에 적혀 있습니다.

MBR Boot Code 영역

오류 메세지 영역이 잘 안보일 수 있으니 확대해서 보여드리겠습니다.

MBR Boot Code 영역 오류 메시지 부분

이제 부트코드 영역에서 중요하게 살펴 보아야 하는 내용이 있습니다. 바로 이 부분입니다.

Device GUID(Globally Uniquie Identifier)

이 부분은 offset 0x1B8 ~ 0x1BB에 위치하고 있으며 Device GUID를 의미합니다. 즉, 저장 장치의 고유 ID가 담겨 있다고 보시면 됩니다. 위 그림에 보이는 92 ED 58 D9는 분석을 하고 있는 저장장치의 고유 ID이므로 윈도우 레지스트리에서 확인할 수 있습니다. 윈도우 레지스트리 편집기를 들어가는 방법은 win키 + R로 검색창을 띄우고 regidit을 하시면 됩니다.

그럼 레지스트리에서 볼려면 하위 폴더를 알아야합니다. 해당 GUID가 들어있는 폴더는 이곳입니다.
HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices에 가시면 이런식으로 볼 수 있습니다.

제가 분석을 하고 있는 하드 디스크는 H드라이브 입니다. 총 12바이트로 구성되어 있는데 아까 위 그림과 같이 92 ED 58 D9가 있는걸 보이시나요? 대소문자 구분안하셔도 됩니다. 4바이트는 hex에디터에서 본 GUID값이고 나머지 00 00 10 00 00 00 00 00은 각 파티션의 시작 섹터 위치입니다.

지금까지 MBR구조 중 부트코드에 대해 배워보았습니다. 이제는 MBR 파티션 테이블에 대해 배워보겠습니다.

2. Partition Table Entry

MBR 파티션 영역은 MBR의 부트 코드가 끝난 446byte에서 부터 시작이 됩니다. 그리고 파티션 테이블 엔트리가 4개 까지 보유가 가능한데, 이유는 MBR을 사용하는 컴퓨터에서는 한 디스크 당 최대 만들 수 있는 파티션은 4개뿐이기 때문입니다.
그래서 멀티 부팅을 할 경우에 4개의 운영체제를 설치할 수 있고, 주 파티션이 아닌 데이터 저장을 위한 논리 파티션은 4개 이상 생성 하는 것이 가능합니다.

MBR의 구조에서 쓰이는 파티션의 종류
1. Primary Partition (주 파티션)

주 파티션은 쉽게 말해서 제일 주 된 파티션입니다. 윈도우 운영체제에서 C드라이브가 바로 주 파티션입니다.

2. Extended Partition (확장 파티션)

확장 파티션은 주 파티션에서 1개만 생성이 가능하며, 논리적 파티션으로 다시 세분화 시킬 수 있는 공간입니다.

3. Logical partition (논리 파티션)

논리 파티션은 확장 파티션 안에서 생성이 되며, 위에서 설명했듯이 4개 이상 생성하는 것이 가능합니다.

이제 hex에디터로 파티션 테이블 엔트리를 보겠습니다.

보시는것과 같이 파티션 테이블 엔트리는 1개당 16바이트. 총 64바이트를 가지므로 4개의 파티션 엔트리를 가지고 있습니다.
파티션 테이블 엔트리를 분석하기 전에 파티션 엔트리 구조를 한번 보겠습니다.

<출처 : https://blog.forensicresearch.kr/11>

바이트마다 값들이 다 다른것을 알 수 있죠? 일단 위에 hex에디터로 본 영역은 너무 크기때문에 파티션 테이블 엔트리 부분만 잘라서 보겠습니다.

1. Boot Flag

1. Boot Flag(0x1BE, 1Byte)는 0x00 과 0x80으로 나뉘는데 값을 나뉘는 이유는 부팅 단계에서 해당 파티션이 부팅이 가능한지 아닌지 확인 할 때 쓰이는 Flag값입니다. 그림을 보면 제가 분석하고 있는 MBR구조 하드디스크는 0x00으로 부팅이 불가능 합니다.

부팅 가능한 파티션이라면0x80
부팅이 불가능한 파티션이라면0x00
2. CHS Starting Address

2. CHS Starting Address(0x1BF ~ 0x1C1, 3Byte)는 CHS 지정 방식으로 표현하는 파티션의 시작 주소를 의미합니다. 하지만 윈도우 2000 이상에서는 항상 CHS 주소를 무시하기 때문에 최근에는 CHS 모드는 사실상 무의미합니다. CHS는 이것을 의미합니다. ( C : Cylinder(실린더), H : Header(헤더), S : Sector(섹터))

3. Partition Type

3. Partition Type(0x1C2, 1Byte)은 파티션에 존재하는 파일시스템의 종류를 나타냅니다. 0x01에서부터 0x0F까지 아주 다양한 파티션 종류가 있는데 세부 설명은 다음과 같습니다. 분석을 마저 해봅시다. 0x07은 Advanced Unix, exFAT, NTFS를 의미하고 저는 NTFS 시스템을 사용하고 있습니다. 그리고 이 값을 조작해서 파티션을 은닉할 수도 있습니다. 그림을 보면 제가 분석하고 있는 하드 디스크의 파일 시스템이 NTFS로 hex값과 똑같은 것을 볼 수 있습니다. 나머지 값은 여기를 참고 하시면 될거같습니다.  https://datarecovery.com/rd/hexadecimal-flags-for-partition-type/

4. Ending CHS Address

4. Ending CHS Address(0x1C3 ~ 0x1C5, 3Byte)는 주소 지정 방식이 CHS일 경우에 CHS 주소의 끝의 주소를 가지고 있습니다. 여기서도 마찬가지로 최근에는 항상 CHS 모드는 무의미합니다. 저가 분석하고 있는 하드 디스크의 해당 파티션의 CHS 끝 주소는 0xFEFFFF이지만 리틀엔디안 형식으로 0xFFFFFE가 됩니다.

5. Starting LBA Address

5. Starting LBA Address(0x1C6 ~ 0x1C9, 4Byte)는 주소 지정 방식이 LBA일 경우에 파티션의 시작 섹터 위치를 가지게 됩니다. 위 그림을 보면 0x00000800으로 되어 있다. 0x00000800은 16진수로 2,048입니다. 그럼 파티션의 시작위치인 2,048섹터로 가보겠습니다. 이 그림이 2,048섹터인데 NTFS 파일시스템의 VBR을 확인 할 수 있습니다.

5. NTFS 파일시스템 VBR
6. Size in Sector

6. Size in Sector(0x1CA ~ 0x1CD, 4Byte)는 파티션 LBA에 할당 된 총 섹터의 수를 가지고 있습니다. 지금 분석하고 있는 하드 디스크의 HEX값을 가지고 파티션의 크기를 확인해보겠습니다.

0x00FFE800 = 16,771,072(10진수)의 값을 가집니다. 그런데 LBA블록마다 512MB라고 했으니까 512를 곱해줄게요
16,771,072 * 512 = 8,586,788,864Byte입니다. 물론 오차범위가 조금 있긴합니다. 사진을 한번 봐볼게요

Current Analysis Disk Size

제가 분석하고 있는 디스크의 용량은 8기가입니다. 사용중인 공간과 사용 가능한 공간을 합치면 8,586,784,768이렇게 되는데 아까 위에서 hex값으로 구한 용량과 별 차이없는게 보이시나요?? 근데 제가 위에서 말했는데 기억이 나실지 모르겠지만 MBR 파티션 형식은 최대 사용가능한 용량이 2TB라고 했습니다.

어떻게 확인할 수 있냐면 0x00FFE800처럼 4바이트가 Size를 구하는거니까 이걸 0xFFFFFFFF로 하면 최대용량이 구해질겁니다. 바로 확인 해보겠습니다.

0xFFFFFFFF = 4,294,967,295 * 512 = 2,199,023,255,040Byte입니다.

Current Analysis Disk Full Size

이제 MBR파티션 형식의 최대 크기가 2TB인게 이해가 가시나요?? 이제 마지막으로 시그니처를 확인해보겠습니다.

MBR Signature

7. MBR 파티션의 Signature는 고유의 값으로 무조건 0x55AA라는 값을 가집니다.

마지막으로 위에서 구한 파티션을 토대로 표로 작성하고 이만 포스팅을 끝내도록 하겠습니다.

FiledOffsetByteDecriptionvalue
1.0x1BE1ByteBoot Flag0x00 (부팅 x)
2.0x1BF ~ 0x1C13ByteStarting CHS Address0x002120
3.0x1C21BytePartition Type0x07(NTFS)
4.0x1C3 ~ 0x1C53ByteEnding CHS Address0xFFFFFE
5.0x1C6 ~ 0x1C94ByteStarting LBA Address0x00000800 (2,048)
6.0x1CA ~ 0x1CD4ByteSize in Sector8,586,788,864Byte
이 윗부분은 분석한 Partition Table Entry이고 밑에 부분은 MBR의 고유번호인 시그니처입니다.
7.0x1FE ~ 0x1FF2ByteSignature0x55AA ( 0xAA55)

오늘 MBR구조를 배워보았습니다. 포렌식을 공부하면서 파일 시스템은 무조건 알아야 하는 부분이며 다음 포스팅에는 NTFS, FAT, FAT16, FAT32 등 여러가지 구조를 다시 다뤄보겠습니다.