Forensic/파일-구조

GPT(GUID Partition Table) Structure

Ron Weasley 2022. 2. 3. 22:38

GPT를 설명하기에 앞서, GPT의 하위 버전이라고 할 수 있는 MBR에 대해서 간략하게 설명을 드리겠습니다.

MBR이란?
MBR은 물리적인 저장 매체 영역 중 0번섹터에 위치하고 있는 512Byte영역입니다.
모든 저장 장치에서 가장 처음에 존재하는 구조이며, 32bit를 사용하여 용량의 제한이 2TB입니다.
Boot Code(446Byte), Partition Table Entey(16 * 4 = 64Byte), Signature(2Byte)의 구조를 가지고 있습니다.

본론으로 가겠습니다.
 
GPT 파티션은 MBR 파티션 테이블의 파티션 용량에 제약 및 보완된 파티션 방식을 위해서 만들어 진 영역입니다.
위에서 말씀드렸다 시피 MBR 파티션은 32bit 체제를 사용하여 최대 2TB만큼 크기를 가지는데, GPT 파티션은 64bit 체제를 사용하여 최대 크기로 9ZB까지 지원이 가능합니다.
 
GPT 파티션 테이블은 인텔에서 기존 BIOS에서 개선된 EFI(Extensible Firmware Interface) 펌웨어에서 지원하는 파티션 테이블 형식입니다. 또한, MBR에서 주 파티션을 4개까지 생성할 수 있었지만, GPT는 최대 128개의 주 파티션 생성이 가능합니다. 그리고 CRC(cyclic redundancy check)를 이용함으로써 파티션 테이블을 보호하고, GPT의 중요 데이터 구조에 대해 볼륨의 끝부분에 복제본을 저장하여 장애가 발생할 시 복구 기능도 지원합니다.
 
근데 사실상 기존 MBR 파티션과 유사합니다. 이유는 GPT 파티션 테이블도 단순한 파티션 테이블 정보를 저장하며, 그 외 다양한 디스크 정보도 저장합니다.
 
이제 분석을 진행하기에 앞서, EFI에 대해서 먼저 알아보겠습니다.
 

1. EFI(Extensible Firmware Interface)

EFI는 기존 BIOS를 대체하는 운영체제와 하드웨어 펌웨어 사이의 새로운 인터페이스로써 현재는 통합 UEFI로 발전하였습니다. 주요 특징은 다음과 같습니다.

EFI Characteristic

2. GPT Support According to Operating System

GPT 파티션 테이블이 Windows를 제외한 다른 운영체제에서 호환성 및 지원을 알아 보겠습니다.

GPT Support Non-Windows OS

다음은 Windows 32비트 운영체제에서 GPT의 호환성 및 지원입니다.

GPT Support Windows 32bit OS

다음은 Windows 64비트 운영체제에서 GPT의 호환성 및 지원입니다.

GPT Support Windows 64bit OS

 
지금까지 각각의 운영체제에서 GPT파티션 테이블의 호환성 및 지원을 알아봤습니다.
이제 GPT의 구조를 살펴보기 전, 실습환경을 구축해야 하는데 저는 8기가 바이트짜리 가상 하드디스크를 만들어 파티션 형식을 GUID 파티션 테이블로 설정 해줬습니다.

바로 분석을 해보도록 합시다~!!
 

3. GPT Structure

먼저 GPT의 구조를 살펴보겠습니다.

GPT Disk Structure

GPT 디스크는 LBA(Logical Block Address) 주소체계를 사용하며, 첫번째에 Protective MBR이 존재하며, GPT Header와 Partition Table이 2개씩 존재합니다. 파티션을 뒤에 존재하는 Partition Table, GPT Header은 앞에 존재하는 GPT Header와 Partition Table이 손상되면 백업용으로 사용하려는 것을 알 수 있습니다.
 

3-1 GPT Detail Structure

GPT 파티션의 상세 테이블 구조입니다.

GPT Detail Structure

왼쪽 LBA는 Sector를 의미하고, GPT 파티션을 상세하게 보면 다음과 같이 배치가 되어 있습니다.
그럼 하나씩 살펴보도록 하겠습니다.
 

3-2. Protective MBR - 0 Sector

Protective MBR은 EFI 서비스가 아닌 BIOS 서비스를 통한 GPT 기반의 부팅을 진행할 때 지원하는 운영체제에서 0번 섹터는 Boot로더로 사용하기 때문에 Protective MBR 이라는 이름으로 존재합니다.

0번 섹터에 위치하며, EFI를 지원하는 운영체제 일 경우 해당 위치를 접근하지 않고 EFI를 지원하지 않는 운영체제 일 경우 EFI에서 BIOS 에물레이션을 하여 접근하는 부분입니다.
 
GPT 파티션 영역의 전체의 시작 주소, 끝 주소를 16 바이트 주 파티션 엔트리 0번에 저장합니다.
Hxd 에디터로 Hex 데이터를 보는 방법은 기존의 MBR과 동일합니다.
 
