정보보안공부

디지털 포렌식_NTFS_MFT 0번 분석 본문

디지털 포렌식

디지털 포렌식_NTFS_MFT 0번 분석

Steady_sp 2019. 1. 9. 12:47


@@ BR 분석

-> BR의 시작위치 : 63번 섹터


** BR 분석





[ BR 분석 ]

4E 54 46 53 20 20 20 20 : OEM Name으로 NTFS를 의미한다.

00 02 : Bytes Per Sector로 1개의 섹터가 512Byte를 의미한다.

08 : Sector per Cluster로 1개의 클러스터는 8개의 섹터를 의미한다.

E8 D5 FF 01 00 00 00 00 : 섹터의 총 개수는 33543657개 ( 33543657 x 512바이트 = 파티션용량 ) 

00 00 0C 00 00 00 00 00 : MFT 시작위치를 나타낸다. ( 단위가 클러스터이므로 x8 해야한다. )

786432 x 8 + BR의 시작위치 => 6291456 + 63 = 6291519

5E FD 1F 00 00 00 00 00 : MFT Mirror 위치를 나타낸다. ( 단위가 클러스터이므로 x8 해야한다. )

2096478 x 8 + BR의 시작위치 => 16771824 + 63 = 16771887

F6 : MFT Entry Size로 MFT Entry의 크기를 나타낸다. -10은 2^10 = 1024를 의미한다. => 1KB

01 : MFT Entry Size와 같은형식이다. => 1KB



** 분석시 주의사항

WinHex에서 보여지는 값은 리틀앤디안에 의해서 보여지는 값들로 십진수로 변환시 거꾸로 계산해서 분석해야한다.




** BR분석을 통해 알아낸 정보

-> MFT0번의 시작위치 : 6291519

-> MFT Mirror의 시작위치 : 16771887

-> MFT Entry 사이즈는 : 1KB ( 2섹터 )





@@ MFT0번 분석

-> MFT 0번 시작위치 : 6291519번 섹터


** MFT0번 헤더 분석




          : 부분

[ MFT0번 헤더 분석 ]



01 00 : 변경사항이 있으면 1씩 증가

38 00 : 첫 번째 속성의 시작위치 의미 -> 헤더 시작하는곳으로부터 56바이트 뒤에 첫 번째 속성 시작

01 00 : Flag값을 의미 -> 01이면 사용중이다.

98 01 00 00 : MFT 0번 Entry가 사용한 바이트 의미 -> 403 바이트

00 04 00 00 : MFT 0번 Entry의 크기를 의미 1024바이트 -> 2섹터 ( 1클러스터에 512바이트 이므로 )

00 00 00 00 00 00 00 00 : 00 00 00 00 00 00 00 00 이면 Base MFT Entry를 의미

00 00 00 00 : MFT 0번 Entry를 의미한다.




** MFT Entry 0번 Header 분석을 통해 알아낸 정보

-> 0번째 MFT Entry

-> 수정번호 값 1

-> 첫번째 속성위치 : Entry 시작 위치로 부터 56Byte 뒤에서 첫번째 속성 시작

-> Flag : 사용중(0x01)

-> Base MFT Entry





** MFT0번에서 10속성 분석

-> 10속성은 $STANDARD_INFORMATION




          : 부분 ( 10 00 00 00 으로 시작부분 )

[ 10속성 헤더 분석 ] : Resident Attribute 헤더



10 00 00 00 : 속성 타입을 알려준다. 10은 16이므로 $STANDARD_INFORMATION 의미

60 00 00 00 : 속성의 길이이다. 속성 타입인 10위치에서 속성의 길이인 96바이트 뒤에는 다음속성 타입이 존재한다.

00 : 해당 값이 0이면 Resident Attribute 형식, 해당 값이 1이면 non-Resident Attribute 형식이다.

18 00 : 속성 이름 시작위치를 나타낸다.

48 00 00 00 : 속성 내용의 길이는 나타낸다. 72바이트

18 00 : 속성 내용의 시작위치이다. 일반적으로 Header뒤에 바로 붙여 사용한다. 헤더의 크기 24Byte

00 : 인덱스 플래그를 나타낸다. 1이면 인덱스로 사용되는 것을 의미한다.

00 : 패딩값으로 아무의미 없다.





          : 부분

[ 10속성 내용 분석 ]



4A 98 8F 89 04 9D D4 01 : 파일 생성시간 Wed, 26 December 2018 19:19:51 +0900

4A 98 8F 89 04 9D D4 01 : 마지막 수정시간 Wed, 26 December 2018 19:19:51 +0900

4A 98 8F 89 04 9D D4 01 : MFT의 마지막 수정시간 Wed, 26 December 2018 19:19:51 +0900

4A 98 8F 89 04 9D D4 01 : 마지막 접근시간 Wed, 26 December 2018 19:19:51 +0900

