MBR(Master Boot Record)

  • 부팅 시 필요한 Boot Code와 Partition Table 정보를 저장
  • MBR이 손상되면 부팅이 불가능
  • 파티션 4개 이상부터는 서브 MBR을 할당받아 구성
  • Boot Code(446Byte) + Partition Table(64Byte) + Signature(2Byte)
    • Boot Code : 0000 - 01BD
    • Partition Table Entry #1 : 01BE - 01CD
    • Partition Table Entry #2 : 01CE - 01DD
    • Partition Table Entry #3 : 01DE - 01ED
    • Partition Table Entry #4 : 01EE - 01FD
    • Signature : 01FE -  01FF

Partition Table

  • MBR 영역에 기록되는 파티션 정보는 주 파티션이 됨
  • 4개의 파티션 이후 마지막 파티션 테이블에 확장 파티션으로 이루어짐
  • 16Byte 씩 총 4개의 파티션 영역(총 64Byte)  할당 가능 
    • 0 : 파티션의 부트 플래그(00이면 부팅 불가능, 80이면 부팅 가능)
    • 1~3 : CHS 시작 주소(현재는 쓰이지 않음, LBA 방식)
    • 4 : 파티션 파일시스템 타입
    • 5~7 : CHS 끝나는 주소(현재는 쓰이지 않음)
    • 8~11 : LBA 시작주소(파티션의 시작 주소)
    • 12~15 : 파티션의 총 섹터 수(하드디스크 전체 섹터 수가 아님)
  • 파티션 타입
    • 00 : Empty
    • 05 : MS Extended(윈도우 확장 파티션)
    • 07 : NTFS
    • 0b : FAT32
    • ee : EFI GPT DISK

GPT 파티션

  • EFI(Extensible Firmware Interface)에서 사용되는 디스크 형식
  • MBR과 마찬가지로 디스크 정보를 담고 있음
  • LBA방식을 사용
  • 파티션의 최대 크기는 18EB까지 가능하나 이론적으론 8ZB까지 지원가능
  • 파티션 생성시 처음 부분과 마지막 부분에 여유공간을 두어 MBR > GPT변환을 지원함
  • 0번 섹터에 GPT파티션 시작위치가 저장됨
  • 저장되는 주소 형태는 MBR과 같음
  • GPT파티션의 파티션타입은 0xEE를 사용
  • 보통 GPT파티션의 경우 1번 섹터에 정보가 저장됨
  • 윈7부터는 MBR > GPT

Primary GPT Sector

  • 1번 Sector에 위치
  • GPT에 대한 설정 정보를 저장
  • GPT Header정보는 92byte로 구성됨
    • Signature (8 byte) - “EFI PART“ 기록
    • Revision (4 byte) - Version 1.0을 의미
    • Header Size (4 byte) - GPT Header의 사용하는 크기를 의미, 보통 92 byte를 사용함
    • CRC32 of Header (4 byte) - 무결성을 체크하기 위한 CRC32 값, Header의 시작부터 끝나는 위치까지만 체크 가능함
    • Reserved (4 byte) - 예약된 영역으로 사용하지 않음
    • Current LBA (8 byte) - 현재 LBA 주소
    • Backup LBA (8 byte) -  GPT Header 정보를 Backup한 Sector 위치 기록, Backup된 GPT Header의 정보에 Backup LBA는 현재 위치를 기록하고 있음
    • First usable LBA for Partition (8 byte) - 파티셔닝 할 수 있는 영역의 시작 위치, Primary Partition Table last LBA+1한 값 (보라색)
    • Last usable LBA (8 byte) - 파티셔닝 할 수 있는 영역의 끝 위치, Secondary Partition Table first LBA-1한 값
    • Disk GUID (16 byte) - Unix에 UUID(universally unique identifier)와 동일
    • Partition Entries Starting LBA (8 byte) - GPT Partition Entry에 시작 위치, 각 파티션의 정보가 기록되어 있음
    • Number of Partition Entries (4byte) - 지원하는 GPT Partition Entry의 갯수
    • Size of Partition Entry (4 byte) - GPT Partition Entry의 크기, 대부분 128 byte를 사용함
    • CRC32 of Partition Array (4 byte) - 파티션의 CRC32 값
    • Reserved (420 byte) - 해당 Sector 나머지 영역은 사용하지 않음

