Forensics

$MFT Structure Analysis

마띠(쥔장) 2021. 2. 28. 03:07

MFT Entry's Structure

$MFT는 예약된 MFT Entry 중 0번 Entry를 말하며, MFT Entry에 대한 전체적인 정보를 담고 있다. 따라서 각 파일을 분석하기 위해서는 $MFT 정보를 획득하는 것이 선행될 필요가 있다. 앞서 말한 것 처럼 $MFT 파일 정보는 MFT Entry 0번이므로 BPB에 의해 바로 접근할 수 있고 모든 MFT Entry와 같이 1,024 bytes의 고정된 크기를 갖는다.

자기 자신의 정보를 자기가 담고 있는 이 구조는 Non-Resident 형식의 속성을 지원하기 때문이다. Non-resident 속성이란, 저장할 속성 내용이 많아져 MFT Entry로는 감당하지 못할 크기가 되었을 경우 별도의 클러스터에 해당 속성을 저장하고 속성 내용에는 저장한 클러스터의 위치 정보만 저장하는 속성이다.

$MFT의 위치는 다음과 같이 찾을 수 있다.

먼저 NTFS의 VBR 또는 MBR의 아래 하이라이트된 영역을 찾는다. 이 부분은 $MFT의 논리적 클러스터 번호를 나타낸다. 정확한 섹터 번호를 알고 싶으면 이 값에 SP(Sector Per Cluster) 값을 곱한 후 BR의 섹터 번호를 더하면 된다.

$MFT의 논리적 클러스터 번호
SP

0x14D00 * 0x8 + 0(BR의 시작 위치) = 681984번 섹터에서 $MFT의 위치를 찾았다. 다시 말해 MFT Entry가 시작되는 곳이다.

 

▩ $MFT 파일(MFT Entry 0번)의 Header

MFT Entry's Structure - MFT Entry Header

$MFT 파일의 헤더 구조는 다음과 같다.

  1. Signature "FILE" : 0x00 ~ 0x03

  2. Offset to Fixup Array : 0x04 ~ 0x05

  3. Number of Entries of Fixup Arry : 0x06 ~ 0x07

  4. $LogFile's Sequence Num. : 0x08 ~ 0x0F

  5. Sequence Num. (수정 시 1씩 증가) : 0x10 ~ 0x11

  6. Link Count :  0x12 ~ 0x13

  7. First Attribute's offset : 0x14 ~ 0x15 (0x38 = 56이므로 56 bytes 뒤가 첫 속성의 시작 오프셋)

  8. Flags : 0x16 ~ 0x17 (0x01은 사용 중을 의미)

  9. Used Size of MFT Entry : 0x18 ~ 0x1B ($MFT 파일은 0x1A0 = 416 bytes 사용 중)

  10. Allocated Size of MFT Entry : 0x1C ~ 0x1F ($MFT 파일이 사용한 Entry 크기는 0x400 = 1,024 bytes)

  11. File Reference to Base Record : 0x20 ~ 0x27 (0x00000000 00000000은 Base Entry를 뜻함)

  12. Next Attr. ID : 0x28 ~ 0x29

  13. Align to 4B Boundary : 0x2A ~ 0x2B

  14. Number of this MFT Entry : 0x2C ~ 0x2F ($MFT는 0번 Entry)

▩ $MFT 파일(MFT Entry 0번)의 Attr.

$MFT는 다음 네 가지의 속성을 가진다.

$MFT에 존재하는 네 가지 속성

이제 차근 차근 속성의 위치부터 찾아보자.

▩ 10 속성, $STANDARD_INFORMATION

가장 처음 속성은 $STANDARD_INFORMATION으로, 헤더에서 본 것처럼 $MFT 시작의 56 bytes뒤에 존재할 것이다. 아래가 첫 번째 속성 부분이다. 그 중 몇 개의 오프셋들에 대해 알아보자.

  1. 속성 타입, 0x10 = 16 = $STANDARD_INFORMATION

  2. 속성 길이, 0x60 = 96 = 현 속성 시작 위치의 96 bytes 뒤에는 다음 속성이 있다.

  3. Resident Attribute / Non-Resident Attribute, 0x00이면 Non-Resident Attribute 형식

  4. 속성 이름의 시작 위치, 0x18 = 24 bytes

  5. 속성 내용의 길이, 0x48 = 72 bytes

  6. 속성 내용의 시작 위치, 0x18 = 24 = 헤더 바로 뒤 24 bytes

  7. 인덱스 플래그

  8. 패딩값, 의미x

  9. 파일의 생성시간

  10. 파일의 마지막 수정시간

  11. MFT의 마지막 수정시간

  12. 마지막 접근시간

  13. Flag값

    1. 0x01 - Read Only

    2. 0x02 - Hidden

    3. 0x04 - System File

    4. 0x20 - Archive File

    5. 0x40 - Device File

    6. 0x00 - Directory File

    7. 0x06 - Hidden System File