06 00 00 00 : Flags 값으로 해당 파일의 특성을 나타낸다. 숨겨진 시스템 파일을 의미


** Flags값

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

- 0x0002 : Hidden ( 숨김 )

- 0x0004 : System File

- 0x0020 : Archive ( 일반 파일 )

- 0x0040 : Device ( 장치 파일 )

- 0x0000 : Directory

=> 06이면 숨김+시스템 파일을 의미한다.




** 10속성 분석을 통해 알아낸 정보

-> 파일 생성시간 : Wed, 26 December 2018 19:19:51 +0900

-> 마지막 수정시간 : Wed, 26 December 2018 19:19:51 +0900

-> MFT의 마지막 수정시간 : Wed, 26 December 2018 19:19:51 +0900

-> 마지막 접근시간 : Wed, 26 December 2018 19:19:51 +0900

-> Flag값 : 0x06 숨겨진 시스템 파일 





** MFT0번에서 30속성 분석

-> 30속성은 $FILE_NAME




           : 부분 ( 30 00 00 00 으로 시작부분 )

[ 30속성 헤더 분석 ] : Resident Attribute 헤더



30 00 00 00 : 속성 타입을 알려준다. 30은 48이므로 $FILE_NAME 의미

68 00 00 00 : 속성의 길이이다. 속성 타입인 10위치에서 속성의 길이인 104바이트 뒤에는 다음속성 타입이 존재한다.

00 : 해당 값이 0이면 Resident Attribute 형식, 해당 값이 1이면 non-Resident Attribute 형식이다.

18 00 : 속성 이름 시작위치를 나타낸다.

4A 00 00 00 : 속성 내용의 길이는 나타낸다. 74바이트

18 00 : 속성 내용의 시작위치이다. 일반적으로 Header뒤에 바로 붙여 사용한다. 헤더의 크기

01 : 인덱스 플래그를 나타낸다. 1이면 인덱스로 사용되는 것을 의미한다.

00 : 패딩값으로 아무의미 없다.





           : 부분

[ 30속성 내용 분석 ]



05 00 00 00 00 00 05 00 : 앞의 05 00 00 00 00 00 은 5번 MFT 엔트리를 사용하는 곳의 05 00 은 수정번호가 5로 설정되어있음을 의미

4A 98 8F 89 04 9D D4 01 : 파일 생성시간 Wed, 26 December 2018 19:19:51 +0900

4A 98 8F 89 04 9D D4 01 : 마지막 수정시간 Wed, 26 December 2018 19:19:51 +0900

4A 98 8F 89 04 9D D4 01 : MFT의 마지막 수정시간 Wed, 26 December 2018 19:19:51 +0900

4A 98 8F 89 04 9D D4 01 : 마지막 접근시간 Wed, 26 December 2018 19:19:51 +0900

04 : 속성의 고유이름 4글자이다.

03 : 속성 이름의 형식이다.

24 00 4D 00 46 00 54 00 : 속성의 고유이름이 $MFT 이다.



** 속성 이름 형식

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

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

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


=> FAT구조가 DOS구조이다.

FAT은 문자열이 비어있는 부분을 20으로 채우지만 NTFS는 00으로 채운다.




** 30속성 분석을 통해 알아낸 정보

-> 파일 생성시간 : Wed, 26 December 2018 19:19:51 +0900

-> 마지막 수정시간 : Wed, 26 December 2018 19:19:51 +0900

-> MFT의 마지막 수정시간 : Wed, 26 December 2018 19:19:51 +0900

-> 마지막 접근시간 : Wed, 26 December 2018 19:19:51 +0900

-> 속성의 고유이름은 4글자, 속성 이름의 형식은 WIN32, DOS 형식 둘다 사용, 속성 이름은 $MFT이다.

-> 30속성은 인덱싱 되고있다.





** MFT0번에서 80속성 분석

-> 80속성은 $DATA




           : 부분 ( 80 00 00 00 으로 시작부분 )

[ 80속성 헤더 분석 ] : Non-Resident Attribute 헤더




80 00 00 00 : 속성 타입을 알려준다. 80은 128이므로 $DATA 의미

48 00 00 00 : 속성의 길이이다. 속성 타입인 80위치에서 속성의 길이인 ‭72‬바이트 뒤에는 다음속성 타입이 존재한다.

01 : 해당 값이 0이면 Resident Attribute 형식, 해당 값이 1이면 non-Resident Attribute 형식이다.

40 00 : 속성 이름 시작위치를 나타낸다.

00 00 00 00 00 00 00 00 : 시작 클러스터는 0번

0B 00 00 00 00 00 00 00 : 마지막 클러스터는 11번    => 0~11번 클러스터를 사용하므로 총 12개의 클러스터를 사용한다.

