# 3-1.1) GPT 헤더, 파티션 Entry 복구

{% hint style="info" %}
GPT 파티션 테이블의 GPT 헤더를 복구해야하는 시험문제는 거의 출제된 적이 없는 것으로 알고 있습니다. \
따라서 다른 부분의 공부가 충분히 완료된 후에 여유가 있을 때 연습해보시길 추천합니다.
{% endhint %}

## 1. GPT 기본 구조

* MBR과 마찬가지로 디스크에 대한 정보를 담는 영역으로 EFI(Extensible Firmware Interface)라 하여 좀 더 개선된 펌웨어에서 파티션 구분에 사용하고 있는 방식입니다.
* 실습 테스트를 해보고자 한 경우 아래 파일을 다운 받은 후 압축 해제 합니다.

{% file src="<https://4016728483-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fa2NNzpsEy1B0QNWi34cs%2Fuploads%2FGieT4z612TpJqkElHDcv%2FGPT%20%EA%B5%AC%EC%A1%B0%20%ED%99%95%EC%9D%B8%EC%9A%A9%2C%20%ED%8C%8C%ED%8B%B0%EC%85%982%EA%B0%9C%20%ED%9B%BC%EC%86%90.zip?alt=media&token=735863ee-87a7-4d51-b87f-f58ef11fd551>" %}

* GPT의 경우 먼저 MBR의 파티션 테이블 엔트리에서 위치를 지정하고 있습니다. \
  FTK Imager에서 "(GPT)파티션2개훼손.001"를 열어봅시다.&#x20;

  <figure><img src="https://4016728483-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fa2NNzpsEy1B0QNWi34cs%2Fuploads%2FKFuIf1I2zqhIEih6q8Rt%2Fimage.png?alt=media&#x26;token=6537bd99-a71b-45b6-a11c-9603a5e9b723" alt=""><figcaption></figcaption></figure>

  0번 섹터의 파티션 테이블의 값을 확인할 수 있습니다.

  <figure><img src="https://4016728483-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fa2NNzpsEy1B0QNWi34cs%2Fuploads%2Fwie5p4AsRbZEk1SSX7zp%2Fimage.png?alt=media&#x26;token=37260dca-43cd-46de-ac34-503f4f7ceb4c" alt=""><figcaption></figcaption></figure>

* 파티션 엔트리 1번의 값을 보면

  <figure><img src="https://4016728483-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fa2NNzpsEy1B0QNWi34cs%2Fuploads%2Fsq04nlzU5BuJHiGGsgaf%2Fimage.png?alt=media&#x26;token=ddd5716a-bf31-400f-8b2e-548f44152737" alt=""><figcaption></figcaption></figure>

* 시작 섹터를 1번 섹터로 하고 있다. 이 1번 섹터의 경우 Primary GPT Header의 시작 영역입니다.

  <figure><img src="https://4016728483-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fa2NNzpsEy1B0QNWi34cs%2Fuploads%2FxWTXeR4PwSCWUjnwTMo7%2Fimage.png?alt=media&#x26;token=4c753a7a-093a-4ee1-9dbb-37ce1752210d" alt="" width="563"><figcaption></figcaption></figure>

* GPT Header를 확인하면 아래와 같이 구역별로 의미를 가지게 됩니다.

  <figure><img src="https://4016728483-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fa2NNzpsEy1B0QNWi34cs%2Fuploads%2FL5RvvrrnFHo67HZi0GQQ%2Fimage.png?alt=media&#x26;token=1fde24b9-88f1-498b-8f27-2dd48183e8ba" alt=""><figcaption></figcaption></figure>

  <figure><img src="https://4016728483-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fa2NNzpsEy1B0QNWi34cs%2Fuploads%2F2eIvoJzK2WSyA5lu3zxd%2Fimage.png?alt=media&#x26;token=faf02197-1da9-4cd0-add6-88ddc0ddb177" alt=""><figcaption></figcaption></figure>

  여기서 주의해서 볼 부분으로는 \
  \- **Current LBA** : GPT Header가 위치한 섹터 번호\
  \- **Backup LBA** : Header 백업본이 위치하는 섹터 번호\
  \- **Starting LBA of Entries**: 실제 파티션 별 정보(Partition Entry)가 있는 섹터 번호\
  \- **Disk GUID** \
  (참고)\
  \- First Usable LBA : 파티션을 할당 할 수 있는 섹터 번호 \
  \- Last Usable LBA : 파티션을 할당 할 수 있는 마지막 번호&#x20;

