지난 번에 포스팅한 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 Header, Partition Table Entry 백업본을 볼륨의 마지막에 저장하고 있습니다.
위와 같은 구조를 통해 복구를 하기 위해서는 다음과 같은 과정을 거쳐야 할 것입니다.
- 0번 섹터의 Protective MBR의 파티션 테이블 값을 수정한다.
- GPT Header 백업본을 기반으로 1번 섹터의 GPT Header 값을 수정한다.
- GPT Partition Table Entry 백업본을 기반으로 2번 섹터부터 존재하는 GPT Partition Table Entry 값을 수정한다.
GPT 백업본 기반 복구 - (2) 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를 사용하는 경우 마지막 섹터에 위와 같이 conectix로 시작하는 섹터가 추가로 있기 때문에 마지막 섹터의 전 섹터에 GPT Header가 저장되어 있습니다.
2,097,151 섹터에 가면 시그니처 값인 "EFI PART" 로도 알 수 있듯이 GPT Header의 백업본이 있습니다. 해당 데이터를 512byte (1sector) 만큼 복사하여 원래 GPT Header의 위치인 1번 섹터에 붙여넣어 줍니다.
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 Header backup의 위치인 2,097,151 섹터에서 32를 빼준 2,097,119 섹터부터 GPT Partition entry table 백업본이 위치하게 됩니다.
파티션의 개수가 128개 모두 있다면 32섹터 크기 만큼 복사해서 붙여넣어야 하겠지만 해당 시스템은 파티션이 2개만 존재하기 때문에 256byte만큼(귀찮으니 1섹터 만큼) 복사하여 기존 위치인 2번 섹터에 붙여넣어주면 됩니다.
GPT 파티션 테이블 엔트리의 경우 추가로 수정해줘야하는 값은 없기 때문에 그대로 저장하면 백업본 기반 GPT 복구가 완성됩니다.
이미지 저장 후 FTK Imager에서 다시 마운트해보면 정상적으로 파티션이 인식되는 것을 확인할 수 있습니다.
'DFIR > File System' 카테고리의 다른 글
GPT(GUID Partition Table) - (1) 개요 및 구조 (7) | 2021.12.26 |
---|---|
ADS(Alternate Data Stream)와 디지털 포렌식 (0) | 2021.10.01 |
슬랙 공간(Slack Space) (0) | 2021.06.20 |
MBR(Master Boot Record), Partition Table 분석 (0) | 2021.06.20 |