Piki's Play
NTFS 데이터 구조 - 표준파일 속성들 본문
-> 이전 절에서는 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
-> 첫 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 속성 필드는 다음과 같다.
-> 마지막 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 속성을 갖는다.
-> 바이트 65는 win32 1로서 이름공간을 나타낸다. 이 엔트리 이름은 '57398408d01'이다. 타입식별자는 48로 동일하지만 속성식별자는 3을 갖는 다음 $FILE_NAME 속성을 아래 예에서 확인해보자.
-> 이 속성은 바이트 65에 도스인 2의 이름공간을 갖는다. 이 엔트리의 이름은 '573984~1'이다.
▶ $DATA 속성
- $DATA 속성은 고유한 구조체가 없어서 간단하다. 헤더 이후에는 파일 내용에 해당하는 미가공 데이터만있다. 타입식별자는 128이고, 최대값이나 최소값이 없다. 내용이 700바이트 이상이면 비거주 속성이된다. 대부분의 파일에서 이것은 MFT엔트리의 마지막 속성이다.
- 디렉토리는 인덱스 속성들 이외에 $DATA 속성들을 가질 수 있다.
▶ $ATTRIBUTE_LIST 속성
- $ATTRIBUTE_LIST 속성은 MFT엔트리내에 있고, 다른 속성들이 있을 수 있는 위치를 알려주는 역할을 한다. 이는 하나의 MFT엔트리에 적합하지 않은 속성헤더를 갖는 파일에 사용되고, 파일이나 디렉토리에 있는 모든 속성의 엔트리 목록을 포함한다. 속성타입 식별자 32를 갖고, 각 리스트 엔트리 필드는 아래와 같다.
- 시작 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으로 실행한 결과이다.
-> 이 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) 그리고 볼륨을 위한 마운트에 사용된다.
※ 접합과 마운트 지점의 내용은 아래와 같다.
- 접합이나 마운트 포인트의 타입플래그들은 0xa0000000 플래그를 갖는다. 여기서는 C:\windows에 연결되는 재파싱 지점을 볼 수 있다.
-> 바이트 8~9는 목표이름에 오프셋이 0이라는 것을 보여주고, 그것은 바이트 16에서 시작한다. 이름의 길이는 10~11에 있고, 28바이트(0xlc)라는 것을 알 수 있다. 유니코드로 그 이름이 '\??\C:\windows'라는 것을 볼 수 있다.
p.s 사진자르는거보다 직접 그리는게 더 좋은데... 이런 구조체 파트만오면 사진을 많이 쓸 수 밖에 없다..
'포렌식 > 파일시스템 (파일시스템 포렌식분석)' 카테고리의 다른 글
NTFS 데이터 구조 - 파일시스템 메타데이터 파일 (1) (0) | 2020.03.15 |
---|---|
NTFS 데이터 구조 - 인덱스 속성과 데이터 구조 (0) | 2020.03.13 |
Chapter 13. NTFS 데이터 구조 (0) | 2020.03.11 |
NTFS 분석 - 응용프로그램 범주, 큰 그림, 다른 주제 (0) | 2020.03.10 |
NTFS 분석 - 파일이름 범주 (0) | 2020.03.09 |