포렌식 통합/디지털 포렌식 한 권으로 끝내기

MBR - NTFS(Fixup Array, Common Attributes Header)

wintersnowaAa 2024. 3. 8. 15:26

현재 시각 오후 1시

다시 공부를 시작해보자

 

이번에는 Fixup Array과 Attributes에 대해서 알아볼 것이다.

더보기

Fixup Array

 

Fixup Array는 MFT Entry에서 오류를 발견하기 위해서 만들어졌다.

MFT Entry는 2개의 섹터 즉 1024바이트 만큼의 영역을 사용한다.

이전 포스팅에서 0x30의 오프셋만큼의 위치에서 Fixup Array가 시작됨을 알 수 있었다.

그리고 바로 옆의 0x03 00의 값이 Fixup Array의 갯수로 3개였다.

Fixup Array는 기본적으로 2바이트의 값을 시그니처로 가지므로

2*3으로 6바이트를 시그니처로 사용한다는 것이다.

시그니처는 그때 MFT Entry에 따라서 값이 매번 다른듯하다.

다른분들 포스팅에는 시그니처 값이 0x04 00, 0x4A 01 이렇게 나오는 경우도 있다.

?) Fixup Array 시그니처의 값에 따라서 무엇이 다른지 물어봐야겠다.

현재 내가 보고 있는 0번째 MFT Entry인 $MFT는 0x30 오프셋에서부터 Fixup Array가 있고, 2바이트의 Fixup Array를 3개 사용한다.

여기서 0x03 00 00 00 00 00 이 주어졌는데

2바이트 3개이므로 끊어서 보면

0x03 00

0x00 00

0x00 00

이렇게 3개로 사용됨을 알 수 있다.

이전 포스팅에서도 말했지만 MFT Entry는 1024바이트로 2개의 섹터만큼의 크기를 사용한다.

Fixup Array의 첫번째 값인 시그니처는 첫번째와 두번째의 섹터 끝 2바이트 값에 위치하게 된다.

그리고 시그니처가 위치하면서 섹터 끝 2바이트 값들에 있던 기존의 값들이 0x30 오프셋에 차례대로 시그니처 다음에 위치하게 된다.

MFT Header Fixup Array(signature) ......... ......... ......... Fixup Array(1 Sector End 2bytes) ........ Fixup Array(2 Sector End 2bytes)

이랬던 값들이

MFT Header Fixup Array(signature) Fixup Array(1 Sector End 2bytes) Fixup Array(2 Sector End 2bytes) ......... Fixup Array(signature) ........ Fixup Array(signature)

이렇게 바뀐다고 볼 수 있다.

다시 돌아와서 지금 보고 있는 Fixup Array 값들은

2*3 = 6바이트로

0x30 00 00 00 00 00 이다.

그러면 파일 시그니처는 0x30 00

첫번째 섹터 끝의 2바이트는 기존 0x00 00이였고

두번째 섹터 끝의 2바이트도 기존 0x00 00이였다는 뜻이다.

그러면 실제로 첫번째와 두번째 섹터 끝에 가보면 파일 시그니처 0x30 00 값이 존재하며 주변의 값들은 0x00 으로 채워졌을 가능성이 꽤나 높을듯하다.

$MFT의 주소값 0x11aa000 에서 512바이트만큼 더해주면

0x11aa200인 주소로 가면된다.

가보자.

첫번째 섹터

0x03 00 으로 시그니처 값이 존재한다.

그리고 주변에 0x0 값으로 있어야할 것 같이 값들이 분포되어있다.

두번째 섹터

0x03 00으로 시그니처 값이 존재한다.

그리고 마찬가지로 주변 값들이 0x0으로 어느정도 분포되어있다.

그리고 자연스럽게 $MFT 엔트리가 끝나는 지점 이후에 바로 0x11aa400부터 'FILE' 문자열로 시그니처가 나오면서

$MFT (0번째 MFT Entry) 이후 1번째 MFT Entry로 추정되는 $MFTMirr....