Secondly GPT Sector

  • 2번째 Sector에 위치 , Size of Partition Entry (4 byte)에 정의 된 128 byte 내용
  • 각 파티션의 정보를 저장
  • MBR의 파티션 LBA 시작 주소는 4 byte에 저장하지만 GPT 파티션 LBA 시작 주소는 8 byte에 저장
  • 128개의 파티션 정보를 저장
  • 하나의 파티션 Entry는 128 byte를 이용해서 저장
    • Partition Type GUID (16 byte) - 파티션 타입을 표현하는 고유한 정보, 파티션의 파일 시스템과 사용하는 운영체제 및 서비스 정보를 확인 가능
    • Unique Partition GUID (16 byte) - 파티션마다 할당하는 고유한 값을 저장
    • First LBA (8 byte) - 파티션의 시작 주소, Little Endian 방식
    • Last LBA (8 byte) - 파티션의 끝 주소, Little Endian 방식
    • Attribute Flags (8 byte) - 파티션의 속성을 나타내는 값
    • Partition Name (72 byte) - 파일 시스템 이름, UTF-16 사용

Partition Recovery

  • FAT32

-헤더 : ex.MS DOS5.0(EB 58 90 4D 53 44 4F 53 35 2E 30)

-MBR의 LBA 시작주소(파티션 시작주소)를 구한 후 파티션 시작 위치로 이동

-FAT32의 VBR 백업 본은 파티션 시작위치 +6을 더한 섹터에 저장

-해당 백업 본 512byte를 복사 후 LBA(VBR시작위치)에 덮어 씌운 후 복구 확인

-확장 파티션의 VBR : VBR Address + Reserved Address

FAT32 VBR 구조

-루트 디렉터리는 32Byte로 구성

-이름의 첫 Byte가 "E5"일 경우 삭제된 파일

루트 디렉터리 클러스터 헤더 구조

생성 시간 구하기 : 5/6/5 법칙(초에 *2), +-1초의 오차가 존재함 
생성 날짜 구하기 : 7/4/5 법칙 (년도에 1980년 더하기)
삭제된 파일 복구하기
실제 데이터 위치 추적 하기(루트 클러스터 주소+ (Cluster Hi+ Cluster Low-2) * 8)

  • NTFS

-헤더 : eR.NTFS(EB 52 90 4E 54 46 53 20)

-MBR의 LBA 시작주소와 총 섹터 수를 더한 후 더한 값에서 -1을 해주면 NTFS VBR 백업 본을 확인 가능

-해당 백업 본을 복사한 후 LBA 시작주소(VBR 위치)에 512byte를 덮어씌운 후 복구 확인

실습

단일 파티션 복구

1. AccessData FTK Imager > Add Evidence > FAT32 Partition Recovery.001

Unrecognized -> 손상된 파일이라는 것 확인

2. HxD > 기타 설정 > 디스크 이미지 열기 > FAT32 Partition Recovery.001 > 파티션 정보를 보니 LBA시작주소는 3F 00 00 00(뒤집어서 변환하면 63) > 63섹터에서 디스크가 의도적으로 손상된 것 확인 > 63+6=69섹터에 백업된 내용을 63섹터에 덮어쓰기 > FTK에서 다시 확인 > 복구 완료

다중 파티션 이해

1. AccessData FTK Imager > Add Evidence > Ex Partition > 파티션 5개 확인(1,2,3,5,6)

2. HxD > 기타 설정 > 디스크 이미지 열기 > Ex Partition

64byte 파티션 영역이 차있는 것을 확인, 3개의 파티션은 타입이 07로 NTFS

3. 확장 파티션의 LBA 시작주소는 80 B0 04 00, 뒤집어서 00 04 B0 80(10진수 : 307328), 0+307328섹터로 이동

4. 부트코드 영역이 없음(섹터 1번에만 존재), 5번째 파티션 타입 확인 -> NTFS

5. 그 다음 파티션의 타입과 루트 디렉터리 확인 -> 05(확장 파티션)

6. LBA 시작주소를 다시 구한 다음 이동해 6번째 파티션의 타입과 루트 디렉터리 확인 -> NTFS

악성코드 감염 디스크 복구(PETYA)

부팅 시 key를 요구(랜섬웨어)

key를 돈내고 찾거나 MBR 복구해야 함

petya에 감염되면 0x7202 오프셋까지 감염, MBR을 XOR 연산(원본은 0x37에 위치, 감염되면 0x7000 -> 56번 섹터)을 통해 복호화하고 MBR과 VBR사이를 모두 0으로 채워주면 복구 가능

1. HxD > 기타 설정 > 디스크 이미지 열기 > PET.vmdk(디스크 파일)

2. 가상 머신은 40~47 오프셋에 MBR 위치가 나옴(15488)

3. 가상 머신에서 연산 원본이 있는 섹터는 56번 섹터로 15488+56 = 15544번 섹터가 연산원본 섹터

4. 해당 섹터의 내용을 모두 0x37 XOR 연산을 수행해 복호화해야 함

해당 내용을 따로 XOR_mbr로 저장하고 PETYA.exe 실행해서 연산 -> ORI_mbr이 생성됨

5. 악성 데이터가 덮인 영역(MBR ~ VBR)을 0으로 채우기

