MFT - Attribute

$STANDARD_INFORMATION ($SIA)

 모든 파일에 기본적으로 존재하는 속성이다. 기본적으로 존재하는 속성인 만큼 파일의 시간정보, 파일 특성, 소유자 및 보안 ID 등의 기본적인 속성 정보를 가지고 있다. 속성 타입 번호는 0x10(16)임을 이전에 확인할 수가 있었다. 속성의 크기는 윈도우 버전에 따라 조금 상이한데 윈도우2000,XP이상(72바이트), 윈도우NT(48바이트)를 갖는다. 이제 구조에 대해서 한번 살펴보자. 

속성 헤더가 먼저 나온 뒤 $STANDARD_INFORMATION의 속성내용들이 나오는 것을 확인할 수가 있다. 각 항목에 대한 설명은 아래의 표와 같다.


 위의 그림은 실제 내 PC $MFT의 내용이다. 이를 해석하면 다음과 같다. 우선 생성 시간, 수정시간, MFT수정시간, 마지막 접근 시간이 모두 같은 것을 확인할 수가 있다. 이는 $MFT가 생성된 시점으로, 즉 포멧된 후의 시점이라는 것이다. 이를 통해서도 언제 포멧을 했는지 알 수가 있다.

 시간 값 8 바이트를 변환하면 Wed, 29 July 2015 11:41:01 +0900 이라는 것을 알 수가 있다. 플래그에 대해 알아보면 0x06임을 알 수가 있다. 이는 시스템 파일과 숨긴파일이라는 것을 알 수가 있다. 그외에 버전 최대값, 버전 번호, 클래스ID, 소유자 ID, Quota Charged는 사용하지 않는 것을 확인할 수가 있으며 보안 ID는 0x100임을 확인할 수 있고, 마지막으로 USN이 0임을 알 수가 있다.



$FILE_NAME ($FN)

 자주 쓰이는 속성 중 하나인 $SIA에 대해 위에서 알아보았다. 이제 또 다른 하나인 $FILE_NAME에 대하여 알아보자. $FN은 파일의 이름을 저장하기 위해 존재하며 다양한 부가 정보들이 저장되어 있다. NTFS에선 빠른 탐색을 위해 만들어 둔 인덱스 구조인 $I30에도 저장되며 일반적으로 파일 이름 변경을 제외하고는 $I30 인덱스의 $FILE_NAME 속성만 갱신한다. $FN의 구조는 아래의 그림과 같다.

 $MFT의 $FN 속성의 모습이다. 공통헤더와 Resident헤더가 존재하고 그 뒤부터 부모 디렉터리의 파일 참조 주소를 시작으로 속성내용이 시작 나온다. 우선 붉은 색의 8바이트 0x00050000000005는 루트 디렉터리의 MFT 엔트리 번호이며 생성, 수정, MFT수정, 마지막 접근 시간은 모두 같은 것을 확인할 수가 있으며 이는 변환하면 Wed, 29 July 2015 11:41:01 +0900 임을 알 수가 있다.

 해당 파일이 할당된 크기는 0x0000000000004000으로 크기는 4 KB로 할당되었던 것과 실제 사이즈도 4KB임을 확인할 수가 있다. Flags의 값은 $SIA에서 보았듯이 시스템파일과 숨긴파일이라는 것을 알 수가 있다. 해당 속성의 Reparsepoint는 없는 것을 확인할 수가 있으며 파일 이름의 길이가 4인 것과 표현 방식이 Win32&DOS인 것을 확인하고 마지막에 해당 이름의 16진수 값인 $MFT가 유니코드의 형태로 나타나는 것을 확인할 수가 있다.


$SIA & $FN - Time Stamp 

$SIA와 $FN 둘 다 4가지 시간 값을 갖는다. 생성시간, 수정시간, MFT Record 업데이트 시간, 최근접근시간이 존재하는데 이 두개의 속성은 약간의 차이를 갖는다. $SIA는 생성시간을 제외하고 모두 업데이트를 한다. 이에 반해 $FN은 폴더/파일 생성시 동일한 시간을 기록하고 다시 변경하지 않는다(단, 폴더 이름 변경 시 예외 - 폴더 이름 변경시 원래 $SIA의 시간과 같게 Update한다.).


