45일차

●45일차(20250217045.php)
#서과장 하드디스크 복구
> 서과장 파티션 테이블(MBR)은 정상
> usb로 실습해보자

1. 세팅
USB 연결 후 볼륨(NTFS, FAT32 순으로) 나누기
> active directory > 원본 캡처하고 MBR 고장냄

imager로 들어가서 확인하자

MBR
> 각각의 파티션 위치

파티션 시작 위치
partition 1 > 63
partition 2 > 41,945,715

2. 파티션1 시작 위치 계산
00 08 00 00
> 십진수 : 524,288 > sector 위치

00 00 08 00
> 뒤집어서 계산
> 십진수 : 2,048

imager > go to sector
> 524,288 > NTFS 위치가 나와야하는데 안나옴
> 계산을 잘못했음
> 대신 정상적으로 복구하려면 00 08 00 00으로 수정해야함

3. VBR

> 2048 > NTFS + 시그니쳐(55AA) > VBR
> 둘중에 하나라도 없으면 VBR이 될 수 없음
> VBR : 첫번째 파티션의 정보가 담겨있음

00 08 00 00 > 524,288 > X
00 00 08 00 > 2048 > NTFS + 시그니처(55AA) = VBR

4. NTFS 백업 위치
NTFS 특징 > VBR이 손상됨에 대비해 NTFS 마지막 섹터에 백업해둠
파티션1 사이즈
00 60 6D 00
> 00 6D 60 00
> 십진수 : 7168000

시작 위치 + 사이즈 -1 = 7170047 > 마지막 섹터 백업본이 나옴


5. FAT32
5-1. 파티션2(FAT32) 시작 위치
00 68 6D 00
> 십진수 : 6,843,648 > X

00 6D 68 00
> 십진수 : 7,170,048


5-2. FAT32 백업본 위치
> 7170048 + 6(sector) = 7170054

> MSDOS5가 나옴 > 진짜 FAT32 백업본이라는 뜻

#코드 짜기
1. 원본 이미지 파일 이용
> 조작하지 않은 usb를 이미지 파일로 빼서 활용함
> MBR에 있는 partition1, 2를 불러와서 NTFS 혹은 FAT32의 위치와 백업 위치를 알려주는 코드를 짰다
> 첫번째 경우 : partition1이 NTFS인 경우 두번째 경우 : partition1이 FAT32인 경우

[FAT32_NSFT.py]

import zipfile

mbr_image_file = r"D:\20250213\20250213002.001"

with open(mbr_image_file, 'rb') as f:
    mbr_data = f.read(512)

print("FAT32")

#FAT32
partition1 = mbr_data[0x1BE:0x1BE+16]
partion1_hex=partition1.hex()

substring1 = partion1_hex[16:32]

FAT32 = [substring1[i:i+2] for i in range(0, len(substring1), 2)]

#FAT32_시작 위치
FAT32_start = ''.join(FAT32[i] for i in range(3, -1, -1))
FAT32_start_dec = int(FAT32_start, 16)
print("FAT32 시작 위치 :",FAT32_start_dec)

#FAT32_크기
FAT32_size = ''.join(FAT32[i] for i in range(len(FAT32)-1, 3, -1))
FAT32_size_dec = int(FAT32_size, 16)
print("FAT32 크기 :",FAT32_size_dec)

#FAT32_백업 위치
FAT32_backup = FAT32_start_dec + 6
print("FAT32 백업 위치 :", FAT32_backup)

print()
print("NTFS")

#NTFS
partition2 = mbr_data[0x1BE + 16:0x1BE + 32]
partion2_hex=partition2.hex()

substring2 = partion2_hex[16:32]

NTFS = [substring2[i:i+2] for i in range(0, len(substring2), 2)]

#NTFS 시작위치 
NTFS_start = ''.join(NTFS[i] for i in range(3, -1, -1))
NTFS_start_dec = int(NTFS_start, 16)
print("NTFS 시작 위치 :", NTFS_start_dec)

#NTFS_크기
NTFS_size = ''.join(NTFS[i] for i in range(len(NTFS)-1, 3, -1))
NTFS_size_dec = int(NTFS_size, 16)
print("NTFS 크기 :",NTFS_size_dec)

#NTFS 백업위치
NTFS_backup = NTFS_start_dec + NTFS_size_dec -1
print("NTFS 백업 위치 :",NTFS_backup)


2. 망가진 이미지 파일을 복구시키자
우리 케이스는 중복이 없음
첫번째에 ntfs가 나오면 두번째 나오는 ntfs가 백업본이다(VBR을 만족한다면)
FAT32도 마찬가지(MSDOS5가 나온다면)
> 514MB씩 읽어드리면서 VBR을 만족하는 두번째 NTFS, FAT32를 찾으면 됨
> 첫번째는 시작 부분 > 위치 알아내(phy sec) > MBR 부분에 위치를 넣어
> 두번째는 백업 부분 > 위치 알아내(phy sec) > MBR 부분에 위치를 넣어
> 00000으로 만들어버리면 위치를 찾을수가 없으니 이렇게 찾아서 넣는것이다

#서과장 복구시키기
> 저번에 뺀 서과장 이미지 파일을 활용했다(원본은 냅두고)
> 20250213003.001 > 서과장 유출사건

41945715 > partition2 위치 > 가보니 다 0으로 되어있음
62910539 > ntfs 백업 위치 > 복사
>> partition2 위치에 붙혀넣기
>> 다시 imager로 들어가보니 새 볼륨으로 복구되어있다


+) 복사해서 붙혀넣기 하려면 active disk editor 사용
> 들어가서 allow editer를 해줘야 복붙이 됨