6. MBR이 있는 15488 섹터에 ORI_mbr 내용을 복붙해서 저장

7. 부팅해서 확인

cf) https://gsk121.tistory.com/269

우리카드 로그수집기로 위장한 악성코드 복구

1. 부팅이 되지 않음

2. HxD > 기타 설정 > 디스크 이미지 열기 > Windows7.vmdk

2. 0x40~47에 MBR의 위치 확인(80 28 00 ~ -> 10368)

3. MBR이 모두 0으로 채워져 있음 -> MBR은 다른 OS도 동일(Partition 제외)하기 때문에 복붙

4. Partition부분을 복구하기 위해 파티션 영역을 뜯어보고 MBR에 추가 -> Partition은 부트플래그(1), (3), 파일시스템 타입(1), (3), 시작위치(4), 총섹터(4)로 구성됨

5. AccessData FTK Imager > Add Evidence > Windows7.vmdk

6. 파일 시스템의 헤더를 ctrl + f로 검색 -> ex. NTFS : eR.NTFS(EB 52 90 4E 54 46 53 20)

7. 첫 번째 파티션(2048 섹터)에서 NTFS가 검색된 것을 확인 -> 부팅 가능하기에 부팅 플래그는 80, 파일시스템 타입은 07, 시작 위치 00 08 00 00

8. 총 섹터는 FF 1F 03 00 ~(204799), 2048+204799+1=206848 -> 두 번째 파티션의 시작 위치(ctrl + s로 이동 가능), 204799+1=204800(03 20 00) -> 00 20 03 00 는 파티션 테이블의 총 섹터

9. 두 번째 섹터의 헤더로 NTFS인 것을 확인 -> 부팅 가능하기에 부팅 플래그는 80, 파일시스템 타입은 07, 시작 위치 00 28 03 00

10. 총 섹터는 FF CF FC 04 00 ~(83677183), 206848+83677183+1=83884032 -> 세 번째 파티션의 시작 위치지만 0으로 채워져있음, 83677184(4FCD000) -> 00 D0 FC 04

11. 파티션 테이블을 정리하면 다음과 같음

80 00 00 00 07 00 00 00 00 08 00 00 00 20 03 00

80 00 00 00 07 00 00 00 00 28 03 00 00 D0 FC 04

12. 파티션 테이블을 수정해 복구 확인

사진파일 복구

1. HxD > 기타 설정 > 디스크 이미지 열기 > evidence.001

2. MBR에서 파티션 3개인 것을 확인

3. AccessData FTK Imager > Add Evidence > evidence.001

4. 자동으로 파티션이 복구돼 4개인 것을 확인 -> NTFS

5. 세 번째 파티션으로 이동해서 NTFS의 헤더를 검색

6. 112896 섹터에서 확인 -> 4번째 파티션 시작 위치

7. 섹터 크기가 FF 8F 01 00 -> 00 01 8F FF(102399)

8. 네 번째 파티션 테이블을 복구하면 80 00 00 00 07 00 00 00 B9 01 00 00 90 01 00

9. 다시 FTK를 확인해보면 파티션 4번이 복구된 것을 확인 -> 키를 카빙하면 끝

FAT32 메타데이터 분석

1. HxD > 기타 설정 > 디스크 이미지 열기 > FAT32_file.001

2. MBR에서 첫 번째 파티션 시작 위치 확인 및 이동 -> 80 00 00 00 -> 80(128)

3. root 디렉터리 이동 -> RS : 1A 10, FAT32 Size : F3 07 00 00 -> VBR + RS + FAT32 Size * 2 -> 128 + 4122 + 2035 * 2 = 8320

4. 삭제된 파일 3개 확인 -> FTK에서는 2개(없는 파일을 복구해야 함)

5. 각각의 생성시간과 날짜를 비교해서 없는 파일 구분

6. 생성시간 : A6 93 -> 93 A6(1001001110100110) -> 10010시 011101분 00110초 -> 18시 29분 6*2초

생성날짜 : 82 48 -> 48 82(100100010000010) -> 0100100년 0100월 00010일 -> 36(+1980)년 4월 10일

-> 해당 파일이 없는 파일

7. 첫 바이트 E5를 사용할 수 있는 아무 번호로 변경하여 복구 -> FTK에서 확인 가능(AAM1.PNG)

※ 수동 카빙

1. 데이터 위치 : 8320 + (클러스터로우(05) + 클러스터하이(00) - 2(예약클러스터 영역))*8=8344 -> png 시그니처 확인

2. 파일 사이즈 : E2 26 00 00 -> 26 E2(9954)

3. 8344 섹터에서 Edit - select block - dec(10진수) - 4272128, 4272128 + 9954 = 4282082 내용 복사 - Edit - 새 파일 - 붙여넣기 - test.png 저장