Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

Piki's Play

NTFS 데이터 구조 - 파일시스템 메타데이터 파일 (2) 본문

포렌식/파일시스템 (파일시스템 포렌식분석)

NTFS 데이터 구조 - 파일시스템 메타데이터 파일 (2)

Pikigod 2020. 3. 17. 14:01

▶ $Quota 파일

- $INDEX_ROOT와 $INDEX_ALLOCATION 속성을 사용한다. $O 인덱스는 한 SID와 소유자 SID를 연결시키고, $Q 인덱스는 할당정보에 자산의 ID를 연결시킨다.

$O 인덱스를 위한 인덱스 엔트리는 아래에서 주어지는 필드들을 갖는다. 

 

SID와 소유자 ID를 연결시킨다.

-> 이 인덱스 엔트리의 플래그 값들은 파일 이름에서 보았던 것과 동일하다. 목록에 마지막 엔트리일때 설정된다. 만약 자식이 존재하면 그 바이트는 자식의 VCN을 위해 사용된다.

다음 예에서 $O 인덱스에 있는 첫 엔트리를 볼 수 있다.

 

$O 엔트리 예제

-> 바이트 0~1은 소유자 ID가 엔트리 시작으로부터 오프셋 28에 위치한다는 것을 보여주고, 바이트 2~3은 소유자 ID의 길이를 의미하고 해당 값은 4바이트이다. 바이트 8~9는 인덱스 엔트리가 32(0x20)바이트 길이라는 것을 의미하고, 바이트 10~11은 SID가 12(0x0c)바이트인 것을 보여준다. 바이트 16~17은 SID를 저장하고, 바이트 28~31은 소유자 ID 260(0x0104)를 저장한다. 그 목록의 두 번째 엔트리는 바이트 32에서 시작하고, 바이트 60~63에 소유자 ID는 259이다.

 

- $Q 인덱스는 사용자 ID와 소유자릐 할당정보를 연결한다. $Q의 인덱스 엔트리는 아래 표에서 보는것과 같다. 

->0x01은 자식노드가 있을때 설정되고, 0x02는 마지막 노드일때 설정된다. 

 

$Q 인덱스 엔트리 플래그 필드의 플래그 값은 아래와 같다. 

0x00000001 = Defualt

 

- $Q 인덱스가 사용되었던 예제 이미지의 인덱스 엔트리를 다시 보도록하자. 이것은 $INDEX_ALLOCATION 속성에 있었고, 그 헤더데이터는 제거되었다. 이것은 실제적으로 엔트리 목록 내부에 있었고, 이전 예제에서 보았던 소유자 ID에 해당한다. 

$Q의 예제이다.

-> 바이트 0~1은 할당정보에서 오프셋이 20(0x14) 바이트라는 것을 보여주고, 바이트 2~3은 거기에 할당정보 60바이트가 있다는 것을 의미한다. 바이트 16~19는 $Q인덱스에서 보았던 두번째 엔트리인 소유자 ID 259(0x0103)를 보여준다. 바이트 24~27은 할당플래그들을 저장하고, 이 사용자는 디폴트 제한을 갖는다.(0x00000001) 바이트 28~35는 이 사용자가 오직 계정에 부여된 337,920(0x052800) 바이트만 가질 수 있다. 

 

 

▶ $LogFile 파일

- $LogFile은 MFT 엔트리 2이고 NTFS 저널로 사용된다. 표준파일 속성을 갖고, $DATA 속성에 로그데이터를 저장한다. 데이터 구조체의 정확한 세부사항은 알려지지 않았다. 하지만 수많은 분석을 통해 예측이 가능하다. 

 

아래 예에서 로그는 4096바이트 페이지들로 구성되어있다. 첫 두개는 재시작 영역이고, 그것들은 각 페이지의 첫 4개 페이지들에 시그니처 'RSTR'이 있다.

 

# icat -f ntfs ntfs1.dd 2 | xxd | grep RCRD

0000000 : 5253 5452 1e00 0900 0000 0000 0000 0000 RSTR . . . . . . . . . . . . . 

0004096 : 5253 5452 1e00 0900 0000 0000 0000 0000 RSTR . . . . . . . . . . . . . 

 

-> 이 데이터 구조체의 다른 값들 중 대부분은 0이고 문자열은 오직 유니코드의 'NTFS'이다.

 

바이트 오프셋 8192에 있는 두번째 재시작 데이터 구조체는 레코드들이고, 'RCRD'로 시작한다. 

 

# icat -f ntfs ntfs1.dd 2 | xxd | grep RCRD

