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 데이터 구조 - 표준파일 속성들 본문

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

NTFS 데이터 구조 - 표준파일 속성들

Pikigod 2020. 3. 12. 17:54

-> 이전 절에서는 MFT엔트리와 속성 헤더를 처리하는 방법을 간단히 설명하였다. 이 절에서는 각각 다른 속성 내용 타입을 어떻게 처리하는지 설명해보자

 

 

$STANDARD_INFORMATION 속성

- 타입 식별자 16$STANDARD_INFORMATION 속성은 항상 거주속성이고, 파일이나 디렉토리의 기본 메타데이터를 포함한다. 모든 파일과 디렉토리에 존재하고 가장 낮은 타입 식별자를 갖기 때문에 일반적으로 첫번재 속성이다.

 

- 4개의 시간값들은 1601년 1월 1일 UTC부터 100나노 단위로 저장이된다. 같은 시간 필드들이 $FILE_NAME 속성에도 있지만 윈도우가 파일 속성에서 보여주는 시간값은 $STANDARD_INFORMATION 정보이고, 업데이트 되는 정보도 마찬가지이다.

 

아래의 그림은 $STANDARD_INFORMATION 속성의 플래그 값이다.

-> 이러한 많은 플래그들은 FAT에서 본것과 동일하다. 암호화나 Sparse 속성의 플래그들은 속성 헤더에서도 존재한다. 그래서 얼핏보면 중복되는 모습을 보인다.

 

- $STANDARD_INFORMATION 속성을 보도록하자. icat 도구를 이용하고 속성 타입을 지정해서 속성을 볼 수 있다. 이것은 표준 헤더를 제거하고 내용만 보여준다. $MFT 파일의 속성 내용은 다음과 같다. 

 

# icat -f ntfs ntfs1.dd 0-16 | xxd

$MFT파일의 속성 내용

-> 첫 8바이트는 생성시간을 보여준다. 4개의 각 필드값이 동일하다. 바이트 32~35에는 플래그값 0x00000060 값이 있고, 이 값은 파일시스템 메타데이터 파일에서 볼 수 있는 시스템 플래그와 숨김비트를 포함하고 있다. 바이트 36~39와 40~43은 파일 버전이 사용되지 않았다는 것을 보여주며, 44~48은 클래스 ID가 0이라는 것을 보여준다. 

바이트 48~51에서 소유자 ID는 0이고, 바이트 52~55에 보안 ID는 1이다. 어떠한 사용자 할당도 적용되지 않고, 대부분 시스템들의 변경 저널링이 비활성화 되어있기 때문에 나머지 값들은 0이다. 그래서 USN은 할당되지 않고, 이 경우는 $MFT에서 드문일이 아니다.

 

 

▶ $FILE_NAME 속성

- 타입 식별자 48인 $FILE_NAME 속성은 두가지 목적으로 사용된다. 이 속성은 파일 이름과 부모 디렉토리 정보를 저장하기 위해 MFT엔트리에 위치하며, 디렉토리 인덱스에서 사용된다. MFT 엔트리에서 사용될 때는 그 어떤 필수적인 정보도 포함하지 않지만 디렉토리 인덱스에서 사용할 때는 그렇지 않다. 

- 표준파일이나 디렉토리에서 이것은 두 번째 속성이고, 항상 거주이다. 만약 한 파일에 여러 MFT엔트리가 필요하면 $ATTRIBUTE_LIST 속성이 $STANDARD_INFORMATION 과 이 속성($FILE_NAME) 사이에 존재하게 된다.

 

$FILE_NAME 속성 필드는 다음과 같다.

$FILE_NAME 속성의 데이터 구조체

-> 마지막 3개 필드들은 이 속성이 디렉토리 인덱스에서 사용될 때는 필수적이지만 파일 MFT엔트리에서 사용될 때는 상관없다. 플래그 필드는 $STANDARD_INFORMATION과 동일한 값들을 사용한다.

 

이름형식 바이트(65~65)는 이름필드에 저장되어 있는 값이 어떤 형식인지 보여주며 아래의 표는 그 형식 값의 종류를 설명한다. 

 

