GPT 파트 2. 디스크 무결성에서 GPT 헤더의 역할.

소개

이 블로그 시리즈의 첫 번째 파트에서는 최신 GPT 파티션 디스크와 레거시 시스템의 호환성을 보호하는 보호 MBR과 그 역할에 대해 살펴보았습니다. 보호 MBR이 구형 시스템이 GPT 디스크를 잘못 해석하는 것을 방지하여 전체 디스크가 GPT에서 사용 중인 것으로 표시되도록 하는 장벽 역할을 하는 방법에 대해 자세히 살펴보았습니다. 이러한 기초적인 이해를 바탕으로 GPT(GUID 파티션 테이블)의 핵심인 GPT 헤더에 대해 더 자세히 알아볼 수 있는 토대를 마련했습니다.

이 두 번째 파트에서는 디스크 구조에 대한 중요한 정보를 제공하는 GPT 스키마의 중요한 구성 요소인 GPT 헤더의 포장을 풀어보겠습니다. GPT 헤더 내의 각 필드를 살펴보면서 그 중요성과 디스크의 전반적인 기능 및 무결성에 어떻게 기여하는지 설명합니다. 이 글을 마치면 포렌식 조사 또는 데이터 복구 시나리오에서 GPT 헤더를 포괄적으로 이해하여 자신 있게 GPT 파티션 디스크를 분석하고 조작할 수 있게 될 것입니다.

GPT 헤더 개요

GPT(GUID 파티션 테이블) 헤더는 디스크 파티셔닝 시스템의 중요한 구성 요소입니다. 디스크를 별도의 섹션으로 나누고, 각 섹션에는 운영 체제, 개인 파일, 애플리케이션 데이터, 게임 등 다양한 유형의 데이터를 저장할 수 있습니다. 이러한 섹션은 C: 드라이브, D: 드라이브, E: 드라이브 등 서로 다른 드라이브가 될 수 있습니다.

GPT 헤더에는 디스크 끝에 백업 사본이 포함되어 있는데, 이는 마치 주 키가 분실되거나 손상될 경우를 대비해 라이브러리 카탈로그의 예비 키를 가지고 있는 것과 비슷합니다. 이렇게 하면 문제가 발생하더라도 데이터를 찾고 액세스할 수 있습니다.

GPT 헤더는 백업 위치와 해당 섹션(파티션)이 디스크에 있는 위치를 나타내는 GPT 파티션 항목 목록인 GUID 파티션 테이블 항목 배열의 위치를 제공합니다.

그림 1: 하나의 볼륨이 있는 가상의 Windows 10 설치 레이아웃(n = 드라이브의 마지막 섹터)

GPT 헤더는 서명인 EFI PART로 시작합니다. 나머지 값은 아래 표에 세분화되어 있습니다:

GPT 헤더 구조

GPT 헤더는 서명인 'EFI PART'로 시작하며, 나머지 값은 아래 표에 세분화되어 있습니다:

출처: https://uefi.org/specs/UEFI/2.10/05_GUID_Partition_Table_Format.html

지금까지는 GPT 헤더의 처음 16바이트가 여러 GPT 디스크에서 일정하게 유지됩니다.

GPT 헤더 CRC

다음은 GPT 헤더에 대한 CRC32를 계산하는 방법의 예입니다:

Python 스크립트를 사용하여 고립된 바이트 CRC를 계산할 수 있습니다:

Python 스크립트는 다음에서 찾을 수 있습니다: https://github.com/eichbaumj/Python

Python 스크립트는 결과 CRC32 값을 가져와 GPT 헤더에 필요한 형식으로 변환합니다. 이 경우 계산된 값은 0x1B2C37BC입니다. 그러나 GPT 헤더 내의 필드에 저장하기 위해 이 값은 리틀 엔디안으로 읽혀집니다: 0xBC372C1B. 

디스크 GUID

아래 스크린샷은 GPT 헤더에 강조 표시된 GUID를 보여줍니다:

GUID는 16바이트 16진수 값이지만, 값을 복사하여 하이픈으로 적절히 구분하고 중괄호를 붙이면 된다고 생각하면 오산입니다. 결국 잘못된 값을 얻게 될 것입니다.

오른쪽의 데이터 인스펙터에서 HxD가 GUID 변환을 제공하는 것을 볼 수 있습니다. 하지만 어떻게 그렇게 될까요? 어떻게 하나요?
55 BA 55 51 2B D8 59 41 BC 1F C4 17 80 0F D7 63

Become:

{5155BA55-D82B-4159-BC1F-C417800FD763}

GUID 형식

엑스엑스 엑스엑스 엑스엑스 | 엑스엑스 엑스엑스 | 엑스엑스 엑스엑스 | 엑스엑스 엑스엑스 | 엑스엑스 엑스엑스 | 엑스엑스 엑스엑스 | 엑스엑스 엑스엑스 엑스엑스

55 BA 55 51 | 2B D8 | 59 41 | BC 1F | C4 17 80 0F D7 63

4바이트의 첫 번째 세트는 리틀엔디안 16진수로 변환됩니다: 51 55 BA 55

두 번째 2바이트 세트는 리틀엔디안 16진수로 변환됩니다: D8 2B

2바이트의 세 번째 세트는 리틀엔디안 헥스로 변환됩니다: 59 41