$DATA

 $DATA는 파일의 데이터를 저장하는 속성이다. 파일의 데이터가 약 700 Byte 이상이면 Non-Resident로 저장된다고 이전 포스팅을 통해서 확인할 수가 있었다. 이 경우 별도의 클러스터를 할당 받아 데이터를 저장하며 이를 클러스터 런을 통해 관리한다는 것을 살펴보았다. 만약 Resident라면 속성 헤더 이후에 바로 속성 내용인 파일 데이터 스트림 위치가 나온다. 

 하나의 파일에서 $DATA 속성을 2 이상 가질 수가 있는데 이를 ADS라 한다. ADS에 대해선 이전에 http://kali-km.tistory.com/entry/ADS 에서 설명을 하였으므로 자세한 설명은 하지 않겠다. 다만 ADS는 반드시 속성 이름을 가지고 있어야하며, ADS 속성은 파일크기에 포함되지 않는다는점, ADS에 악의적인 데이터를 숨길 수가 있다는 점과 마지막으로 폴더가 $DATA를 갖는 경우도 일반적이지 않으므로 유의하여야 한다.


ADS

좌측의 그림은 XXX##xxx.txt라는 파일을 생성한 뒤 해당 MFT를 찾은 것이며, 우측은 해당 파일에 'ads-km'이라는 이름의 ADS를 추가한 것이다. 그림을 통해 차이를 확인할 수가 있다. 우선 차이나는 부분은 우측의 붉은 부분을 통해 표시하였으며 파란 상자는 속성 식별값이 위치한 것이다.

 그림에서와 같이 기존의 파일은 $SIA, $FN, $DATA와 같이 기본적인 3가지 속성을 가지고 있지만, 우측은 4개의 속성을 가지고 있는 것을 확인할 수가 있다. 우선 위에서부터 차이나는 점에 대해 하나 하나 짚어보자.

 MFT Entry Header에서는 $LogFile Sequence Number(LSN)의 값이 변한 것으로 이는 $LogFile에 존재하는 해당 파일의 트랜잭션 위치 값이 변화했음을 의미한다. 그 다음 0x168에서 0x1A0로 변한 것은 사용하는 MFT Entry 크기가 360 Byte에서 416 Byte로 증가했음을 의미한다. 다음 속성 ID 값도 변화한것을 볼 수가 있다. 이제 0x30 부분을 보면 0x05에서 0x0C로 변화한것은 데이터 무결성을 판단하기 위해 존재하는 Fixup Array이다. 이 Fixup Signature의 값 또한 변화하였음을 확인할 수가 있고 각 섹터의 마지막 2 Byte도 변화했다는 것을 알 수가 있다.

 이제 Attribute 부분에 대하여 알아보자. 우선 0x10인 $SIA에서 생성 시간과 접근시간은 그대로 인것을 확인할 수가 있다. 하지만 파일의 수정 시간과 MFT Entry 갱신 시간은 변화하였음을 알 수가 있다. 또한 USN의 값도 변화한 것을 확인할 수가 있다. $FN은 $SIA와는 다르게 시간 값에도 아무런 변화가 없음을 확인할 수가 있다.

 첫 $DATA 속성을 보면 별 다른 변화가 없지만, MFT Entry의 End Marker인 "0xFFFFFFFF"이 더 뒤로 밀려났다는 것을 확인할 수가 있다. 그 외에 $DATA 속성은 변화가 없다. 하지만 이제 새로 추가된 $DATA는 기존의 메인 스트림에 더해 추가적으로 생성된 것으로 새로운 속성 값을 갖는다. 정확히 첫 $DATA의 End Marker가 있던 곳부터 시작하는 것을 확인할 수가 있다.

 여기서 ADS는 반드시 속성 이름을 갖는다고 말하였다. 그렇기에 속성의 공통 헤더에서 속성의 이름 길이가 6으로 지정된 것을 볼 수가 있고, 실제 이 ADS의 이름은 'ads-km'과 같이 6글자로 지정되었다. 이름이 존재하기에 해당 이름이 나타나는 것을 확인할 수가 있고 이름이 끝난 뒤 해당 속성의 내용(ADS에 기록된 내용)인 'This is ADS'가 존재하는 것을 확인할 수가 있다. 이 뒤에 End Marker가 나오는 것 또한 확인할 수가 있다.



출처 및 참고

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



'Forensic > Theory' 카테고리의 다른 글

NTFS File System (7) INDEX  (0) 2016.01.02
Cluster Run 직접 확인해보기 - MFT엔트리찾기  (0) 2015.12.31
NTFS File System (5) MFT -Attribute  (0) 2015.12.30
NTFS File System (4) MFT  (0) 2015.12.29
NTFS File System (3) VBR  (0) 2015.12.29