GPT 파티션에서 MBR을 사용하는 이유는 "호환성" 입니다.
왜냐하면 MBR Based Utility에서 잘못 판단하여 오작동을 일으키지 않도록 하기 위해서 사용하고, GPT를 사용 시 Partition Type이 0xEE로 전체 GPT Drive를 표시하여 OS에 해당 Drive가 GPT를 사용한다고 알리는데 사용합니다.
 

3-3. Primary GPT Header - 1 Sector

GPT Header의 위치는 1번 섹터에 위치합니다.
안에 담겨 있는 데이터값들은 GPT에 대한 전반적인 설정 정보를 기록하고 있으며, 92Byte로 구성 되어 있습니다.
그 외의 값은 NULL값으로 기록합니다.
 
GPT Header의 상세 구조를 한번 보겠습니다.

이렇게 총 92Byte로 구성되어 있는 GPT Header를 하나씩 분석해봅시다.

1) GPT Header - Signature (0x200 ~ 0x207, 8 Byte)

GPT Header - Signature

GPT Header에서 시그니처 부분은 필수로 가지고 있는 부분이며 데이터 값은 "EFI PART" 입니다.
 

2) GPT Header - Revision (0x208 ~ 0x20B, 4Byte)

GPT Header - Revision

이 부분은 GPT Header에서 버전을 의미하며 version 1.0을 의미합니다.
 

3) GPT Header - Header Size (0x20C ~ 0x20F, 4Byte)

GPT Header - Header Size

이 부분은 GPT Header에서 Header Size를 의미하며, GPT Header의 사용하는 크기를 의미합니다.
보통 92 Byte를 사용합니다. 0x0000005C입니다.
 

4) GPT Header - CRC32 of Header (0x210 ~ 0x213, 4Byte)

GPT Header - CRC32 of Header

이 부분은 GPT Header에서 CRC32 of Header를 의미하며, 무결성을 체크하기 위한 CRC32 값으로, Header의 시작부터 끝나는 위치까지만 체크가 가능합니다.
 

5) GPT Header - Reserved (0x214 ~ 0x217, 4Byte)

GPT Header - Reserved

이 부분은 GPT Header에서 Reserved를 의미하며, NULL값으로 채워져 있는것을 보아 예약된 영역은 사용하지 않습니다.
 

6) GPT Header - LBA of GPT Header (0x218 ~ 0x21F, 8Byte)

GPT Header - LBA of GPT Header

이 부분은 GPT Header에서 LBA of GPT Header를 의미하며, 현재 LBA 주소를 나타내기 때문에 무조건 0x01을 띕니다.
 

7) GPT Header - LBA of Backup GPT Header (0x220 ~ 0x227, 8Byte)

GPT Header - LBA of Backup GPT Header

이 부분은 GPT Header 정보를 Backup한 섹터의 위치를 기록합니다.
즉, 백업된 GPT Header의 정보에 Backup LBA는 현재 위치를 기록하고 있습니다.

Backup GPT Header

다음 그림과 같이 0xFFFFFF를 찾아가면 똑같은 구조를 띄고 있는것을 확인할 수 있었습니다.
 

8) GPT Header - Starting LBA for Partitions (0x228 ~ 0x22F, 8Byte)

GPT Header Starting LBA for partitions

이 부분은 GPT Header에서 Starting LBA for Partitions를 의미하며, 파티션을 담을 수 있는 LBA의 주소를 의미합니다.
Primary Partition Table Last LBA+1을 한 값 입니다.
 

9) GPT Header - Ending LBA for Partitions (0x230 ~ 0x237, 8Byte)

GPT Header Ending LBA for Partitions

이 부분은 GPT Header에서 Ending LBA for Partitions를 의미하며, 파티션을 담을 수 있는 LBA의 끝 주소를 의미합니다.
Secondary Partition Table First LBA-1 한 값 입니다.
 

10) GPT Header - Disk GUID (0x238 ~ 0x247, 16Byte)

GPT Header - Disk GUID

이 부분은 GPT Header에서 Disk GUID를 의미하며, Unix의 UUID(Universally Unuque Identifier)과 동일 합니다.
 

11) GPT Header - Partition Table Entry Starting LBA (0x248 ~ 0x24F, 8Byte)

GPT Header - Partition Table Entry Starting LBA

이 부분은 Partition Table Entry의 시작 LBA 주소가 들어 있습니다.

그림 처럼 0x02에 partition Table Entry가 들어 있음을 볼 수 있었습니다.
 

12) GPT Header - Number of Partition Entries (0x250 ~ 0x253, 4Byte)

GPT Header - Number of Partition Entries

이 부분은 GPT Header에서 Number of Partition Entries를 의미하며, 지원하는 Partition Entry의 개수를 담고 있습니다.
아까 설명했듯이 GPT는 128개의 파티션을 최대 개수로 가지고 있어 0x80을 가집니다.
 

13) GPT Header - Size of Partition Table Entry (0x254 ~ 0x257, 4Byte)

GPT Header - Size of Partition Table Entry