* Starting LBA of Entries 값이 2이기 때문에 2번 섹터를 확인해보면 \
  Partition Entry Array로 아래와 같이 FTK Imager에서 확인할 수 있습니다. \
  이 영역을 분석하면 실제 파티션 별 정보를 확인할 수 있습니다.

  <figure><img src="https://4016728483-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fa2NNzpsEy1B0QNWi34cs%2Fuploads%2FZPhp1jeFXGdZfXmbDOFq%2Fimage.png?alt=media&#x26;token=c15eea3b-876c-4875-858d-e53fef8cfc0a" alt="" width="563"><figcaption></figcaption></figure>

* 2번 섹터에 Partition Entry가 모여 있습니다.\
  파티션 엔트리 구조는 아래와 같으며

  <figure><img src="https://4016728483-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fa2NNzpsEy1B0QNWi34cs%2Fuploads%2FVGk84XRhiZM6752C6inB%2Fimage.png?alt=media&#x26;token=b0e54e53-3cb3-4f0c-a55e-fe891fb2c5e6" alt=""><figcaption></figcaption></figure>

  <figure><img src="https://4016728483-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fa2NNzpsEy1B0QNWi34cs%2Fuploads%2FJho91eOYW57OLWRx9nLA%2Fimage.png?alt=media&#x26;token=cf10ac3c-4dcb-4291-9937-149e08e76456" alt=""><figcaption></figcaption></figure>

  리틀엔디안으로 저장되어 있는 주요 부분을 값을 분석하면 아래와 같은 값이 확인 가능합니다.\
  \- First LBA : 파티션 시작 섹터 번호 > 80(16진수) = 128 (10진수)\
  \- Last LBA : 파티션 끝 섹터 번호 > 1907F(16진수) = 102527 (10진수)\
  &#x20;\*7F 90 01 00 00 00 00 00 -> 00 00 00 00 00 01 90 7F -> 1907F (16진수)\\

* 위의 내용을 기반으로 정리하면 \
  \- 파티션 1번: 128 \~ 102527번 섹터\
  \- 파티션 2번: 102528 \~ 200831번 섹터\
  FTK Imager에서 이를 보여줍니다.

  <figure><img src="https://4016728483-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fa2NNzpsEy1B0QNWi34cs%2Fuploads%2FmUvnumuFySDD7Q7pL8G6%2Fimage.png?alt=media&#x26;token=6c01b028-39b9-4975-98c5-9acf0a01833c" alt="" width="563"><figcaption></figcaption></figure>

* GPT 헤더에서 Last Usable LBA(204766) 바로 다음 섹터에 파티션 엔트리 백업본이 위치합니다. \
  즉, 204767번 섹터부터 파티션 엔트리가 위치하는 것입니다.\
  \*Last Usable LBA : 31FDE (16진수) -> 204,766 (10진수)

  <figure><img src="https://4016728483-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fa2NNzpsEy1B0QNWi34cs%2Fuploads%2FzzIKzDPCkXUdDjBk5itj%2Fimage.png?alt=media&#x26;token=fd17bc27-1847-4cf3-afe6-c18f70fb1931" alt="" width="563"><figcaption></figcaption></figure>

* GPT 헤더 **Backup LBA**의 값은 204799 섹터를 가리키고 있습니다.\
  \*31FFF (16진수) -> 204,799 (10진수)

  <figure><img src="https://4016728483-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fa2NNzpsEy1B0QNWi34cs%2Fuploads%2FINNmwPcsLesgIMxHwESq%2Fimage.png?alt=media&#x26;token=f2600ddf-97e2-4bb0-9cfd-aef1eaa4504b" alt="" width="563"><figcaption></figcaption></figure>

* 정리를 하면 아래 그림과 같이 확인할 수 있습니다.\
  복사본을 이용해서 GPT 헤더를 복구할 수 있는 것입니다.

  <figure><img src="https://4016728483-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fa2NNzpsEy1B0QNWi34cs%2Fuploads%2FM5HtNkMlLA52Nxw6sOHV%2Fimage.png?alt=media&#x26;token=9405212c-4759-44e5-8778-6a9772220107" alt="" width="563"><figcaption></figcaption></figure>

## 2. GPT 헤더 복구

* GPT 헤더를 Bakcup LBA로 복구함에 있어 먼저 알고 있어야 할 부분으로 \
  Current LBA와 Backup LBA , 그리고 Starting LBA of Entries 값이 있습니다. (LBA : 섹터 번호)\
  \
  실제로 Backup LBA 가 복구해야 할 Current LBA 섹터에 복구 되고 나면 \
  백업본의 Current LBA, Backup LBA, Starting LBA of Entries 값으로 때문입니다.\ <mark style="color:purple;">**아쉽게도 Backup LBA의 값은 정상 GPT Header의 있어야 할 값과 구조가 살짝 다릅니다.**</mark>\
  다만 조금만 수정하면 정상 GPT Header 복구에 활용 가능합니다.

  <figure><img src="https://4016728483-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fa2NNzpsEy1B0QNWi34cs%2Fuploads%2FtxjlTwPp0GM2H7WhUxGL%2Fimage.png?alt=media&#x26;token=45892eaa-a6d3-4a6d-b1a9-f35ad7b6a664" alt=""><figcaption></figcaption></figure>