나머지 두 세트의 16진수 값은 빅엔디안으로 그대로 유지됩니다: BC 1F | C4 17 80 0F D7 63

모든 변환이 완료되면 필요한 위치에 하이픈을 배치하고 중괄호로 묶어 모두 합치면 됩니다:

{5155BA55-D82B-4159-BC1F-C417800FD763}

명령줄에서 diskpart를 실행하고 디스크의 고유 ID를 확인하여 이것이 올바른 GUID 인코딩인지 확인할 수 있습니다:

GPT 파티션 테이블 체크섬 CRC

동일한 Python 스크립트를 사용하되 16진수 값을 파티션 항목 배열에 있는 값으로 바꿀 수 있습니다. 

그리고 이 값이 GPT 헤더에 있는 값과 일치한다는 것을 알 수 있습니다.

GPT 헤더 복구하기

이제 GPT 헤더가 어떻게 구성되어 있고 디스크의 마지막 섹터에 백업이 있다는 것을 알았으니, GPT 헤더가 손상되거나 지워진 경우 어떻게 복구할 수 있을까요?

GPT 헤더를 복구하려면 디스크 끝에서 마지막 512바이트를 복사하여 LBA 1(섹터 #2)에 붙여넣습니다. 몇 가지 수정이 필요하다는 점에 유의하세요.

아래는 디스크 끝에 있는 백업 GPT 헤더의 모습에 대한 예시입니다:

원래 GPT 헤더에 비해 일부 값이 일정하게 유지되는 것을 볼 수 있습니다. 이러한 상수는 아래에서 빨간색으로 강조 표시되어 있습니다:

변경해야 하는 값은 네 가지입니다.

첫 번째는 다시 돌아올 GPT 헤더 CRC입니다. 현재로서는 다른 값을 수정한 후 계산된 CRC를 사용하여 올바른 값을 다시 얻어야 하므로 해당 값을 0으로 설정할 수 있습니다.

다음은 4바이트의 오프셋 24에 위치한 MyLBA 값입니다. 이 값은 GPT 헤더의 위치(현재 위치)를 가리키며, 현재 위치는 LBA 1 또는 0x01000000000000000입니다. 

오프셋 32의 8바이트 값은 백업 GPT 헤더의 위치를 가리키는 값입니다. 현재 백업은 원본을 가리키고 있지만 디스크의 마지막 섹터를 나타내도록 이 값을 변경해야 합니다. 이전 단계에서 방금 변경한 16진수 값도 마찬가지입니다. 이 예에서는 값을 0xAFD23B7700000000으로 변경해야 합니다.

오프셋 72에 있는 8바이트 값은 GPT 파티션 항목 배열의 위치와 시작을 반영해야 합니다. 현재 백업 GPT 헤더는 해당 어레이의 백업을 가리키고 있습니다. 실제 GPT 파티션 어레이는 LBA 2에 있어야 합니다. 이 값을 0x0200000000000000으로 변경해야 합니다.

이 세 가지 값을 변경했으면 이제 CRC32 값을 계산할 차례입니다. 

결과 체크섬은 다음과 같습니다:

이제 오프셋 16의 0x00000000 값을 0xBC372C1B로 바꿀 수 있습니다:

HxD에는 분석 -> 체크섬에 CRC32 체크섬 계산기가 내장되어 있습니다. 결과 값은 리틀 엔디안 값으로 추가하기만 하면 됩니다.

궁금증을 풀기 위해 원본과 복원된 백업의 512바이트를 분리해 보면 해시값이 실제로 일치하여 백업을 사용하여 원본 GPT 헤더를 성공적으로 재생성했음을 알 수 있습니다.

결론

디지털 포렌식, 데이터 복구 또는 시스템 관리에 관련된 모든 사람은 GPT 헤더의 복잡성을 이해하는 것이 필수적입니다. GPT 헤더는 디스크의 레이아웃과 구조를 정의할 뿐만 아니라 CRC32 체크섬 및 백업 헤더와 같은 메커니즘을 통해 데이터 무결성을 보장합니다. GPT 헤더의 세부 사항을 숙지하면 디스크 문제를 더 잘 해결하고 복구하여 중요한 데이터의 안정성과 접근성을 보장할 수 있습니다.

이 시리즈를 계속 진행하면서 다음에는 GPT 파티션 테이블 항목 배열에 초점을 맞출 것입니다. 파티션 항목이 어떻게 구성되어 있는지, 그리고 디스크 파티션의 조직과 무결성을 유지하기 위해 GPT 헤더와 함께 어떻게 작동하는지 살펴볼 것입니다. GPT 파티션 테이블 항목 배열 분석 및 복구에 대한 포괄적인 가이드를 통해 GPT 파티션 디스크를 자신 있게 다룰 수 있는 지식을 더욱 강화할 수 있으니 계속 지켜봐 주세요.

1부를 놓치셨나요?

처음부터 시작하세요: GPT 파티션 디스크의 보호 MBR 이해하기(1부) - 에서 GPT가 레거시 시스템과의 하위 호환성을 보장하는 방법에 대해 설명합니다.

다음 단계로 넘어갈 준비가 되셨나요?

계속하기 3부: GPT 파티션 항목 배열 탐색하기 - 에서는 파티션 항목이 어떻게 구성되고 GPT 헤더를 어떻게 보완하는지 살펴봅니다.

Facebook
트위터
이메일
인쇄

2개의 응답

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다