소개
이 블로그 게시물 시리즈에서는 GUID 파티션 테이블 스키마에 대해 자세히 살펴보겠습니다. 포렌식 수사관이 최신 스토리지 장치에서 데이터를 정확하게 분석하고 복구할 수 있도록 GPT 스키마에 대한 명확한 이해를 제공하는 것이 목표입니다. GPT는 대용량 디스크, 다중 파티션, 중복성 및 CRC 보호와 같은 향상된 데이터 무결성 기능을 지원하므로 조사관이 필요한 모든 데이터에 액세스하고 검증할 수 있습니다. 또한 GPT는 최신 운영 체제 및 UEFI 펌웨어와의 호환성을 통해 포괄적인 포렌식 검사 기능을 향상시켜 디지털 증거를 발견하고 포렌식 결과의 무결성과 신뢰성을 보장하는 데 없어서는 안 될 필수 요소입니다.
먼저 보호 MBR과 이것이 BIOS에서 레거시 드라이브에 사용되는 기존 MBR과 어떻게 다른지 알아보겠습니다. 그런 다음 GPT 헤더와 GPT 엔트리 배열을 살펴보겠습니다. 마지막으로 판사나 배심원 앞에서 증언할 때와 같이 일반인에게 이러한 개념을 설명하는 데 도움이 되는 몇 가지 결론적인 생각과 팁을 공유하겠습니다.
궁극적으로 이 시리즈를 읽고 나면 CTF 플랫폼에서 제공하는 CTF 과제를 해결하는 데 아무런 문제가 없을 것입니다.
파트 1
보호 MBR
레거시 관점에서의 MBR(마스터 부트 레코드)은 하드 디스크에서 최대 4개의 기본 파티션을 찾을 수 있는 로드맵을 제공했습니다. 각 16바이트 파티션 항목은 FAT32든 NTFS든 해당 파티션의 위치를 안내했습니다. 하지만 이전 MBR에는 다음과 같은 제한 사항이 있었습니다:
- 2TB 크기 제한.
- 기본 파티션은 4개로 제한되며, 더 필요한 경우 기본 파티션 중 하나를 확장 파티션으로 지정할 수 있습니다.
- 파티션 테이블을 포함하는 MBR이 백업 없이 섹터 0에 위치했기 때문에 단일 장애 지점이 발생했습니다.
GPT 하드 디스크의 LBA 0(논리 섹터 0)에는 레거시 MBR이 아닌 보호 MBR이라고 하는 것이 들어 있습니다. 보호 MBR은 도서관 입구에 "이 도서관은 지금 새롭고 개선된 시스템을 사용하고 있습니다"라고 알려주는 표지판이라고 생각하면 됩니다. 이전 방식은 여기서 작동하지 않으니 사용하지 마세요."라고 알리는 표지판이라고 생각하세요.
드라이브에 4개의 기본 파티션 위치만 포함하는 대신, 보호 MBR은 전체 디스크를 GPT에서 사용하는 것으로 표시하여 이전 시스템에 디스크가 완전히 사용 중임을 나타냅니다. 보호 MBR은 이전 버전과의 호환성을 위해서만 존재합니다. 여기에는 디스크를 표시하고 레거시 도구가 디스크 구조를 잘못 해석하는 것을 방지하는 하나의 파티션 항목만 포함되어 있습니다.
보호 MBR의 구조
보호 MBR의 처음 440바이트에는 UEFI 시스템에서 사용하지 않는 부팅 코드가 포함되어 있습니다. 이는 무시됩니다.
아래는 설치 프로세스 중에 파티션이 하나만 생성되고 C: 드라이브에 새로 Windows 10을 설치한 디스크의 가상 레이아웃입니다. UEFI 시스템 파티션은 자동으로 생성되어 사용자에게 숨겨지며, Microsoft 예약 파티션도 설치 중에 생성되어 사용자에게 숨겨집니다.
여기에서 LBA 0에 있는 보호 MBR이 LBA 1의 GPT 헤더를 가리키고 있는 것을 볼 수 있습니다.

보호 MBR의 16진수 레이아웃
다음은 보호 MBR의 16진수 레이아웃 예시입니다:


앞서 언급했듯이 처음 440바이트의 부팅 코드는 UEFI 시스템에서 사용되지 않습니다. 일부 시스템에서는 이 첫 440바이트가 0이 되는 것을 볼 수 있습니다. 다음은 이 블로그를 작성하는 데 사용하고 있는 워크스테이션의 보호 MBR로, 삼성 1TB NVME 드라이브를 사용하고 있습니다:

