NTFS (New Technology File System) 2일차(MFT)

2022. 2. 3. 12:55Forensic

 

MFT(Master File Table)

볼륨에 존재하는 모든 파일과 디렉토리에 대한 정보를 가진 테이블이다. NTFS의 가장 중요한 구조체이고 Windows에서 NTFS로 포맷할 경우 Windows는 MFT의 초기 크기를 작게 설정하며 파일이 많아짐에 따라 Windows는 점점 MFT의 크기를 늘려간다. 파일이나 디렉토리가 많아질수록 MFT의 크기는 점점 커지지만 한번 늘어난 MFT는 파일이 줄어든다고 해서 줄어들진 않는다.

 

 

MFT에서는 0번부터 15번까지 들어가는 16개의 파일이 있는데 이는 파일시스템 관리 데이터를 담고 있는 시스템 파일들로, 일반 파일들과 구별하기 위해 메타 데이터 파일(meta data file)이라고 부른다. 파일의 이름은 다른 일반 파일들과 구별하기 위해서 이름앞에 "$"문자를 붙인다.

MFT Entry기본적인 구조

엔트리 번호 엔트리 이름 설명
0 $MFT MFT 영역에 대한 MFT 엔트리이다.
1 $MFTMirr $MFT의 백업본을 담고 있다.
2 $LogFile 메타데이터의 트랜잭션 저널 정보를 담고 있다.
3 $Volume 볼륨의 레이블, 식별자, 버전 등의 정보를 담고 있다.
4 $AttrDef 속성의 식별자, 이름, 크기 등의 정보를 담고 있다.
5 .(Root Direcotory) 볼륨의 루트 디렉터리를 나타낸다.
6 $Bitmap 볼륨의 클러스터 할당 정보를 담고 있다.
7 $Boot 볼륨이 부팅 가능할 경우 부트 섹터 정보를 가지고 있다.
8 $BadClus 배드 섹터를 가지는 클러스터의 정보를 담고 있다.
9 $Secure 파일의 보안, 접근제어와 관련된 정보를 담고 있다.
10 $Upcase 모든 유니코드 문자의 대문자를 담고 있다.
11 $Entend $ObjId, $Quota, $Reparse points, $UsnJrnl 등의 추가적인
파일의 정보를 기록하기 위해 사용된다.
12-15   미래를 위해 예약되어 있다.
- $ObjId 파일의 고유한 ID 정보를 담고 있다.
- $Quota 사용자별 할당량 정보를 담고 있다.
- $Reparse Reparse points 정보를 담고 있다.
- $UsnJrnl USN 저널 정보를 담고 있다.

 

그 중에서 맨 앞에오는 $MFT를 먼저 살펴 보아야한다.

위 표를 보고 직접 $MFT의 값을 알아보자

Signature    : FILE

Offset to fixup array : 0x30

Number of entries in fixup array : 0x03

$LogFile Sequence Number(LSN) : 0x1022E0 -> 1,057,504

Sequence Number : 0x01

Link count : 0x01

Offset to first attribute : 0x38

Flags : 0x01

Used size of MFT entry : 0x01A0

Allocated size of MFT entry : 0x0400

FIle reference to base record : 0x00

Next attrubute id : 0x06

Align to 4B boundary : 0x00

Number of this MFT Entry : 0x00

 

Fixup Array Values

NTFS에서 Fixup을 쓰는 이유는 신뢰성을 높이기 위한 방법이다. MFT Entry는 기본적으로 1024(1K)바이트이므로 2개의 섹터를 사용한다. NTFS를 구성하는 데이터가 하나 이상의 섹터를 사용할 경우 섹터의 마지막 2바이트 값을 별도로 지정하고, 해당 위치에는 Fixup 값 2바이트가 들어간다. 이로 인해 섹터의 내용이 비정상적으로 변경될 경우, 해당 데이터를 해석하기 전 오류를 사전에 찾아낼 수 있는 장점이 있다.

https://kali-km.tistory.com/entry/NTFS-File-System-4

Fixup Array가 3개인 이유는 MFT Entry가 1KB이므로 섹터 2개를 사용하며 이에 더해 signature가 1개 항목을 사용하기 때문이다.

 

MFT 엔트리 플래그(MFT Entry Flags)

MFT 엔트리 헤더를 보면 엔트리의 속성을 나타내는 Flags 값이 존재한다.

In-use : 0x01

Directory : 0x02

사용되는 디렉터리는 0x03의 값을 가진다. 이는 사용하면서 디렉터리이기 때문에 0x01 + 0x02를 하기 때문이다.

 

파일 참조 주소(File Reference Address)

NTFS에는 64비트로 이루어진 파일 참조 주소가 있다. 특정 MFT엔트리를 찾고자 할 경우 MFT 엔트리의 주소만 있으면 되겠지만, NTFS는 파일 참조 주소를 사용해 해당 MFT 엔트리의 위치를 표현한다. 파일 참조 주소는 각 MFT엔트리의 주소값과 MFT 엔티리의 순서번호를 조합하여 만들어 진다.

 

MFT 엔트리 주소값은 첫 번째 엔트리부터 마지막 엔트리까지 순차적으로 매겨진 번호이다. 따라서, MFT 엔트리 0번인 $MFT의 주소값은 0이 된다. 마지막 MFT 엔트리 주소값은 $MFT의 크기가 파일의 수에 따라 가변적이지만, MFT 엔트리 크리(1024바이트)로 $MFT 파일 크기를 나누면 구할 수 있다.

 

파일 참조 주소는 48비트 MFT 엔트리 주소값 앞의 16바이트로 해당 MFT 엔트리의 순서 번호를 사용한다. 순서 번호는 위에서 살펴본 바와 같이 해당 엔트리가 할당 또는 해제될 때마다 1씩 증가하는 값이다.

http://forensic-proof.com/archives/584

 

여기서 48비트만으로도 원하는 엔트리에 접근이 가능하다. 하지만 16비트를 써서 순서 번호를 사용한 이유는 48비트의 주소 값으로만 내가 원하는 엔트리가 맞는지 보장이 되기 어렵기 때문이다. 따라서 순서 번호는 해당 엔트리의 고유한 값이므로 막약 파일 참조 주소를 통해 찾은 엔트리의 순서 번호가 틀리면 파일시스템이 손상되었다고 판단할 수 있다. 또한 적절한 오류를 발생시키거나 해당 파일을 참조할 수 없도록 해야한다.