정보보안공부

디지털 포렌식_NTFS_MFT 분석_기본개념정리 본문

디지털 포렌식

디지털 포렌식_NTFS_MFT 분석_기본개념정리

Steady_sp 2019. 1. 9. 12:28


@@ Base MFT Entry & Non-Base MFT Entry


** Base MFT Entry : 파일의 정보를 하나의 MFT Entry에 담지 못할 경우 여러개의 MFT Entry를 사용하게 되는데 이때 처음 MFT Entry

** non-Base MFT Entry : Base MFT Entry 이외의 MFT Entry





-> 32번 MFT Entry 경우 : File Reference to Base MFT Entry 가 22 00 00 00 00 00 xx xx ( xx xx 는 34번 MFT Entry의 Sequence Value 값을 사용 )

-> 36번 MFT Entry 경우 : File Reference to Base MFT Entry 가 22 00 00 00 00 00 xx xx ( xx xx 는 34번 MFT Entry의 Sequence Value 값을 사용 )

-> 34번 MFT Entry 경우 : File Reference to Base MFT Entry 가 00 00 00 00 00 00 00 00 으로 사용한다.


=> File Reference to Base MFT Entry 자리가 00 00 00 00 00 00 00 00 이면 Base MFT Entry 구조
=> File Reference to Base MFT Entry 자리가 00 00 00 00 00 00 00 00 이 아니면 Non-Base MFT Entry 구조이다.


@@ File Reference Address


-> MFT Entry Address : 모든 MFT Entry는 48bit의 고유 주소를 가지고 있음

-> File Reference Address : MFT Entry Header에 있는 Sequence Value와 조합하여 사용된다.


=> 만약 리틀엔디언으로 보여지는 File Reference Address 값이 05 00 00 00 00 00 03 00 이라면

=> 05 00 00 00 00 00 은 MFT Entry Address로 5

=> 03 00 은 MFT Entry Header에 있는 Sequence Value값으로 3을 의미한다.


@@ Resident Attribute & Non-Resident Attribute

-> Resident Attribute : Attribute Header 뒤에 바로 내용이 온다.
-> Non-Resident Attribute :  Attribute의 내용이 다른 Cluster에 저장되는 형식
Attribute Header 뒤에는 Cluster Runs 구조체가 온다.
Cluster Runs 구조체의 정보를 활용하면 다른곳에있는 Attribute 내용을 확인할 수 있다.



[ Resident Attribute 일경우 Header 구조 ]




[ Non-Resident Attribute 일경우 Header 구조 ]

-> Offset Runlist 값은 Attr Type ID 맨 앞에서부터 Runlist 값만큼 Bytes단위로 이동하면 그위치가 Cluster Run 구조체가 있는 위치이다.

-> Starting VCN of runlist와 Ending VCN of Runlist 를 이용해 몇개의 클러스터를 사용하는지 확인할 수 있다.

-> Starting VCN of runlist가 0 이고 Ending VCN of Runlist가 3이라면 4개의 클러스터를 사용한다고 파악한다.


=> Non-Reg Flag 자리가 0이면 Resident Attribute 구조, Non-Reg Flag 자리가 1이면 Non-Resident Attribute 구조이다.

@@ Cluster Run 구조


-> Length 값과 Offset 값은 클러스터 단위이다.

-> 헤더부분에서 0011 0010 은 32이므로 2가 Run Length , 3이 Run Offset 부분이된다.

-> Offset값을 구하면 클러스터 단위이므로 x 8을 통해 섹터단위로 변경 -> Offset 값에 x 8을 하고 BR의 위치를 더해줘야한다.
-> 해당 Offset 값을 계산한 위치로부터 Length 값의 클러스터만큼 데이터를 차지한다.

=> 만약 Cluster Runs 구조체가 31 02 1D 23 10 이라면
=> 31은 헤더로 헤더 바로 뒤부터 1바이트만큼 Length , 3바이트만큼 Offset을 의미
=> Offset의 의미는 Offset 값이 1057565 (클러스터단위) 이므로 1057565 x 8 + BR의 위치 = Offset값이다.
=> Length의 의미는 Length 값이 2 이므로 Offset 위치로부터 2 (클러스터단위) 이므로 2 x 8 = 16 개 섹터범위에 존재한다.

@@ 인덱스(Index)
- NTFS는 빠르게 검색이 필요한 자료들을 인덱스 구조로 관리하고 있다.
- 인덱스 구조를 사용하는 가장 대표적인 데이터 구조는 디렉터리이다.




@@ B-Tree 구조

- NTFS는 인덱스를 관리하는 방법으로 B-Tree를 사용한다.



@@ Index_Root_Header


Type of attribute in Index : 인덱스 엔트리가 담고있는 속성 식별 값

Collation Sorting Rule : 인덱스 엔트리가 담고있는 형식 ( 00 01 00 00 이면 오름차순을 의미 )

Size of each Index Record in Bytes : $INDEX_ALLOCATION 속성이 가지는 인덱스 레코드의 바이트 크기

Size of each Index Record in Cluster : $INDEX_ALLOCATION 속성이 가지는 인덱스 레코드의 클러스터 크기



@@ Index_Node_Header



Offset to Start of Index Entry List : 인덱스 엔트리 목록 시작 위치

Offset to End of Used Portion of Index Entry List : 인덱스 엔트리의 실제 크기

Offset to End of Allocated Index Entry List Buffer : 인덱스 엔트리의 할당 크기

Flags : 0x00은 인덱스 노드의 자식노드가 없음, 0x01은 인덱스 노드의 자식 노드가 있음



@@ Index_Entry



File Reference Address for filename : 해당 파일 및 디렉터리의 파일 참조 주소

Length of this entry : 해당 인덱스 엔트리의 총 크기

Length of content : 해당 인덱스 엔트리가 담고 있는 $FILE_NAME 속성의 크기

Flags : 0x01은 자식노드가 존재한다는 의미, 0x02는 노드의 마지막 엔트리를 의미


Comments