보시다시피, 이 경우 보호 MBR의 전체에는 오프셋 440에 위치한 4바이트(사용되지 않음), 첫 번째 "기본 파티션 항목"(LBA 1 - GPT 헤더만 가리킴), 섹터의 마지막 2바이트에 위치한 부팅 서명(0x55AA)을 제외한 모든 항목이 0으로 구성되어 있습니다.
이제 보호 MBR에 존재하는 하나의 파티션 항목을 자세히 살펴보겠습니다:


파티션 항목의 첫 바이트는 부팅 가능한 파티션이 아님을 나타내기 위해 0x00으로 설정됩니다. 기존 MBR에서 이 값은 0x00(부팅 불가) 또는 0x80(부팅 가능)입니다. 다음 세 바이트는 CHS 시작 위치(실린더/헤드/섹터)의 4바이트 값에 해당하며, 이는 LBA 시작 필드를 바이트 오프셋 8로 설정합니다. 시작 CHS 값은 다음과 같이 설정됩니다. 0x000200 를 분해하여 LBA 주소로 변환하면 1이 됩니다.
다음 1바이트 값은 다음과 같이 설정됩니다. 0xEE 를 입력합니다: GPT 보호. 오프셋 5의 3바이트 값은 디스크의 마지막 논리 블록의 CHS 주소로 설정됩니다. GPT 파티션 헤더로 연결되는 시작 LBA는 오프셋 8의 4바이트에 위치하며 값은 다음과 같이 설정됩니다. 0x01000000 (또는 리틀 엔디안을 읽을 경우 LBA 1)입니다. 오프셋 12에 있는 레코드의 마지막 4바이트는 디스크의 크기에서 1을 뺀 값을 나타냅니다. 이 값은 0xFFFFFFFF 디스크의 크기가 너무 커서 이 필드에 표시할 수 없는 경우(대부분의 경우) 이 값을 입력합니다.
보호 MRB 수리하기
MBR이 손상, 분실 또는 지워진 경우, 다른 드라이브에서 보호 MBR을 복사하여 섹터 0을 대체할 수 있습니다. 처음부터 새로 만들 수도 있는데, 오프셋 0에서 446까지 0x00을 남겨두고 LBA 1을 가리키는 일반 파티션 항목을 만든 다음 0xEE가 오프셋 4에 존재하여 GPT 보호 OS 유형을 나타내도록 할 수 있습니다. 마지막으로 부트 서명(0x55AA)을 섹터의 마지막 2바이트에 배치합니다.
일반 항목
446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | 459 | 460 | 461 |
00 | 00 | 02 | 00 | EE | FF | FF | FF | 01 | 00 | 00 | 00 | FF | FF | FF | FF |
부팅 서명
510 | 511 |
55 | AA |
재구축된 보호 MBR은 다음과 같이 하면 충분합니다:

결론
이 첫 번째 편에서는 레거시 시스템과의 하위 호환성을 보장하는 데 중요한 역할을 하는 보호 MBR에 대해 살펴보았습니다. 보호 MBR이 전체 디스크를 GPT에서 사용하는 것으로 표시하여 구형 시스템이 디스크의 구조를 잘못 해석하는 것을 방지하는 방법을 살펴봤습니다. 보호 MBR의 구조와 기능을 이해함으로써 이제 GPT 스키마에 대해 더 자세히 알아볼 수 있는 탄탄한 기반을 갖추게 되었습니다.
다음에서는 디스크 레이아웃을 정의하고 데이터 무결성을 보장하는 GPT 스키마의 초석인 GPT 헤더에 대해 집중적으로 살펴보겠습니다. 2부에서는 각 필드와 그 중요성에 대해 살펴보면서 GPT 헤더를 세분화해 보겠습니다. 최신 저장 장치에서 데이터를 효과적으로 관리하고 복구할 수 있는 지식을 제공해드리기 위해 계속해서 GPT 스키마의 복잡성을 풀어갈 예정이니 계속 지켜봐 주세요.
GPT 구조에 대해 더 자세히 알아보고 싶으신가요?
In 파트 2를 분석하여 GPT 헤더 를 사용하여 디스크 전체에서 데이터 무결성을 보장하는 방법을 설명합니다.
그런 다음 파트 3를 통해 GPT 파티션 항목 배열 그리고 포렌식 분석가가 파티션 테이블을 재구성할 때 알아야 할 사항입니다.
5개의 응답
이 멋진 기사에 감사드립니다.
훌륭한 페이지(1부와 2부).
감사합니다!
멋진 콘텐츠입니다, 이 글과 2부와 3부도 정말 감사합니다!