※ FILE_NAME 속성을 보기위해 $MFT를 다시 확인하고, icat 도구에 속성 타입 48을 지정한다.

-> 첫 8바이트가 파일참조이므로 상위 2바이트는 순서번호이고, 하위 6바이트는 MFT 엔트리이다. 따라서 부모디렉토리는 MFT엔트리 5이고, 루트디렉토리이다. 다음 8비트는 생성시간에 관한 것이고 속성에 다른 3개의 시간 값과 같다. 바이트 40~47, 48~55는 할당된 파일의 실제 크기를 보여준다. 이 값은 둘다 16384(0x4000)바이트로 되어있다. 사실 이 파일을 위한 $DATA 속성은 8634368 바이트이므로 이것이 정확하다고 볼 수 없다. 많은 파일들은 이 크기를 0으로 설정하는데 이 속성이 디렉토리 인덱스에서 사용될 때는 정확하다. 바이트 64는 이름이 4문자 길이이고, 바이트 65는 그것이 도스와 win32에 호환되는 이름공간 3에 있음을 보여준다. 이름은 UTF-16 유니코드이고 바이트 66에서 시작한다. 그 이름은 $MFT이다.

 

마지막 예로 윈도우가 도스이름을 필요로하기 때문에 한 파일이 두 $FILE_NAME 속성을 갖는다고 하자. 아래 파일은 도스이름공간과 win32 이름공간 둘 다 $FILE_NAME 속성을 갖는다.

첫번째 $FILE_NAME 속성, 속성식별자 2

-> 바이트 65는 win32 1로서 이름공간을 나타낸다. 이 엔트리 이름은 '57398408d01'이다. 타입식별자는 48로 동일하지만 속성식별자는 3을 갖는 다음 $FILE_NAME 속성을 아래 예에서 확인해보자.

타입 식별자는 48로 동일하나 속성 식별자는 3이다. 

-> 이 속성은 바이트 65에 도스인 2의 이름공간을 갖는다. 이 엔트리의 이름은 '573984~1'이다.

 

 

▶ $DATA 속성

- $DATA 속성은 고유한 구조체가 없어서 간단하다. 헤더 이후에는 파일 내용에 해당하는 미가공 데이터만있다. 타입식별자는 128이고, 최대값이나 최소값이 없다. 내용이 700바이트 이상이면 비거주 속성이된다. 대부분의 파일에서 이것은 MFT엔트리의 마지막 속성이다.

- 디렉토리는 인덱스 속성들 이외에 $DATA 속성들을 가질 수 있다.

 

 

▶ $ATTRIBUTE_LIST 속성

- $ATTRIBUTE_LIST 속성은 MFT엔트리내에 있고, 다른 속성들이 있을 수 있는 위치를 알려주는 역할을 한다. 이는 하나의 MFT엔트리에 적합하지 않은 속성헤더를 갖는 파일에 사용되고, 파일이나 디렉토리에 있는 모든 속성의 엔트리 목록을 포함한다. 속성타입 식별자 32를 갖고, 각 리스트 엔트리 필드는 아래와 같다. 

$ATTRIBUTE_LIST 속성에 있는 리스트 엔트리들의 데이터 구조체

- 시작 VCN 같은 여러 MFT엔트리들이 단일 속성을 설명할 필요가 있을 때 사용된다. 이때 추가적인 엔트리들은 0이아닌 시작 VCN 값들을 갖고, 그 속성헤더 또한 0이아닌 시작 VCN을 갖는다.

 

※ $ATTRIBUTE_LIST 속성을 갖는 파일을 보자.

파일 예

-> 첫 4바이트는 16(0x10)이고, 이는 첫 엔트리 타입 $STANDARD_INFORMATION을 보여준다. 바이트 4~5는 이 리스트길이가 32바이트(0x0020)이고, 바이트 16~21은 현재보고있는 MFT엔트리 5009(0x1391)에 그 속성이 위치한다는 것을 보여준다.