40 00 : 런리스트 시작 위치를 나타낸다 속성헤더부터 64바이트 뒤에 위치함을 의미한다.

00 C0 00 00 00 00 00 00 : 속성이 할당되어있는 클러스터의 총 사이즈를 Byte 단위로 나타내었다. 49152Byte

00 C0 00 00 00 00 00 00 : 속성 내용의 실제 크기를 Byte단위로 나타내었다. 49152Byte

00 C0 00 00 00 00 00 00 : 속성 내용의 초기화된 사이즈, 일반적으로 실제사이즈와 동일한 값을 가진다. 49152Byte





           : 부분

[ 80속성 내용 분석 ]




31 : Cluster Runs 구조에서의 헤더값으로 1은 Length크기, 3은 Offset 크기를 의미한다.

0C : Length값 ( 단위 클러스터 ) 으로 Offset위치로 부터 12클러스터만큼 크기를 갖는다.

00 00 0C : Offset값 ( 단위 클러스터 ) 이므로 ‭786432‬ x 8 + 63(BR의 크기) = 6291519





** 80속성 분석을 통해 알아낸 정보

-> $MFT는 전체 MFT Entry를 관리하는 부분이다.

-> DATA가 시작하는 위치는 MFT Entry 0부터 시작한다.

-> 총 12개의 클러스터를 이용해 전체 MFT Entry를 저장하고 있다.





** MFT0번에서 B0속성 분석

-> B0속성은 $BITMAP





           : 부분 ( B0 00 00 00 으로 시작부분 )

[ B0속성 헤더 분석 ]




B0 00 00 00 : 속성 타입을 알려준다. B0은 ‭176‬이므로 $BITMAP 의미

48 00 00 00 : 속성의 길이이다. 속성 타입인 B0위치에서 속성의 길이인 ‭72‬바이트 뒤에는 다음속성 타입이 존재한다.

01 : 해당 값이 0이면 Resident Attribute 형식, 해당 값이 1이면 non-Resident Attribute 형식이다.

40 00 : 속성 이름 시작위치를 나타낸다.

00 00 00 00 00 00 00 00 : 시작 클러스터는 0번

00 00 00 00 00 00 00 00 : 마지막 클러스터는 0번    => 0~0번 클러스터를 사용하므로 총 1개의 클러스터를 사용한다.

40 00 : 런리스트 시작 위치를 나타낸다 속성헤더부터 64바이트 뒤에 위치함을 의미한다.

00 10 00 00 00 00 00 00 : 속성이 할당되어있는 클러스터의 총 사이즈를 Byte 단위로 나타내었다. ‭4096‬Byte

08 00 00 00 00 00 00 00 : 속성 내용의 실제 크기를 Byte단위로 나타내었다. 8Byte

08 00 00 00 00 00 00 00 : 속성 내용의 초기화된 사이즈, 일반적으로 실제사이즈와 동일한 값을 가진다. 8Byte





           : 부분

[ B0속성 내용 분석 ]




31 : Cluster Runs 구조에서의 헤더값으로 1은 Length크기, 3은 Offset 크기를 의미한다.

01 : Length값 ( 단위 클러스터 ) 으로 Offset위치로 부터 1클러스터만큼 크기를 갖는다.

FF FF 0B : Offset값 ( 단위 클러스터 ) 이므로 ‭‭786431‬ x 8 + 63(BR의 크기) = 6291511


=> Cluster Runs 구조체를 분석후 해당 섹터 6291511로 이동





## 6291511 이동




           : 부분

[ $MFT_$BITMAP 분석 ] : 6291511섹터에 위치



FF FF 00 FF 0C : MFT Entry의 사용현황을 알 수 있다. FF FF 00 FF 0C를 2진수로 변환한다.


** 2진수 변환시 유의사항

- $MFT_$BITMAP 분석시 빅앤디안 방식으로 진행한다.

FF FF 00 FF 0C -> ‭1111111111111111000000001111111100001100‬

11111111 : 0~7번 MFT Entry 사용중

11111111 : 8~15번 MFT Entry 사용중

00000000 : 16~23번 MFT Entry 사용안함

11111111 : 24~31번 MFT Entry 사용중

00001100 : 34,35번 MFT Entry 사용중


==> 데이터 복구시 해당 MFT 엔트리 번호를 2진수에서 사용함(1)로 변경해야 복구가 진행된다.




** B0속성 분석을 통해 알아낸 정보

-> $MFT_$BITMAP 속성은 B0속성의 Cluster Runs구조체를 분석한 곳으로 이동해야한다.

-> MFT Entry 사용현황을 2진수값으로 파악할 수 있다. ( 1: 사용, 0: 사용안함 )



** MFT Entry 0 번 속성별 정보

10속성 : $STANDARD_INFORMATION

30속성 : $FILE_NAME

80속성 : $DATA

B0속성 : $BITMAP

Comments