## 3. GPT 헤더 복구 실습

* 연습 이미지\
  \- 이미지를 다운로드 후 압축을 해제하면, GPT 헤더가 훼손된 Raw이미지 입니다.

{% file src="<https://4016728483-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fa2NNzpsEy1B0QNWi34cs%2Fuploads%2FWf3DGboOsmGTuP7uwFx1%2FGPT%ED%9B%BC%EC%86%90.zip?alt=media&token=d638b5e9-24bd-44b3-9228-ac85009a45c7>" %}

* GPT 메인 헤더가 훼손된 경우를 살펴봅시다.\
  (GPT)GPT 훼손.001 파일을 FTK Imager 에서 열어보면 아래와 같이 파티션1은 보이나, 내용은 확인이 불가능합니다.

  그리고 파티션 타입 부분이 EE (GPT) 일 경우 GPT 구조를 갖는 것입니다.

  <figure><img src="https://4016728483-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fa2NNzpsEy1B0QNWi34cs%2Fuploads%2Fg5H63DE3JYNb6O0kB0Z0%2Fimage.png?alt=media&#x26;token=435e6132-69af-4e48-ad12-97ba352c9f8e" alt=""><figcaption></figcaption></figure>
* 그러나 막상 1번 섹터를 가보면, 훼손되어 있습니다.

  <figure><img src="https://4016728483-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fa2NNzpsEy1B0QNWi34cs%2Fuploads%2FjjMle7MMkzPnwITDeZsK%2Fimage.png?alt=media&#x26;token=e89c4274-5e76-4edc-bb57-3bc754a2a012" alt="" width="563"><figcaption></figcaption></figure>
* GPT 백업 헤더의 경우 가장 마지막에 복사본이 위치하기 때문에 맨 밑으로 가봅시다.\
  GPT 헤더의 경우 "EFI PART"로 시작합니다. 즉 복사본이 위치하는 것을 알 수 있습니다.

  <figure><img src="https://4016728483-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fa2NNzpsEy1B0QNWi34cs%2Fuploads%2FtFa8UJVgrHoZZJqZbtCS%2Fimage.png?alt=media&#x26;token=b3214aee-f54e-48cb-878d-81c891ad05bb" alt="" width="563"><figcaption></figcaption></figure>
* HxD 마지막 섹터를 복사한 뒤 원래 GPT 헤더가 있어야 할 1번 섹터에 덮어쓰기를 진행합니다.\
  정리하면 GPT 복사본 섹터 -> 1번 섹터로 덮어쓰기 합니다.

  <figure><img src="https://4016728483-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fa2NNzpsEy1B0QNWi34cs%2Fuploads%2FzVqkbmysBtUVDY78sBld%2Fimage.png?alt=media&#x26;token=52fe8807-c505-455d-b66c-8f8e453f2830" alt="" width="563"><figcaption></figcaption></figure>
* 1번 섹터에 붙여넣기를 하였으나 백업 LBA 이기 때문에 메인 헤더에 맞게 수정해야 합니다.

  <figure><img src="https://4016728483-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fa2NNzpsEy1B0QNWi34cs%2Fuploads%2FFrp4d2KjddNkio0o1z48%2Fimage.png?alt=media&#x26;token=f3d5f840-d369-4f8c-87c6-e550585b2360" alt=""><figcaption></figcaption></figure>
* 간단히 복사본의 Backup LBA와 Current LBA를 서로 바꿔줍니다.\
  Starting LBA of Entries 부분을 2로 수정합니다. \[필수는 아니나 완전 복구용]\
  (보통 바로 다음 섹터에 Partition Entry 가 위치합니다.)\
  &#x20;**\*만약 Partition Entry 섹터가 훼손되면 백업 GPT 헤더에서 Partition Entry 섹터를 찾아가서 이를 복사하여 활용합니다.**

  <figure><img src="https://4016728483-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fa2NNzpsEy1B0QNWi34cs%2Fuploads%2Fz9FdZNNhl0l2wOjeOgkm%2Fimage.png?alt=media&#x26;token=f4569db3-0dd3-48bb-b63c-ef532181e19b" alt=""><figcaption></figcaption></figure>
