3-1.1) GPT 헤더, 파티션 Entry 복구
Last updated
Last updated
MBR과 마찬가지로 디스크에 대한 정보를 담는 영역으로 EFI(Extensible Firmware Interface)라 하여 좀 더 개선된 펌웨어에서 파티션 구분에 사용하고 있는 방식입니다.
실습 테스트를 해보고자 한 경우 아래 파일을 다운 받은 후 압축 해제 합니다.
GPT의 경우 먼저 MBR의 파티션 테이블 엔트리에서 위치를 지정하고 있습니다. FTK Imager에서 "(GPT)파티션2개훼손.001"를 열어봅시다.
0번 섹터의 파티션 테이블의 값을 확인할 수 있습니다.
파티션 엔트리 1번의 값을 보면
시작 섹터를 1번 섹터로 하고 있다. 이 1번 섹터의 경우 Primary GPT Header의 시작 영역입니다.
GPT Header를 확인하면 아래와 같이 구역별로 의미를 가지게 됩니다.
여기서 주의해서 볼 부분으로는 - Current LBA : GPT Header가 위치한 섹터 번호 - Backup LBA : Header 백업본이 위치하는 섹터 번호 - Starting LBA of Entries: 실제 파티션 별 정보(Partition Entry)가 있는 섹터 번호 - Disk GUID (참고) - First Usable LBA : 파티션을 할당 할 수 있는 섹터 번호 - Last Usable LBA : 파티션을 할당 할 수 있는 마지막 번호
Starting LBA of Entries 값이 2이기 때문에 2번 섹터를 확인해보면 Partition Entry Array로 아래와 같이 FTK Imager에서 확인할 수 있습니다. 이 영역을 분석하면 실제 파티션 별 정보를 확인할 수 있습니다.
2번 섹터에 Partition Entry가 모여 있습니다. 파티션 엔트리 구조는 아래와 같으며
리틀엔디안으로 저장되어 있는 주요 부분을 값을 분석하면 아래와 같은 값이 확인 가능합니다. - First LBA : 파티션 시작 섹터 번호 > 80(16진수) = 128 (10진수) - Last LBA : 파티션 끝 섹터 번호 > 1907F(16진수) = 102527 (10진수) *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에서 이를 보여줍니다.
GPT 헤더에서 Last Usable LBA(204766) 바로 다음 섹터에 파티션 엔트리 백업본이 위치합니다. 즉, 204767번 섹터부터 파티션 엔트리가 위치하는 것입니다. *Last Usable LBA : 31FDE (16진수) -> 204,766 (10진수)
GPT 헤더 Backup LBA의 값은 204799 섹터를 가리키고 있습니다. *31FFF (16진수) -> 204,799 (10진수)
정리를 하면 아래 그림과 같이 확인할 수 있습니다. 복사본을 이용해서 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 값으로 때문입니다. 아쉽게도 Backup LBA의 값은 정상 GPT Header의 있어야 할 값과 구조가 살짝 다릅니다. 다만 조금만 수정하면 정상 GPT Header 복구에 활용 가능합니다.
연습 이미지 - 이미지를 다운로드 후 압축을 해제하면, GPT 헤더가 훼손된 Raw이미지 입니다.
GPT 메인 헤더가 훼손된 경우를 살펴봅시다. (GPT)GPT 훼손.001 파일을 FTK Imager 에서 열어보면 아래와 같이 파티션1은 보이나, 내용은 확인이 불가능합니다.
그리고 파티션 타입 부분이 EE (GPT) 일 경우 GPT 구조를 갖는 것입니다.
그러나 막상 1번 섹터를 가보면, 훼손되어 있습니다.
GPT 백업 헤더의 경우 가장 마지막에 복사본이 위치하기 때문에 맨 밑으로 가봅시다. GPT 헤더의 경우 "EFI PART"로 시작합니다. 즉 복사본이 위치하는 것을 알 수 있습니다.
HxD 마지막 섹터를 복사한 뒤 원래 GPT 헤더가 있어야 할 1번 섹터에 덮어쓰기를 진행합니다. 정리하면 GPT 복사본 섹터 -> 1번 섹터로 덮어쓰기 합니다.
1번 섹터에 붙여넣기를 하였으나 백업 LBA 이기 때문에 메인 헤더에 맞게 수정해야 합니다.
간단히 복사본의 Backup LBA와 Current LBA를 서로 바꿔줍니다. Starting LBA of Entries 부분을 2로 수정합니다. [필수는 아니나 완전 복구용] (보통 바로 다음 섹터에 Partition Entry 가 위치합니다.) *만약 Partition Entry 섹터가 훼손되면 백업 GPT 헤더에서 Partition Entry 섹터를 찾아가서 이를 복사하여 활용합니다.
아래와 같이 수정하여 저장한 뒤 FTK Imager에서 불러옵니다.
파티션 정보를 정확하게 불러오는 것을 확인할 수 있습니다.
연습 이미지
- 이미지를 다운로드 후 압축을 해제하면, GPT 엔트리가 훼손된 Raw이미지
해당 이미지를 FTK Imager에서 열어보면 파티션이 보이긴 하나, 모두 보이는 상황은 아닙니다. 그리고 Primary Partition Entry Array (2번 섹터)를 살펴보면 파티션 관련 정보가 안보이네요!
반면, Backup Partition Entry Array에서는 파티션 관련 정보를 확인할 수 있습니다. 즉, Bakcup Partition Entry Array의 데이터를 2번 섹터에 복사하여 덮어쓴다면 파티션 엔트리를 복구할 수 있는 것입니다.
204,767 섹터를 2번 섹터에 복사 후 덮어쓰기 하여 저장합니다.
저장 후 다시 FTK Imager에서 열어보면 정상적으로 파티션을 구분하여 볼 수 있는 것을 알 수 있습니다. 다시 파일시스템을 복구하면 됩니다.