GPT(GUID Partition Table) - (2) 손상된 GPT 백업본 기반 복구
DFIR/File System

GPT(GUID Partition Table) - (2) 손상된 GPT 백업본 기반 복구

지난 번에 포스팅한 GPT 구조를 바탕으로 GPT가 손상되었을 때 백업본을 기반으로 해서 복구하는 방법에 대해 포스팅해보겠습니다.

 


 

GPT 백업본 기반 복구

 

손상된 GPT

 

인식되지 않는 파티션

 

정상적인 이미지라면 0번 섹터에 Protective MBR, 1번 섹터에 GPT Header, 2번 섹터부터 GPT Partition table Entry가 위치해야 되지만 위의 손상된 이미지에는 데이터가 0으로 덮여있는 것을 확인할 수 있습니다.

이와 같은 경우 FTK Imager에서 이미지 마운트를 시도할 경우 파티션이 인식되지 않습니다.

이런 상황에서 FTK Imager에서 마운트할 수 있도록 백업본을 기반으로 MBR과 GPT를 복원하는 방법을 알아보겠습니다.

 

 

GPT 백업본 기반 복구 - (1) 체크리스트

 

GPT 구조

 

GPT 구조는 위와 같이 GPT Header, Partition Table Entry 백업본을 볼륨의 마지막에 저장하고 있습니다.

위와 같은 구조를 통해 복구를 하기 위해서는 다음과 같은 과정을 거쳐야 할 것입니다.

 

  1. 0번 섹터의 Protective MBR의 파티션 테이블 값을 수정한다.
  2. GPT Header 백업본을 기반으로 1번 섹터의 GPT Header 값을 수정한다.
  3. GPT Partition Table Entry 백업본을 기반으로 2번 섹터부터 존재하는 GPT Partition Table Entry 값을 수정한다.

 


 

GPT 백업본 기반 복구 - (2) MBR 복구

 

복구한 Protective MBR

 

0번 섹터인 Protective MBR에서는 파티션 테이블 값만 채워주면 됩니다.

파일시스템 타입, LBA 시작 주소, 파티션 총 섹터 개수를 채우면 됩니다.

파일시스템 타입은 GPT를 사용한다는 것을 명시하기 위해 0xEE 값이 들어가고,

LBA 시작 주소는 1번 섹터에 GPT Header가 오기 때문에 0x01,

파티션 총 섹터 개수는 0xFFFFFFFF로 채워주면 됩니다.

 

파티션 테이블 항목
Filesystem Type 0xEE
Starting LBA Address 0x00 00 00 01
Partition Entire count of Sector 0xFF FF FF FF

 


 

GPT 백업본 기반 복구 - (3) GPT Header 복구

 

vhd 사용시 마지막 섹터

 

vhd를 사용하는 경우 마지막 섹터에 위와 같이 conectix로 시작하는 섹터가 추가로 있기 때문에 마지막 섹터의 전 섹터에 GPT Header가 저장되어 있습니다.

 

 

GPT Header Backup(좌), GPT Header(우)

 

2,097,151 섹터에 가면 시그니처 값인 "EFI PART" 로도 알 수 있듯이 GPT Header의 백업본이 있습니다. 해당 데이터를 512byte (1sector) 만큼 복사하여 원래 GPT Header의 위치인 1번 섹터에 붙여넣어 줍니다.

 

 

수정전 GPT Header(좌), 수정후 GPT Header(우)

 

GPT Header 백업본을 붙여넣었다고 끝이 아니라 수정해줘야하는 값이 있습니다.

GPT Header 백업본에는 LBA of GPT Header의 값이 원본 GPT Header의 위치인 1번 섹터가 아니라 GPT Header 백업본의 섹터 값이 저장되어 있습니다.

반대로 LBA of backup GPT Header 값은 원본 GPT Header의 위치 값인 1이 저장되어 있습니다.

그렇기 때문에 LBA of GPT Header의 값과 LBA of backup GPT Header 값을 스왑해주어야 합니다.

그리고 Starting LBA of Partition Table 값이 GPT Partition table entry의 백업본이 위치한 섹터의 값으로 저장되어 있기 때문에 해당 값을 2로 변경해주어야 합니다. (GPT Partition table entry는 2번 섹터에 위치하기 때문)

 

GPT Header 수정 전 수정 후
LBA of GPT Header FF FF 1F 00 00 00 00 00 01 00 00 00 00 00 00 00
LBA of backup GPT  Header 01 00 00 00 00 00 00 00 FF FF 1F 00 00 00 00 00
Starting LBA of partition table DF FF 1F 00 00 00 00 00 02 00 00 00 00 00 00 00

 


 

GPT 백업본 기반 복구 - (4) GPT Partition table entry 복구

 

GPT Partition table entry 백업 본은 GPT Header 백업 본의 위치에서 -32를 한 섹터에 위치하고 있습니다.

-32를 하는 이유는 GPT가 저장할 수 있는 주 파티션의 개수가 128개 이며, 한 개의 파티션 정보는 128byte 크기로 표현하기 때문입니다.

즉, 1섹터인 512byte에 파티션 엔트리 4개가 들어가게 되므로 128 / 4 = 32(sector) 입니다.

 

 

GPT Partition entry table backup(좌), GPT Partition entry table(우)

 

따라서 GPT Header backup의 위치인 2,097,151 섹터에서 32를 빼준 2,097,119 섹터부터 GPT Partition entry table 백업본이 위치하게 됩니다.

파티션의 개수가 128개 모두 있다면 32섹터 크기 만큼 복사해서 붙여넣어야 하겠지만 해당 시스템은 파티션이 2개만 존재하기 때문에 256byte만큼(귀찮으니 1섹터 만큼) 복사하여 기존 위치인 2번 섹터에 붙여넣어주면 됩니다.

GPT 파티션 테이블 엔트리의 경우 추가로 수정해줘야하는 값은 없기 때문에 그대로 저장하면 백업본 기반 GPT 복구가 완성됩니다.

 

 

FTK Imager에서 정상적으로 인식되는 이미지

 

이미지 저장 후 FTK Imager에서 다시 마운트해보면 정상적으로 파티션이 인식되는 것을 확인할 수 있습니다.