사진을 보면 더 이해가 잘 될 것이다.

근데 사진보면 하나 틀린 점이 있는듯?

첫번째 Sector 1의 마지막 주소는 0x01F0으로 맞게 표기했지만,

Sector 2의 주소값이 0x02F0이 아니라 0x03F0이여야지 2개의 섹터 크기 아닌가?

?) 내가 잘못 알고 있는건가...? 물어봐야겠다.

?) 아 그리고 다른 포스팅 보면 2*3 바이트를 Fixup Array로 사용하면 시그니처 이후의 6바이트를 표기하는 사람도 있던데 그게 맞는듯하다. 지금 나는 거의 99프로 확신함.

?) 더 궁금한 점은 여기 책에는 안나와있는데 Fixup Array를 어떻게 이용해서 값에 오류가 있는지 검출을 하는지가 궁금하다.

아래 포스팅 2개는 같은 오프셋과 갯수를 가지는데 다르게 표기를 했다.

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

 

NTFS File System (4) MFT

4. MFT NTFS File System (1) ~ (3)을 통해 MBR(혹은 EBR)을 지나 해당 파티션의 VBR을 찾을 수가 있었다. 이러한 VBR에서 BPB를 참고하여 $MFT의 위치까지 찾아보았다. 이제 이러한 MFT에 대하여 설명을 하고자

kali-km.tistory.com

NTFS - 예약된 MFT 엔트리 및 MFT .. : 네이버블로그 (naver.com)

 

NTFS - 예약된 MFT 엔트리 및 MFT 구조(MFT 엔트리 헤더, Fixup Array)

MFT는 Master File Table 의 머릿글자로 NTFS 구현의 핵심 원리 중 하나이다. NTFS를 공부할...

blog.naver.com

 

내가 2*3라고 표시한게 틀리게 한듯....하다. 시그니처 비포함 2*3 바이트이고, 마지막 2바이트는 그냥 비워두는 것 같다.

NTFS – MFT 엔트리 구조 (MFT Entry Structure) | FORENSIC-PROOF

 

NTFS – MFT 엔트리 구조 (MFT Entry Structure) | FORENSIC-PROOF

 

forensic-proof.com

이 분 포스팅이 정말 잘 되어있긴하다.

.다음은 속성(Attributes)이다.

여태까지 2개의 섹터를 사용하는 MFT Entry에서 사용한 영역 크기는

MFT Header (36bytes)

Fixup Array (2*3bytes) 실제로는 3개일지 4개일지는 바뀌겠지만 2개의 섹터를 사용하는 MFT Entry에서는 통상적으로 3개 일 것이다. 그래도 일단 MFT Header 끝난 이후에는 8바이트를 사용하고, 뒤에 2개의 2바이트를 더 사용하므로

현재까지 1024바이트 중에 사용한 바이트는 36+8+2+2로 48바이트이다.

아직 1024 - 48 = 976만큼의 바이트가 남아있다...

현재 MFT Entry 중에 내가 보고 있는 $MFT 에 대한 구조이다.

Attributes 또한 VBR, MFT와 같이 Header부분이 있다

Attribute Header + Attribute Content 을 세트로 1개의 Attribute 값을 가지게 되는데

총 17개의 속성이 있다.

MFT Entry가 17개의 모든 속성을 갖는건 아니고

파일의 크기에 따라서 몇가지 속성을 갖추게 된다.

 

680bytes 이하이면 Resident 속성

담아내야할 속성 값이 적어서 Attribute Header 바로 뒤에 Attribute Content 가능한 경우이다.

 

680bytes 초과이면 Non - Resident 속성

담아내야할 속성 값이 많아서 Attribute Header 바로 뒤에 Attribute Content 불가능한 경우이다.

무조건 어느 Attribute 속성의 유형은 Resident이다 Non - Resident이다라고 결정 지을 수는 없다.