* 아래와 같이 수정하여 저장한 뒤 FTK Imager에서 불러옵니다.

  <figure><img src="https://4016728483-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fa2NNzpsEy1B0QNWi34cs%2Fuploads%2FPF5KXLyXsT9YFBvdRCCi%2Fimage.png?alt=media&#x26;token=ea03015e-7d17-4f93-811f-b962d2cba2ae" alt=""><figcaption></figcaption></figure>
* 파티션 정보를 정확하게 불러오는 것을 확인할 수 있습니다.

  <figure><img src="https://4016728483-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fa2NNzpsEy1B0QNWi34cs%2Fuploads%2FGhYQYpBuj1INf8k3Orsg%2Fimage.png?alt=media&#x26;token=12a89a54-b628-4fd0-9434-7e49186642c1" alt="" width="375"><figcaption></figcaption></figure>

## 4. GPT Partition Entry 복구&#x20;

* 연습 이미지

  \- 이미지를 다운로드 후 압축을 해제하면, GPT 엔트리가 훼손된 Raw이미지

{% file src="<https://4016728483-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fa2NNzpsEy1B0QNWi34cs%2Fuploads%2FrdvPJK1Kjmq6Yjg37OA9%2F(GPT%20%EC%97%94%ED%8A%B8%EB%A6%AC)%ED%8C%8C%ED%8B%B0%EC%85%982%EA%B0%9C%ED%9B%BC%EC%86%90.zip?alt=media&token=376c9a37-5f76-4e8d-85da-73aa031339cb>" %}

* 해당 이미지를 FTK Imager에서 열어보면 파티션이 보이긴 하나, 모두 보이는 상황은 아닙니다.\
  그리고 Primary Partition Entry Array (2번 섹터)를 살펴보면 파티션 관련 정보가 안보이네요!

  <figure><img src="https://4016728483-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fa2NNzpsEy1B0QNWi34cs%2Fuploads%2FVboXovzKkjSVUhUfgMW6%2Fimage.png?alt=media&#x26;token=ed44c12e-d97a-4011-a8c3-fd0aedb36447" alt="" width="563"><figcaption></figcaption></figure>

* 반면, Backup Partition Entry Array에서는 파티션 관련 정보를 확인할 수 있습니다.\
  즉, Bakcup Partition Entry Array의 데이터를 2번 섹터에 복사하여 덮어쓴다면 파티션 엔트리를 복구할 수 있는 것입니다.

  <figure><img src="https://4016728483-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fa2NNzpsEy1B0QNWi34cs%2Fuploads%2FFataGxaV1spoTFtYLOpe%2Fimage.png?alt=media&#x26;token=7933a0ff-9cdd-47f7-ab04-c0590018d4f6" alt="" width="563"><figcaption></figcaption></figure>

* 204,767 섹터를 2번 섹터에 복사 후 덮어쓰기 하여 저장합니다.

  <figure><img src="https://4016728483-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fa2NNzpsEy1B0QNWi34cs%2Fuploads%2FazIsHRAPsm417r1I9bNy%2Fimage.png?alt=media&#x26;token=29041e9b-f65a-48a3-82cf-7886d5ef5b49" alt="" width="563"><figcaption></figcaption></figure>

  저장 후 다시 FTK Imager에서 열어보면 정상적으로 파티션을 구분하여 볼 수 있는 것을 알 수 있습니다.\
  다시 파일시스템을 복구하면 됩니다.

  <figure><img src="https://4016728483-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fa2NNzpsEy1B0QNWi34cs%2Fuploads%2FleCF8pTxdw0RYpVRdSa0%2Fimage.png?alt=media&#x26;token=aaa7e708-8a56-44ed-a8ba-6a062fd477a6" alt="" width="563"><figcaption></figcaption></figure>

{% hint style="info" %}
3줄 요약

1. GPT 헤더의 복사본(맨 마지막 섹터)을 이용하여 GPT 헤더를 복구합니다.\
   수정한 GPT 헤더에서 Backup LBA와 Current LBA를 서로 바꿔주고 Starting LBA of Entries 부분을 복원한 GPT 헤더 섹터번호 +1섹터(**대부분 2번 섹터 입니다.**)로 변경하여 복원합니다.
2. Partition Entry 섹터가 훼손되면 백업 GPT 헤더에서 Partition Entry 섹터를 찾아가서 이를 복사하여 활용합니다. (추후에 실습자료 추가 예정)
3. 시험에서는 잘 안 나오는 유형은 아니니, 다른 것이 익숙하였을 때 실습 및 개념을 이해 해보도록 합시다.
   {% endhint %}