이 부분은 GPT Header에서 Size of Partition Table Entry를 의미하며, GPT Partition Entry의 크기를 의미합니다.
대부분 128Byte를 사용합니다.
 

14) GPT Header - CRC32 of Partition Table (0x258 ~ 0x25B, 4Byte)

GPT Header - CRC32 of Partition Table

이 부분은 GPT Header에서 CRC32 of Partition Table을 의미하며, Partition Table의 CRC32 값을 의미합니다.
 

15) GPT Header - Reserved (0x25C ~ 0x3FF, 420Btye)

GPT Header - Reserved

이 부분도 마찬가지로 예약된 영역은 사용하지 않습니다.
 
이렇게 GPT Header 92Byte에 대해서 알아보았습니다. 이제는 GPT Partition Entry에 대해서 알아보겠습니다.
 

4. GPT Partition Entry

GPT Partition Entry를 한번 알아 보겠습니다.

GPT Partition Entry

GPT Partition Entry의 위치는 위에서 설명했다 시피 0x02인 2번 섹터에 있습니다.
일반적인 GPT Partition Entry는 128Byte로 구성되어 있으며, 각 파티션에 대한 대부분의 정보를 담고 있고, MBR의 파티션 테이블의 LBA 주소는 4Byte로 기록하지만 GPT는 8Byte로 기록합니다. GUID를 이용해서 각 파티션의 정보를 확인할 수 있습니다.
 
GPT Partition Entry의 상세 구조는 다음과 같습니다.

1) GPT Partition Entry - Partition Type GUID (0x480 ~ 0x48F, 16Byte)

GPT Partition Entry - Partition Type GUID

이 부분은 GPT Partition Entry의 Partition Type GUID를 의미하며, 파티션 타입을 표현하는 고유 정보를 기록합니다.
파티션의 파일 시스템과 사용하는 운영체제 및 서비스 정보를 확인 가능하며, 파티션 GUID값을 찾아서 어떤 파티션인지 알 수 있습니다. https://en.wikipedia.org/wiki/GUID_Partition_Table#Partition_type_GUIDs

제가 분석하고 있는 파티션의 GUID값은 Basic data partition타입 입니다.
 
2) GPT Partition Entry - Unique Partition GUID (0x490 ~ 0x49F, 16Byte)

이 부분은 GPT Partition Entry의 Unique Partition GUID를 의미하며, 파티션 마다 할당하는 고유 값을 저장합니다.
 
3) GPT Partition Entry - First LBA (0x4A0 ~ 0x4A7, 8Byte)

GPT Partition Entry - First LBA

이 부분은 GPT Partition Entry의 First LBA를 의미하며, 파티션의 시작 주소를 리틀 엔디안으로 저장 합니다.

First LBA sector 32,768

0x8000으로 가보시면 NTFS시스템으로 포맷된 파티션을 찾을 수 있었습니다.
 
4) GPT Partition Entry - Last LBA (0x4A8 ~ 0x4AF, 8Byte)

GPT Partition Entry - Last LBA

이 부분은 GPT Partition Entry의 Last LBA를 의미하며, 파티션의 끝 주소를 리틀 엔디안으로 저장 합니다.
 
5) GPT Partition Entry - Attribute Flags (0x4B0 ~ 0x4B7, 8Byte)

이 부분은 GPT Partition Entry의 속성 값을 나타냅니다. 0x00으로 채워져 있는 것을 볼 수 있습니다.

이 부분이 속성값을 의미합니다. 번역을 하면 다음과 같습니다. (영어를 못합니다...ㅎㅎ)

 
6) GPT Partition - Partition Name (0x4B8 ~ 0x4FF, 72Byte)

GPT Partition - Partition Name

이 부분은 지정되어 있는 파일 시스템의 이름입니다. 위 표와 같이 Basic data Partition인것을 알 수 있습니다.
 
마지막으로 GPT Partition에서 봐야할 곳이 있습니다. 바로 MSR이라는 부분입니다.

Microsoft Reserved Partition

GPT Partition에서 MSR이라고 해서 생성하지 않은 파티션이 자동으로 생성되어 있는 것을 확인할 수 있었습니다.
바로 다음과 같이 0x400 ~ 0x47F까지인데요, 이 부분이 MSR에 대한 Entry 정보입니다.
 
MSR은 마이크로소프트의 예약 파티션으로 Windows 운영체제에서 나중에 사용할 수 있도록 디스크 공간의 일부를 예약하기 위해 생성하는 16MB 크기의 파티션입니다.
 
사실 이 부분은 처음 분석할 때, 의심이 갔었던 부분인데 이해를 하지 못해 주변분들께 여쭤 본 결과 FTK로 볼 경우 볼 수 있었던 부분임을 알았고, MSR이 모든 GPT 디스크에 있을 것이라고 예상된다고 하셨습니다.
 
물론 저 부분에 있는 데이터들은 파티션의 정보를 담고있는 다던지 그런 중요한 데이터는 저장되어 있지 않으며, 단순히 디스크 공간의 일부를 예약하기 위한 공간인 것 같습니다.