정보보안공부

디지털 포렌식_NTFS_MFT 속성 분석 본문

디지털 포렌식

디지털 포렌식_NTFS_MFT 속성 분석

Steady_sp 2019. 1. 9. 12:28

@@ MFT 속성 분석



-> MFT Entry 구조에서 빨간부분은 MFT Entry에 각 속성들이고, 각 속성들은 속성해더와 속성내용 또는 속성해더와 Cluster Runs구조체 형태가 있다.




[ 속성의 헤더 ] : 2가지 형태가 존재한다. 

-> Resident Attribute 헤더& Non-Resident Attribute 헤더



*** Resident Attribute 헤더





*** Non-Resident Attribute 헤더




-> 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 Runs 구조체




-> 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 개 섹터범위에 존재한다.




[ 속성의 종류 ] : 여러가지 존재



-> Type Number 값은 10진수로 표현되어진 형태이므로 WinHex또는 16진수 값으로 볼때는 16진수를 10진수로 변환 후 확인한다.





[ 속성의 종류 ] : $STANDARD_INFORMATION



** Flag 값

0x0001 : Read-Only ( 읽기 전용 )

0x0002 : Hidden ( 숨김 )

0x0004 : System File

0x0020 : Archive ( 일반 파일 )

0x0040 : Device ( 장치 파일 )

0x0000 : Directory



[ $STANDARD_INFORMATION 내용 분석 후 알수있는 내용]
=> 파일 생성시간, 마지막 수정시간, MFT의 마지막 수정시간, 마지막 접근 시간을 알 수 있다.
=> Flags 값을 통해 해당 파일 종류를 구분할 수 있다.





[ 속성의 종류 ] : $FILE_NAME



-> Offset값이 8~39는 $STANDARD_INFORMATION의 0~31과 중복된다.


** 이름형식

0x01 : WIN32 ( Null, /, \, :, <, >, ?를 제외한 모든 문자 사용가능 )

0x02 : DOS ( 대문자만 사용, 대부분의 특수문자 사용불가, 파일명 최대8글자, 확장자 최대3글자 )

0x03 : WIN32 & DOS (공통사용형식)



[ $FILE_NAME 내용 분석 후 알수있는 내용 ]
=> 이름의 길이, 이름의 형식, 파일 이름을 알 수 있다.
=> 부모 디렉토리의 File Reference Address를 구하고 해당 위치로 이동하면 상위 디렉토리가 무엇인지 알 수 있다.





[ 속성의 종류 ] : $DATA


-> 특별한 구조없이 파일의 내용을 담고있다.

-> 약 700Byte가 넘어가면 Non-Resident로 변경된다.

-> 하나의 Entry에 $DATA 구조가 추가로 포함 가능 - 이때 반드시 $DATA 속성에 이름이 있어야 한다.



## 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을 의미한다.





[ 속성의 종류 ] : $BITMAP


-> 할당 정보를 관리하기 위한 비트맵 정보

-> $MFT와 $INDEX 엔트리 등에서 사용됨

-> 특정한 구조없이 해당 구조를 비트로 1대1 매칭




[ 속성의 내용 ] : $INDEX_ROOT


## 인덱스 구조


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


-> INDEX_ROOT Header앞에 위치하여 인덱스 이름을 알려준다.




## 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는 노드의 마지막 엔트리를 의미





## $INDEX_Allocation 구조













Comments