- 다음 두 엔트리들은 바이트 32, 64에서 시작하고 48속성타입 식별자를 갖는 $FILE_NAME 속성이다. 이 속성 둘다 현재 MFT 엔트리에 위치한다. (5009, 0x1391)

- 바이트 96은 $DATA 속성의 첫번째 엔트리가 시작하는 곳이다. 바이트 104~111은 $DATA 속성이 VCN 0에 있고, 바이트 112~117은 그 속성이 MFT엔트리 4919(0x1337)에 위치한다는 것을 보여준다. 두번째 $DATA 속성은 128에서 시작하고 두 $DATA 속성의 ID 값이 같기 때문에 같은 $DATA 속성 일부로 볼 수 있다. 바이트 136~143은 두번째 엔트리가 5152(0x1420)의 시작 VCN을 갖는 것을 표시한다. 즉, 첫번째 엔트리의 $DATA 속성은 5152클러스터를 설명하기 위해 MFT엔트리에 충분한 공간을 갖는다. 클러스터 run의 나머지 바이트는 144~149에서 볼 수 있는 MFT엔트리 5037(0x13ad)의 $DATA 속성에 저장되어 있다.

 

※ 아래 그림은 이 파일의 개요를 보여준다. $STANDARD_INFORMATION과 기본 MFT 엔트리 5009의 두 $FILE_NAME을 갖고, $DATA 속성을 위한 헤더들은 엔트리 4919와 5037에 위치한다.

예제 이미지의 속성리스트 엔트리들의 레이아웃

 

- 12장에서 비기준 엔트리는 $STANDARD_INFORMATION과 $FILE_NAME 속성을 갖지 않는다고 말했다. 아래의 그림은 비기준 엔트리 4919를 istat으로 실행한 결과이다.

비기준 엔트리 4919

-> 이 MFT 엔트리는 오직 $DATA 속성을 갖고, 헤더는 엔트리 5009 기준 레코드를 표시한다. 링크카운트는 그것을 가리키는 이름이 없기 때문에 0이다.

 

 

$OBJECT_ID 속성

- $OBJECT_ID 속성은 64타입 식별자를 갖고, 이름 대신 파일을 나타내는 128비트 전역 오브젝트 식별자를 나타낸다. 

\$Extend\$Objid 인덱스는 파일의 오브젝트 ID로 정렬되고 각 파일에서 볼 수 있는 파일참조 주소를 포함한다. 그 속성에는 단지 4개의 필드만 있고 보통 첫번째 것만 정의되어있다.

 

-> 할당된 오브젝트 ID가 있는 많은 파일들은 첫 번째 값만 갖고 그 속성의 크기는 16바이트이다. $Volume 파일은 아래 예시와 같이 흔힌 $OBJECT_ID 속성을 포함한다.

 

#icat -f ntfs img.dd 3-64 | xxd

0000000 : fe24 b024 e292 fe47 95ac e507 4bf5 6782 .$.$...G....K.g.

 

 

▶ $REPARSE_POINT 속성

- $REPARSE_POINT 속성은 속성 식별자 192를 가지고, 재파싱 지점의 파일들에 사용된다. 재파싱 지점들은 심볼릭링크와 접합(junction) 그리고 볼륨을 위한 마운트에 사용된다.

 

※ 접합과 마운트 지점의 내용은 아래와 같다.

접합과 마운트 지점 $REPARSE_POINT 의 데이터 구조체

 

- 접합이나 마운트 포인트의 타입플래그들은 0xa0000000 플래그를 갖는다. 여기서는 C:\windows에 연결되는 재파싱 지점을 볼 수 있다.

-> 바이트 8~9는 목표이름에 오프셋이 0이라는 것을 보여주고, 그것은 바이트 16에서 시작한다. 이름의 길이는 10~11에 있고, 28바이트(0xlc)라는 것을 알 수 있다. 유니코드로 그 이름이 '\??\C:\windows'라는 것을 볼 수 있다.

 


p.s 사진자르는거보다 직접 그리는게 더 좋은데... 이런 구조체 파트만오면 사진을 많이 쓸 수 밖에 없다..