0008192 : 5243 5244 2800 0900 0050 2500 0000 0000 RCRD( . . . . P%. . . . .

0012288 : 5243 5244 2800 0900 0050 2500 0000 0000 RCRD( . . . . P%. . . . .

 

거주데이터 속성들은 로그 파일에서 확인할 수 있다는 것들을 보여주기 위해 'My newfile, Can you see it?' ASCII 문자열을 갖는 C:\log-test.txt라 불리는 파일을 생성한다. 이후 로그파일은 다음과 같다.

-> 파일텍스트가 레코드에 있는 것을 확인할 수 있다. 그 레코드 다음에 파일이름과 디스크이름 'NTFS Disk2'를 볼 수 있다. 

 

이후 'This is my update'를 포함하도록 스트링을 수정했다. 그 데이터는 로그파일의 뒷 부분에 위치하게 된다.

수정한 내용(새로운내용)은 뒷 부분에 저장된다.

-> 이 레코드는 오직 새로운 내용만 저장하고, 업데이트되는 파일의 경로 이름을 저장할 수 없다. 거기에는 다른 레코드를 가리키는 레코드의 파일이름을 판별하는 레퍼런스가 있다. 

 

 

▶ $UsrJrnl 파일

- 변경 저널 프로그램은 응용프로그램 범주에 속하고, 파일에서 변경이 발생할 때 기록된다. 변경은 예약된 MFT엔트리에 위치하지 않는 \$Extend\$UsrJrnl 파일의 $J라는 이름의 $DATA 속성에 기록된다. $J $DATA 속성은 Sparse 이다. 이 속성은 다른 크기로 된 데이터 구조체 목록을 포함하고, 이것을 변경 저널 엔트리라고 부른다.  거기에는 사용자 저널 최대 설정에 대한 정보를 포함하는 $MAX라 부르는 $DATA 속성이 있다. 

- 이 데이터는 부가적이고 따라서 이 테이블에 있는 '필수 여부'는 현재 연 파일 변경의 로그를 제공하는 목적에 필수적인지를 의미한다.

 

※ $J에 있는 엔트리 데이터 구조체는 아래와 같다. 

-> 바이트 40~43은 플래그인데 변경저널 엔트리의 생성이유를 포함한다. 여기에는 엔트리 생성의 한 개 이상의 이유가 있다. 

 

※ 변경 타입 필드의 값들은 아래와 같다. 

- 바이트 44~47에 있는 소스 값들은 보통 0이지만 OS가 엔트리를 생성했다면 그 값은 0이 아닐 수 있다. 

 

※ 작은 변경 저널의 예를 보자. 저널에 대한 MFT엔트리를 보기위해 \$Extend 파일시스템 메타데이터 디렉토리 즉, MFT엔트리 11의 내용을 조사한다. 

 

# fls -f ntfs ntfs3.dd 11

r/r 25-144-2 :     $ObjId : $O

r/r 24-144-3 :     $Quota : $O

r/r 24-144-2 :     $Quota : $Q

r/r 26-144-2 :     $Reparse : $R

r/r 27-128-3 :     $UsnJrnl : $J

r/r 27-128-4 :     $UsnJrnl : $Max

 

위 결과에서 MFT엔트리 27을 볼 수 있고, icat 속성으로 $J 속성 내용을 표시할 수 있다. 

-> 첫 번째 4바이트는 이 변경 저널 엔트리가 80이라는 것을 보여주고, 바이트 8~13은 엔트리가 MFT엔트리 28(0x1c)를 위한 것임을 보여준다. 바이트 24~31은 이 엔트리가 USN 0을 가지고 바이트 40~43인 플래그는 0x00000001이고, 기본 $DATA 속성이 수정되었음을 의미한다. 마지막으로 이 엔트리가 파일 file-0.txt를 위한 것임을 알 수 있다. 

 

$Max 속성은 전체적인 변경 저널 관리정보를 저장한다. 그 속성 필드는 아래와 같다.

<$UsrJrnl $Max 속성의 데이터 구조체>

 

아래는 $Max 속성의 예이다.

 

# icat -f ntfs ntfs3.dd 27-128-4 | xxd

0000000 : 0000 8000 0000 0000 0000 1000 0000 0000 . . . . . . . . . . . . . . . . . .

0000016 : 4057 7491 eb69 c401 0000 0000 0000 0000 @Wt . . i . . . . . . . . .  . 

 

 

▶ 요약

-  NTFS에는 설명서대로 분석하기 힘들게 만드는 데이터 구조체와 포인터들이 있다. 이 장은 공식명세는 아니지만 매우 신뢰적이다.