Attribute Header의 값을 확인해보고 어느 Attribute인지, 그 속성의 크기가 Resident에 적합한지 Non - Resident에 적합한지 플래그 값에 확인할 수 있다.

일단 그러한 판단을 하기위해서 Attribute Header를 알아보자.

그 중에서 공통 속성 헤더에 대해서 먼저 알아볼 것이다.

더보기

Attribute Header(속성 헤더)

 

현재 표시한 값이 공통 속성헤더 이다.

공통 속성헤더는 Attribute가 어떤 속성을 가지건 공통되게 갖는 16바이트의 공통된 헤더부분이다.

 

속성 헤더의 구조는 이러하다

값을 분석해보자

0x10 00 00 00

Attribute Type ID으로 앞에 나온

값에 따라서 어떤 속성인지 나타낸다.

0x10 00 00 00이므로 $Standard_Information 속성이다.

0x60 00 00 00

해당 속성에 대한 크기이다.

0x60의 크기이므로 헤더의 시작인 0x11aa038부터 0x11aa038 ~ 0x11aa097이 $Standard_Information 속성이 차지한다.

0x00

Non Resident Flag로 해당 속성이 이전에 말했던 1개의 Attribute로 다 담기는 Resident 인지 Non - Resident인지 표기해주는 플래그 값이다.

0x0이므로 Resident이다. 속성 값이 생각보다 크지 않은가보다.

0x00

Length of Name 으로 속성의 이름 길이이다.

속성의 이름이 존재하지 않아서 0x0으로 설정

0x18 00

Offset to Name 으로 속성의 이름이 시작되는 위치이다 (바이트 단위 오프셋)

0x18로 헤더 시작 위치에서 더하므로 0x11aa038 + 0x18 = 0x11aa050 부터 속성의 이름이다.

0x00 00

Flag로 현재 속성의 상태를 말한다.

공통 속성 헤더에서 Flag 값은

현재 구글링해보니까 알려주는 값들은

0x0001 압축

0x4000 암호화

0x8000 sparse

이렇게 3가지의 값들이 있는데

근데 왜 난 0x00 00이지?

근데 책에서 작성자분도 0x00 00으로 되어있고

그냥 플래그 값이 0이라고만하고 설명이 없다

?) 추가적으로 더 있는지 물어보고싶다 구글링해도 표도 안나와있고 정보가 안보인다...

 

0x00 00

Attribute ID로 각 속성에 대한 고유한 ID 값이다.

아마 이건 제일 첫번째라서 이렇게 0x0 값이 매겨진듯하다.

이 값은 MFT Entry 내에서 속성 값들을 구분하기 위해서 주어진다
예를 들어서 $MFT 라는 MFT Entry 에 $DATA 라는 속성을 2개를 갖는다면,
첫번째 $DATA를 A라고 지칭하고, 두번째 $DATA를 B라고 지칭한다면,

A와 B의 공통 속성헤더의 속성ID 값은 고유하게 존재하므로 서로 다르다.

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

 

NTFS – MFT 엔트리 구조 (MFT Entry Structure) | FORENSIC-PROOF

 

forensic-proof.com

지금 여기에 댓글 2개 달아서 답변 받아야지 진행이 가능할듯.

pg. 107~111

 

추후는 Resident Header

출처)

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

 

NTFS – 속성 (Attributes) | FORENSIC-PROOF

 

forensic-proof.com

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

 

NTFS – $DATA 속성 | FORENSIC-PROOF

 

forensic-proof.com

[파일 시스템]NTFS - 3편(Attributes, $속성들) (tistory.com)

 

[파일 시스템]NTFS - 3편(Attributes, $속성들)

MFT 엔트리 구조에서 Attributes에 대한 내용을 다룹니다. 꽤 내용이 길수도 있습니다. 본 포스팅은 다음과 같은 내용을 다룹니다. NTFS MFT Attributes Resident, Non-resident $STANDARD_INFORMATION, $FILE_NAME, $BITMAP NT

dotaky99.tistory.com