Table of Contents
Abstract
본 글에서는 MBR(또는 도스 파티션)에서 사용하는 확장 파티션에 대한 설명과 분석 방법을 설명한다. MBR의 주 파티션 테이블은 최대 4개 까지만 파티션을 나타낼 수 있기 때문에 4개를 넘는 파티션을 정의하기 위해 확장 파티션이라는 걸 사용한다. 확장 파티션은 하나의 일반 파티션과 (필요한 경우) 그 다음 확장 파티션의 정보를 가진다. 파티션이 4개를 초과할 경우 주 파티션 테이에는 첫번째 확장 파티션의 위치를 가리키고, 첫번째 확장 파티션은 4번째 파티션의 정보를 가진다. 파티션이 5개라면 첫번째 확장 파티션은 두번째 확장 파티션의 위치를 가리키고, 두번째 확장 파티션은 5번째 파티션의 정보를 가진다.
본 예제에서는 8GB 크기의 VHD를 MBR로 만들고, 6개의 파티션을 생성했다. 그리고 각 확장 파티션이 나타내는 파티션 테이블 구조를 따라가보며 확장 파티션을 수동으로 분석하는 방법을 알아본다. 예제 이미지도 구글 드라이브로 올려놨으니 필요하다면 다운받아 본 글과 함께 따라가보길 바란다.
Extended Partition Table
MBR의 주 파티션 테이블은 최대 4개 파티션만 나타낼 수 있다. MBR이 가지는 첫번째 섹터의 512 바이트 중 64바이트만 파티션 테이블로 사용되는데, 한 개 파티션 테이블 엔트리는 16바이트이기 때문이다. 이러한 한계를 극복하고자 만들어진 게 확장 파티션이다. 파티션 테이블 엔트리 중 하나를 확장 파티션을 나타내는 엔트리로 사용하고, 이를 따라가면 또다른 MBR 구조가 나타나는 방식이다.
MBR을 사용하는 디스크에서 4개 이상의 파티션을 만드는 경우 첫번째 섹터에 위치한 주 파티션 테이블의 4번째 파티션 테이블 엔트리는 확장 파티션을 나타내는 엔트리 값으로 채워진다. 확장 파티션을 나타내는 경우 파티션 타입 필드가 0x0F 값을 가진다. 파티션 시작 LBA에는 확장 파티션 테이블이 위치한 섹터의 LBA 주소가 나타나고, 앞의 3개 파티션 테이블 엔트리가 나타내는 파티션을 제외한 남은 영역 전체를 가리킨다.
위 그림에서 드래그된 영역이 확장 파티션 테이블이 위치한 섹터를 나타내는 파티션 테이블 엔트리다. 이를 분석하면 아래 표와 같다.
Boot | Type | Start LBA | Size in Sector |
N | Extended Partition | 6,293,504 (0x00600800) |
10,350,592 (0x009DF000) |
Analysis
확장 파티션 테이블을 분석해보기 위해 8GB 크기의 VHD를 MBR로 만들고 1GB 크기의 파티션 6개를 생성했다. 1번과 4번 파티션은 FAT로, 2번과 5번 파티션은 FAT32로, 3번과 6번 파티션은 NTFS로 포맷했다.
예제 이미지는 아래 링크에서 구할 수 있다.
https://drive.google.com/file/d/133xqoIL33j3jJULcwnamUXYETu4iSoy-/view?usp=sharing
Primary MBR Partition Table
직접 제작한 MBR 파서로 VHD를 분석하면 아래 그림과 같다.
정리하면 아래 표와 같다.
Boot | Type | Start LBA | Size in Sector |
N | DOS 16-bit FAT | 2,048 (0x800) |
2,097,152 (0x200000) |
N | WIN95 FAT32 | 2,099,200 (0x200800) |
2,097,152 (0x200000) |
N | Windows NT NTFS | 4,196,352 (0x400800) |
2,097,152 (0x200000) |
N | Extended Partition | 6,293,504 (0x600800) |
10,350,592 (0x9DF000) |
마지막 파티션 테이블 엔트리인 확장 파티션을 보면 앞의 3개 파티션을 제외한 나머지 영역 전체를 확장 파티션 영역으로 가지는 걸 볼 수 있다. 4번째 파티션 테이블 엔트리가 바로 첫번째 확장 파티션을 가리키는 엔트리다. 확장 파티션 엔트리가 가리키고 있는 시작 LBA로 가보자.
First Extended Partition Table
주 파티션 테이블에서 확장 파티션을 나타내던 엔트리가 카리키는 섹터는 6,293,504(0x600800)였다. 섹터 크기인 512를 곱하면 0xC0100000이 된다. 해당 영역으로 가보면 부트 코드 영역은 모두 널 바이트로 채워져있고 파티션 테이블만 활성화되어 있는 걸 볼 수 있다.
첫번째 확장 파티션 테이블의 내용을 분석하면 아래 그림과 같다.
내용을 정리하면 아래 표와 같다.
Boot | Type | Start LBA | Size in Sector |
N | DOS 16-bit FAT | 2,048 (0x800) |
2,097,152 (0x200000) |
N | Extended Partition | 2,099,200 (0x200800) |
2,099,200 (0x200800) |
확장 파티션의 파티션 테이블에서 확장 파티션을 제외한 일반 파티션의 시작 LBA 주소는 각 확장 파티션의 시작 주소를 시작 오프셋으로 한다. 즉, 4번째 파티션(위 표에서 첫번째 엔트리)의 시작 섹터 주소는 첫번째 확장 파티션의 시작 섹터인 0x600800에서 0x800을 더한 0x601000(6,295,552)이 된다. 섹터 6,295,552로 가면 FAT의 VBR을 볼 수 있다. 즉 4번째 파티션부터는 확장 파티션이 해당 정보를 갖고 있으며, 첫번째 확장 파티션은 4번 파티션의 정보를 가진다.
- 4번 파티션의 시작 섹터 = 첫번째 확장 파티션의 시작 섹터 + 4번 파티션의 시작 LBA
2번째 확장 파티션을 가리키는 엔트리를 보면 시작 LBA 값이 2,099,200이다. 첫번째 확장 파티션의 시작 섹터인 6,293,504(0x600800)에 2번째 확장 파티션 시작 LBA인 2,099,200(0x200800)을 더하면 8,392,704(0x801000)이 된다. 파티션의 크기를 보면 나머지 영역 전체를 나타냈던 주 파티션 테이블과 다르게 두번째 확장 파티션 부터는 필요한 만큼의 크기만 나타내고 있다.
- 두번째 확장 파티션의 시작 섹터 = 첫번째 확장 파티션의 시작 섹터 + 두번째 확장 파티션의 시작 LBA
Second Extended Partition Table
2번째 확장 파티션의 위치는 섹터 8,392,704(0x801000)이다. 512를 곱해 바이트 오프셋을 구하면 0x100200000이다.
분석하면 아래 그림과 같다.
정리하면 아래 표와 같다.
Boot | Type | Start LBA | Size in Sector |
N | FAT32 | 2,048 (0x800) |
2,097,152 (0x200000) |
N | Extended Partition | 4,198,400 (0x401000) |
2,099,200 (0x200800) |
5번 파티션의 위치를 나타내는 시작 LBA 2,048을 두번째 확장 파티션의 시작 섹터인 8,392,704에 더하면 8,394,752(0x801800)가 된다. 즉 5번 파티션의 정보는 두번째 확장 파티션이 갖고있다. 해당 위치로 가보면 FAT32의 VBR을 볼 수 있다.
- 5번 파티션의 시작 섹터 = 두번째 확장 파티션의 시작 섹터 + 5번 파티션의 시작 LBA
각자의 확장 파티션 시작 섹터를 기준 오프셋으로 하는 일반 파티션과 다르게 확장 파티션 엔트리는 몇번째든 첫번째 확장 파티션의 시작 주소를 기준 오프셋으로 한다. 때문에 세번째 확장 파티션의 위를 가리키는 4,198,400(0x401000)은 두번째 확장 파티션의 시작 섹터인 8,392,704(0x801000)에 더하는 게 아니라 첫번째 확장 파티션의 시작 섹터인 6,293,504(0x600800)와 더해야 한다.
- 세번째 확장 파티션의 시작 섹터 = 첫번째 확장 파티션의 시작 섹터 + 세번째 확장 파티션의 시작 LBA
Third Extended Partition Table
세번째 확장 파티션의 시작 섹터인 10,491,904(0xA01800)로 가보면 또다시 도스 파티션 형식이 나타난다.
분석하면 아래 그림과 같다.
정리하면 아래 표와 같다.
Boot | Type | Start LBA | Size in Sector |
N | NTFS | 2,048 (0x800) |
2,097,152 (0x200000) |
세번째 확장 파티션의 시작 섹터인 10,491,904(0xA01800)에 6번 파티션의 시작 LBA 값인 2,048을 더하면 10,493,952(0xA02000)이 된다. 6번 파티션의 정보는 세번째 확장 파티션이 갖고 있다. 해당 위치로 가보면 NTFS의 VBR이 있음을 볼 수 있다.
- 6번 파티션의 시작 섹터 = 세번째 확장 파티션의 시작 섹터 + 6번 파티션의 시작 LBA
Close
이상으로 도스 파티션의 확장 파티션을 분석하는 법을 예제를 통해 알아봤다. 최대 파티션 수가 4개인 도스 파티션의 한계를 극복하기 위해 만들어진 방법으로, 도스 파티션을 복잡하게 만드는 요인이기도 하지만 차근차근 따라가면 그리 어렵지 않음을 알 수 있다.
확장 파티션 분석을 통해 알 수 있었던 걸 정리하면 아래와 같다.
- 첫번째 확장 파티션의 정보는 주 파티션 테이블에, 두번째 확장 파티션 정보는 첫번째 확장 파티션에 들어있다. 즉 N번째 확장 파티션의 정보는 N-1번째 파티션 테이블에 존재한다.
- 주 파티션 테이블에 정의된 첫번째 확장 테이블은 주 파티션 테이블에 정의된 일반 파티션 3개의 공간을 제외한 나머지 공간을 자신의 크기로 가진다.
- 파티션 개수가 4개를 초과해 확장 파티션을 사용하는 경우 N번째 파티션의 정보는 N-3번째 파티션 테이블에 존재한다. 4번 파티션은 첫번째 확장 파티션 테이블에, 5번 파티션은 두번째 확장 테이블에 파티션 정보가 기록된다. 단, N은 3보다 크다.
- 확장 파티션을 이용하는 경우 4번 파티션부터는 자신의 파티션 정보를 기록한 확장 파티션의 시작 섹터를 기준으로 해당 파티션의 시작 섹터를 계산해야 한다. 즉, 5번 파티션은 두번째 확장 파티션의 시작 위치에서 시작 LBA를 더해야 한다.
- 하지만 확장 파티션 테이블이 위치한 섹터는 첫번째 확장 파티션 테이블이 위치한 섹터를 기준으로 계산된다.
'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 |
#1 MBR - Master Boot Record (3) | 2021.12.26 |