▩ 30 속성, $FILE NAME

다음 속성은 $FILE NAME이다. 역시 그 중 몇 개의 오프셋들에 대해서만 알아보자.

  1. 속성 타입, 0x30 = 48 = $FILE NAME

  2. 속성 길이, 0x68 = 104 = 다음 속성은 104 bytes 뒤에 존재

  3. Resident Attribute / Non-Resident Attribute, 0x00이면 Non-Resident Attribute 형식

  4. 속성 이름의 시작 위치, 0x18 = 24 bytes

  5. 속성 내용의 길이, 0x4A = 74 = 헤더 바로 뒤 74 byte

  6. 속성 내용의 시작 위치, 0x18 = 24 bytes

  7. 인덱스 플래그, 0x01이므로 인덱싱됨

  8. 패딩값, 의미x

  9. 앞 0x00000000 0005: MFT 엔트리 5번을 사용하는 곳, 뒤 0x0005: 수정 5 번

  10. 파일 생성 시간

  11. 마지막 수정시간

  12. MFT 마지막 수정시간

  13. 마지막 접근시간

  14. 0x04, 속성의 고유 이름이 4글자

  15. 0x03, 속성 이름의 형식

    1. 0x01: WIN32

    2. 0x02: DOS

    3. 0x03: WIN32 & DOS 공통 형식

  16. 속성의 고유 이름은 $MFT

▩ 80 속성, $DATA

다음 속성은 $DATA 속성이다. MFT 자체의 정보를 담고 있다.

  1. 속성 타입, 0x80 = 128 = $DATA

  2. 속성 길이, 0x48 = 72 = 다음 속성은 72 bytes 뒤에 존재

  3. Resident Attribute / Non-Resident Attribute, 0x00이면 Non-Resident Attribute 형식

  4. 속성 이름의 시작 위치, 0x40 = 64 bytes

  5. 시작 클러스터, 0x00 = 0번

  6. 마지막 클러스터, 0x3F = 63번

  7. 속성 이름 시작 위치, 0x40 = 64 bytes

  8. 속성이 할당된 클러스터의 총 사이즈, 0x40000 = 262,144 bytes

  9. 속성 내용의 실제 크기, 0x40000 = 262,144 bytes

  10. 속성 내용의 초기화된 사이즈, 일반적으로 실제 크기와 동일한 값, 0x40000 = 262,144 bytes

  11. Cluster Runs 구조의 헤더값

    1. 앞의 3: 오프셋 크기

    2. 뒤의 1: 길이

  12. 단위 클러스터의 길이 값, offset 위치로부터 0x40 = 64 클러스터만큼의 크기를 가짐

  13. 단위 클러스터의 offset 값, 0x14D00 = 85,248

▩ B0 속성, $BITMAP

가장 마지막은 $BITMAP 속성이다. MFT Entry의 할당 정보를 관리한다.

  1. 속성 타입, 0xB0 = 175 = $BITMAP

  2. 속성 길이, 0x48 = 72 = 다음 속성은 72 bytes 뒤에 존재

  3. Resident Attribute / Non-Resident Attribute, 0x00이면 Non-Resident Attribute 형식

  4. 속성 이름의 시작 위치, 0x40 = 64 bytes

  5. 시작 클러스터, 0x00 = 0번

  6. 마지막 클러스터, 0x00 = 0번 => 총 1개의 클러스터 사용 (0번 ~ 0번)

  7. Run List의 시작 위치, 0x40 = 64 bytes 뒤에 위치

  8. 속성이 할당된 클러스터의 총 사이즈, 0x2000 = 8,192 bytes

  9. 속성 내용의 실제 크기, 0x1008 = 4,104 bytes

  10. 속성 내용의 초기화된 사이즈, 일반적으로 실제 크기와 동일한 값, 0x1008 = 4,104 bytes

  11. Cluster Runs 구조의 헤더값

    1. 앞의 3: 오프셋 크기

    2. 뒤의 1: 길이

  12. 단위 클러스터의 길이 값, offset 위치로부터 0x01 = 1 클러스터만큼의 크기를 가짐

  13. 단위 클러스터의 offset 값, 0x14CFF = 130,303

728x90

'Forensics' 카테고리의 다른 글

$MFT로 파일의 절대 경로 찾기  (0) 2021.03.28
Fixup Array Structure Analysis  (0) 2021.03.14
FAT32 File System Structure  (0) 2021.02.20
FAT32 포맷 VOL32 파티션 세팅  (0) 2021.02.20
정보보안 SUA - [디포] "1주차 과제"  (0) 2021.02.06