Pikigod 2020. 3. 6. 21:28

12.3 메타데이터 범주

- 메타데이터 범주는 파일이나 디렉토리를 설명하는 데이터를 포함한다. 모든 메타데이터는 속성들 중 하나에 저장이 된다. 따라서 파일 속성의 세부 내용을 확인한다. 보통 파일은 $STANDARD_INFORMATION, $FILE_NAME, $DATA 속성을 갖는다. 디렉토리에서 사용하는 속성과 인덱스들은 '파일 이름 범주'에서 기술하도록 하겠다. 

 

※ 다음 그림은 전형적인 표준 속성을 갖는 파일을 보여준다.

$STANDARD_INFOMATION, $FILE_NAME, $DATA 3개가 있다.

 

 

▶ $STANDARD_INFOMATION 속성

- $STANDARD_INFOMATION 속성은 모든 파일, 디렉토리에 존재하고 핵심적인 메타데이터를 포함한다. 이 속성에는 시간, 날짜스탬프 세트와 소유권, 보안, 할당정책이 있다. 이 속성은 필수는 아니지만 마이크로소프트가 제공하는 응용프로그램 수준에서는 필요하다. 

- 이 속성을 위한 디폴트타입 ID는 16이고, 크기는 고정된 크기로 윈도우 버전마다 다르다.(NT-48, 2000,XP-72바이트) 마이크로소프트는 MFT엔트리에 있는 속성들을 정렬하고, 이것은 항상 첫 엔트리인데, 이는 가장 낮은 타입의 ID를 가지고 있기 때문이다. 

- 이 속성에는 4개의 날짜, 시간 스탬프가 있다. 기준은 1601년 1월 1일부터 100나노로 표현한 64비트 값이다.

 

※ 이 속성의 4개의 시간값은 아래와 같다.

º 생성시간 : 파일이 생성된 시간

º 수정시간 : $DATA나 $INDEX 속성 내용들이 마지막으로 수정된 시간

º MFT수정시간 : 파일 메타데이터가 마지막으로 수정된 시간, 윈도우 속성에서는 보여주지 않는다. 

º 접근시간 : 파일에 마지막으로 접근된 시간

 

- 속성은 읽기전용, 시스템, 아카이브 같은 파일의 일반적인 속성을 위해 한개의 플래그를 포함한다. 또한 이러한 속성값들은 파일이 아닌 압축, Sparse, 암호화되었는지 설명해준다.

-> 이값으로 파일, 디렉토리 구분은 할 수 없다. (이는 헤더플래그가 하는 일이다.)

 

- NTFS 3.0+ 버전에서 이러한 속성은 보안정보와 응용프로그램 수준의 기능들을 위해 4개의 추가된 값들을 포함한다.

하나는 파일 소유자의 신원이고, 다른하나는 한 사용자가 사용할 수 있는 데이터량을 나타내는 할당 데이터의 인덱스이다. 또한 그 속성은 사용자 용량에 얼마나 많은 데이터가 더해질 수 있는지 나타내는 값을 갖는다. 

- 보안 ID 값은 $Secure 파일을 위한 인덱스로 사용되고 이 파일에 적용된 접근제어 규칙을 결정하는데 사용된다. $Secure 파일은 '메타데이터 범주' 절에서 설명한다. 만약 변경 저널링이 사용되었다면 이 속성은 이 파일이 생성되었던 마지막 레코드를 위해 USN(Update Sequence Number)를 포함한다. -> 이는 뒤에서 다시 설명하겠다.

- 요약하면 이 속성은 많은 메타데이터를 포함하지만 파일시스템에 필수적인 것은 하나도 없다. 이러한 속성은 파일과 디렉토리들을 위해 존재하지만 비기준 MFT엔트리에는 존재하지 않을 수 있다. 

 

 

$FILE_NAME 속성

- 모든 파일과 디렉토리는 MFT엔트리 내에 최소 한개의 $FILE_NAME 속성이 있다. 두 요소가 반드시 일치할 필요는 없지만, 파일과 디렉토리마다 부모 디렉토리인덱스의 $FILE_NAME 속성에 최소한 한개의 다른 요소를 갖는다. 부모 디렉토리의 $FILE_NAME 속성은 나중에 '파일 이름 범주'에서 설명하겠다. 이 절에서는 단지 MFT엔트리 한개에 집중하도록 한다. 속성타입 식별자는 48이고 파일 이름의 길이에 따라 유동적인 길이를 갖는다. 기본길이는 66바이트이다. 

- $FILE_NAME 속성은 UTF-16 유니코드로 인코딩된 파일 이름을 포함한다. 그 이름은 반드시 8.3도스형식, win32형식, POSIX형식 같은 특정 이름 공간에 있어야 한다. 각 이름공간은 그것들이 유효한 문자인지 고려해야 하는 상황에 관한 제약들을 갖는다.

- $FILE_NAME 속성은 부모 디렉토리를 위한 파일참조를 포함하고 이 파일참조는 그 속성이 MFT엔트리에 있을 때 가장 유용한 값 중 하나이다. -> 도구가 MFT엔트리 전체 경로를 더 쉽게 식별할 수 있도록 한다. 

- 또한 이 속성은 앞에 $STANDARD_INFOMATION 속성 절에서 설명한 4개의 비필수 값을 포함한다. 윈도우는 이 값들을 파일 생성, 이동 이름 변경시에만 변경한다.

- $FILE_NAME 속성은 실제, 그리고 할당된 파일의 크기를 위한 필드들이 있지만 이런 값들은 사용자 파일들과 디렉토리에서는 0이다. 

- 마지막으로 이 속성에는 엔트리가 디렉토리, 읽기전용, 시스템파일, 압축, 암호화되어 있는지 구분하는 플래그 필드가 있다. $STANDARD_INFOMATION에서 사용한 플래그와 같다.

- 요약하면 이 속성은 $STANDARD_INFOMATION과 중복된 값들이 많다. 새로운 값은 파일이름과 전체 경로를 결정하는데 사용하는 부모 디렉토리 주소이다.

 

 

▶ $DATA 속성

- $DATA 속성은 정해진 값을 갖지 않는다. 다만 어떠한 형태를 저장하기 위해 사용된다. 속성타입 식별자는 128이고 0바이트 크기부터 어떠한 크기로도 가능하다. $DATA속성은 각 파일에 할당되고 이름이 없다. TSK를 포함한 도구에서 $DATA로 이름을 붙인다. 추가적으로 생성하는 $DATA 속성들은 MFT엔트리에 할당되고 그것들은 반드시 이름이 있어야한다. 

- 추가적인 $DATA속성을 사용할 수 있다. 윈도우 파일을 오른쪽 클릭해서 '속성'에 정보를 입력할 수 있고, 그 정보는 $DATA속성에 저장된다. 추가적인 $DATA속성은 데이터를 숨기는데 사용할 수 있고, 디렉토리 목록 확인시 보이지 않는다. 대부분의 포렌식 도구들은 ADS(Alternate Data Streams)이라고 불리는 추가적인 $DATA 속성을 보여준다.

- 사용자들은 명령 프롬프트에서 한개의 ADS를 쉽게 생성가능하다. 한개의 콜론 ':'을 이용해 ADS데이터와 속성이름을 저장한다.

 

※ 아래는 file.txt 파일에 foo라는 $DATA 속성을 생성하는 예이다.

 

C:\>echo 'Hello There'>file.txt : foo

 

- $DATA는 데이터에 비인가된 접근을 막기위해 암호화하거나 공간을 절약하기 위해 압축할 수 있다. 이러한 선택사항을 사용할 때 그 속성헤더는 해당 플래그를 설정한다. 암호화를 사용할 때는 암호화 키를 저장하기 위해 $LOGGED_UTILITY_STREAM이 존재한다.

 

※ 다음은 한 파일에서 암호화된 두 $DATA 속성을 갖는 예제이다. 

암호화된 2개의 $DATA 속성이 있는 파일

-> 여러개의 $DATA 속성이 존재할 때 2개 모두 같은 암호화키를 사용한다.

 

 

▶ $ATTRIBUTE_LIST 속성

- $ATTRIBUTE_LIST속성은 모든 파일이나 디렉토리들이 모든 속성들을 저장하기 위해 MFT엔트리를 한개 이상 필요로 할 때 사용된다. 한개의 파일이나 디렉토리에는 65536개의 속성이 있을 수 있는데 이는 한 엔트리에 모두 넣을 수는 없다. 최소한 한개의 MFT엔트리에 각 속성 헤더를 넣을 필요는 있다. 내용은 비거주지만, 때로는 그 헤더들을 저장하기 위해 여러개의 MFT엔트리들이 필요하다. 

- $ATTRIBUTE_LIST 속성은 타입식별자가 32이고 두번째로 작다. 그래서 항상 기준 MFT엔트리가 된다. 자신을 제외한 파일의 모든 속성의 목록을 담는다. 목록의 각 엔트리는 속성타입과 어디에 위치하는지 알려주는 MFT엔트리 주소를 포함한다. 

- 속성은 단편화 될 가능성이 있고, runlist를 저장하기 위해 여러 MFT엔트리들을 요구할 수 있다. 이것은 $DATA가 있는 경우에만 발생할 수 있다. 이것이 발생했을 때 각 비기준 MFT엔트리는 일반적인 $DATA 속성을 갖지만 그것은 파일 어디에 맞는지 식별한다. 그 속성 헤더에는 논리적 파일주소인 run의 시작 VCN(Virtual Cluster Number)을 보여주는 한 필드가 있다. 

- 예를들어 한 파일이 $DATA 속성의 runlist를 저장하기 위해 2개의 MFT엔트리가 필요한 예를 보자.

그 첫 엔트리는 $DATA 속성의 첫 500MB를 위한 run을 포함하고 두번째 엔트리는 나머지 run들을 포함한다. 두번재 엔트리에 속성 헤더는 그 run들이 전체 $DATA속성에 500MB에서 시작하는 것을 식별한다.

 

※ 다음 그림을 보자

-> 여기서 37엔트리는 기준 MFT이고, 기준 엔트리는 $STANDARD_INFOMATION 속성과 리스트에 5개의 엔트리가 있는 $ATTRIBUTE_LIST속성을 포함한다.

두번째 엔트리는 $FILE_NAME을 위한 것이며 엔트리 48에 위치한다. 엔트리 48, 49의 $DATA 속성은 같은 속성이고 첫번째 데이터 속성의 284MB는 48엔트리에서 설명되고 나머지는 $DATA엔트리 49에서 설명된다.

 

 

▶ $Secure 파일

- 앞에서 언급했듯, 보안 식별자들은 파일이나 디렉토리 접근을 위한 접근 제어 정책을 정의하기 위해 사용된다. NTFS버전 3.0이상에서 보안 식별자들은 MFT엔트리9에 위치하는 $Secure 파일시스템 메타데이터 파일에 저장된다.

- 모든 파일과 디렉토리의 $STANDARD_INFOMATION 속성은 보안 ID(Security ID)라고 부르는 한개의 식별자를 포함하고 그 ID는 적절한 기술자를 확인하기 위해 $Secure 파일에 인덱스로 사용된다. 이러한 32비트 보안 ID들은 윈도우에서 사용자들에게 할당되는 보안 식별자(Security Identifiers, SID)와는 다르다. SID는 전역으로 고유하고 보안 ID는 파일시스템에서 고유하다.

- $Secure 파일은 두개의 인덱스($SDH와 $SII)와 한개의 $DATA 속성($SDS)을 포함한다. $DATA속성은 실제 보안기술자를 포함하고 두 인덱스들은 기술자를 참조하기 위해 사용된다. $SII인덱스는 $STANDARD_INFOMATION 속성에 위치한 보안 ID로 정렬된다. (SDH와 SII는 SDS를 참조하기 위해 사용된다.) $SII인덱스는 그것의 보안 ID를 확인할 때 파일에 보안 기술자 위치를 확인하기 위해 사용된다. $SDH인덱스는 보안 기술자의 해시에 의해 정렬된다. 운영체제는 새로운 보안 기술자가 파일이나 디렉토리에 적용될때 이 인덱스를 사용한다. 만약 새로운 기술자의 해시를 찾을 수 없다면 새로운 기술자와 보안 ID는 두 인덱스에 생성되고 더해진다. 

 

※ istat도구로 작은 시스템에서 $Secure파일을 해석한 결과는 아래와 같다.

-> 200KB $DATA 속성에는 보안 기술자의 복사본과 $SDH와 $SII로 부르는 2개의 인덱스가 있다. 

 

 

예제 이미지

- 한 파일에 istat 실행결과를 확인해보도록 하겠다. C:\boot.ini 파일을 대상으로 하고, 더욱 쉽게 설명하기 위해 그 결과를 몇개로 나눴다.

 

# istat -f ntfs ntfs1.dd 3234

MFT Entry Header Values : 

Entry : 3234         Sequence : 1

$LogFile Sequence Number : 103605752

Allocated File

Links : 1

 

-> MFT엔트리 헤더를 보여주며, 그것의 순서는 1이고 이 엔트리에 할당되는 첫번째 파일이라는 것을 의미한다. 또 파일이 마지막으로 변경될 때 해당하는 LSN($Logfile Sequence Number)를 볼 수 있다. 파일시스템 저널 로그는 이 값을 사용한다.

 

-> 여기에서 $STANDARD_INFOMATION 속성에 플래그와 값과 소유자 정보를 포함하는 데이터를 볼 수 있다. 보안 ID는 $Secure 인덱스에서 데이터를 찾기 위해 주어진다. 또한 파일이 변경될 때 업데이트되는 'Last User Journal Update Number'를 볼 수 있다. 이 값은 "응용프로그램 범주"절에서 설명하는 변경저널에서 사용한다. 

 

-> 위 결과는 $FILE_NAME 데이터이다. 시간 값들은 $STANDARD_INFORMATION에 있던 것과는 다르며 크기값은 0이다. 루트디렉토리인 부모 디렉토리는 MFT엔트리 5인것을 확인할 수 있다.

 

-> 결과의 마지막 부분은 모든 속성이다. 그것은 194바이트크기이고, 거주 $DATA 속성을 갖는다. 타입식별자와 속성식별자는 타입 이름 다음에 주어진다.

 

 

할당 알고리즘

- 이번에는 메타데이터 할당 알고리즘에 대해 기술하겠다. 다른 설명들과 마찬가지로 그것들은 응용프로그램에 종속적이다. 메타데이터로 언급할 수 있는 3가지 전략이 있다. 2개는 MFT엔트리들과 속성들을 할당하는 방법이고 나머지 하나는 비필수 데이터를 업데이트 하는 방법이다. 

 

MFT엔트리와 속성 할당

- 첫번째는 MFT엔트리 할당이다. 윈도우는 엔트리 24를 기준으로 시작하고 '첫번째 적용' 알고리즘으로 MFT엔트리들을 할당한다는 것을 확인할 수 있었다. 엔트리 0에서 15는 예약되어있고 그것들이 사용중이 아니어도 할당된 상태로 설정되며, 16~23은 전형적으로 할당되지 않는다. 사용자 파일들은 엔트리 24에서 시작하고 테이블 크기는 필요에 의해 증가된다. 

- 엔트리가 더이상 사용되지 않을때 사용중인지 구분하는 플래그를 제외하고는 변경되는 데이터는 없다. 그래서 비필수정보와 runlist는 복구가 가능하다. 엔트리가 다시 할당될 때 그것은 영구히 삭제되어 이전 파일 값들은 삭제된다. 그래서 MFT엔트리는 이전 파일의 슬랙데이터가 없다. 

- 두 번째는 MFT엔트리 속성에 공간을 할당하는 것과 관련이 있다. 마이크로소프트는 속성타입으로 엔트리들을 정렬하고 계속해서 그것들을 정리한다. 

 

▷ 시간 값 업데이트

- 할당의 마지막은 비필수 값들이 업데이트 될 때이다. 이 데이터(비필수)들은 $STANDARD_INFORMATION과 $FILE_NAME에 저장된다. 윈도우에서 파일의 속성을 선택했을 때 $STANDARD_INFORMATION 속성 시간들을 볼 수 있고 4개 중 3개만 볼 수 있다. $FILE_NAME의 시간 값들은 파일이 생성되고 이동될때 업데이트 되지만, 어느경우에 업데이트 하는지는 확인하지 못했다.

- 윈도우에서 NTFS를 위한 시간 업데이트는 FAT파일시스템과 유사하다. 생성시간은 새로운 파일에 설정된다. 만약 새로운 파일을 생성하거나 복사를 하면 그 새로운 파일의 생성시간은 현재시간으로 설정된다. 파일을 이동하면 그 이동이 다른 볼륨으로 가더라도 생성시간은 원본 파일의 생성시간을 유지한다. 

- 마지막 수정시간은 특정 $DATA, $INDEX_ROOT, 또는 $INDEX_ALLOCATION 속성 값이 수정될 때 설정된다. 파일을 이동하거나 복사하면 그 내용은 변하지 않는다. 여러 $DATA가 있을 때 기본적이지 않은 속성이 수정되도 시간은 업데이트된다. 파일의 이름이나, 속성의 이름이 변경될 때는 업데이트 되지 않는다. 

- MFT수정시간어떠한 속성이던지 변경될 때 설정되고, 한 파일의 내용을 변경하지 않고, 단지 열었을때도 설정이 된다. 파일이름이 변경되면 $FILE_NAME 이 변경되므로 업데이트된다. 파일이 다른 볼륨으로 이동시에는 업데이트 되지 않는다. 같은 볼륨으로 이동할 때는 수정된다. 사용자는 윈도우 내에서 이 값을 볼 수 없지만 많은 포렌식 도구들을 통해 확인할 수 있다. 

- 마지막 접근시간메타데이터 또는 내용을 봤을 때 설정이된다. 사용자가 속성을 보아도 업데이트하고, 파일을 열어도 업데이트한다. 한 파일을 복사하거나 이동했을 때 원본파일의 접근시간은 업데이트 하게 된다. 효율성을 위해 접근시간을 업데이트 하지 않을 수 있다. 이 기능을 비활성화 할 수도 있다. 

- 요약하면 한 파일 생성시 $STANDARD_INFORMATION과 $FILE_NAME 값들은 현재 시간으로 설정된다. 파일이 복사될 때 원본은 접근 시간이 업데이트 되고 복사본은 생성시간, 접근시간이 업데이트 된다. MFT의 수정시간과 원본의 수정시간은 원본 값으로 설정된다. -> 이는 생성시간이 수정시간보다 이후임을 보여준다.

- 파일을 같은 볼륨으로 이동시 접근시간과 MFT수정시간이 변경된다. 

- 파일을 다른 볼륨으로 이동시 접근시간은 업데이트 되지만 MFT는 수정되지 않는다.

- 디렉토리의 경우 파일과 거의 유사하다. 파일들을 생성하고 지웠을 때 디렉토리의 내용들은 변경되고 수정시간은 현재 시간으로 업데이트 된다. 디렉토리의 내용을 확인하면 접근시간은 업데이트 된다.

- 디렉토리들을 같은 볼륨으로 이동할 때 같은 MFT엔트리가 사용되고, 오직 MFT 수정시간과 접근시간만이 업데이트된다. 다른 볼륨으로 이동시 4개의 모든 시간이 이동했던 시간으로 업데이트된다. 

 

 

 분석기술

- 메타데이터 범주 분석을 통해 특정 파일이나 디렉토리에 대한 상세한 내용을 확인 할 수 있다. 이 과정은 MFT엔트리 위치를 찾는 것과 그 내용을 처리하는 것을 포함한다. 특정 엔트리의 위치를 찾기 위해서는 부트섹터의 시작주소를 이용해 MFT위치를 찾는 것이 필요하다. 첫 MFT엔트리는 테이블의 나머지 클러스터 레이아웃을 설명한다. 각 테이블내의 엔트리가 같은 크기이므로 특정 테이블 엔트리를 구할 수 있다.

- 테이블 위치가 결정되면 그것들의 속성들을 처리한다. 한 파일이나 디렉토리는 속성을 위해 여러 엔트리가 필요할 수 있고 $ATTRIBUTE_LIST 속성은 추가적인 엔트리 주소 목록을 포함한다. MFT 엔트리를 처리하기 위해 먼저 헤더를 읽고 첫번째 속성의 위치를 파악한다. 첫 속성을 확인해 그 타입을 판단한다. 두 번째 위치는 첫 번째 속성의 길이로부터 결정되고, 모든 속성을 처리할 때까지 이 과정을 반복한다. 

 

다음 예는 어디서 속성 길이가 주어지는지 예를 보여준다. 

엔트리가 어떻게 처리되는지를 보여주는 기본적인 파일의 MFT 엔트리

-> 마지막 속성 이후에는 0xffffffff 값이 존재한다.

 

- 핵심 메타데이터 속성은 $STANDARD_INFORMATION 속성에 있고 $DATA 속성의 파일 내용이다. 

예를 들어 필요하지 않은 정보나 소유권 정보를 확인하려면 $STANDARD_INFORMATION 속성을 보면되고, 파일의 생성 날짜나 부모 디렉토리를 결정하기 위해서 $FILE_NAME을 보면 된다. 

- MFT의 할당 상태는 MFT플래그와 $MFT의 비트맵으로 판단된다. 속성 내용은 MFT엔트리 내 또는 클러스터 run에서 찾을 수 있다. 거주 속성들은 헤더에서 내용 오프셋과 크기 값을 가지고 비거주 속성들은 헤더에서 시작 클러스터와 각 run의 클러스터 수를 설명하는 runlist를 갖는다. 

- MFT플래그에 '사용중'이 설정되어있지 않다면 이전에 할당한 파일에 대한 정보가 있을 수 있다. 

- $MFT 와 $MFTMirr위치를 찾기위해 'FILE' ASCII 시그니처로 시작하는 클러스터를 찾으면 된다.

- MFT의 단편화 여부는 판단하기 어렵다. 

 

 

▶ 분석 고려사항

- 일부 파일이나 디렉토리는 $DATA 속성이 하나지만 여러개가 있는 경우도 있다. 나머지 $DATA속성은 윈도우에서 보이지 않아서 데이터를 숨기는 데 사용될 수 있다. 

- 또 데이터를 숨길 수 있는 부분은 MFT엔트리나 속성의 사용하지 않는 부분이다. 이 부분은 언제라도 덮어씌워질 수 있기 때문에 숨기기는 쉽지 않다. 

- MFT엔트리에서 $FILE_NAME속성은 원래 이름과 부모 디렉토리의 MFT엔트리 주소를 제공해 주고 이렇게 결올를 아는 것이 할당되지 않은 엔트리를 찾기 쉽게한다. 

- 지워진 파일과 관련이 있는 내용은 NFTS에서 복구하기 쉽다. 파일의 $DATA 속성이 거주라면 여전히 MFT엔트리에 존재할 것이다. 만약 비거주라면 runs 위치를 파악하고 복구해야한다. 

- 파일의 모든 속성이 단일 엔트리에 없다면 파일이 지워진 이후에 다른 엔트리들이 재할당 되었는지 검사해야 한다. 비기준 엔트리가 그대로인지 확인하자. 

 

※ 위의 3가지 경우는 아래 그림에 있다.

MFT 엔트리의 재할당과 $DATA 내용위치에 따른 복구의 3가지 시나리오

-> 엔트리 90은 거주 속성이고 91은 비거주 속성이며 엔트리가 재할당되어도 클러스터를 찾아서 복구가 가능하다. 엔트리 92는 93을 위한 기준엔트리이고 둘중 하나가 재할당 되면 복구가 불가능하다. 

 

- 윈도우에서 작은 주소를 갖는 비할당 엔트리를 먼저 사용하므로 더욱 복구하기가 어렵다. 

- 파일이 지워질 때 시간 값들은 업데이트 되지 않는다. $FILE_NAME은 임시 시간 값들을 포함하고 있고, 그 시간값들은 파일이나 디렉토리가 생성되고 이동할 때 설정된다. 이 값들은 $STANDARD_INFORMATION 생성시간 수정시간, 변조여부를 탐지하는데 사용할 수 있다. 

- 압축, 암호화 된 속성은 조사를 어렵게 만드는 요인이다. 사용자 패스워드를 알 수 없다면 디스크 비할당 공간에 복호화된 파일의 복사본이 있는지 검색할 필요가 있다. 

- 압축파일은 슬랙공간이 없고, 압축상태로 데이터가 삭제시 복구할 수 없다. 

 

 

분석 시나리오

- 첫 단계는 파일시스템의 비할당 공간을 추출하는 것이다. TSK dls를 사용하여 이 단계를 수행하자. 

 

#dls -f ntfs ntfs9.dd > ntfs9.dls

 

- 다음은 이전 MFT엔트리를 검색해야한다. 각 MFT엔트리는 ASCII 시그니처 'FILE'로 시작한다. 'grep'이나 'sigfind'를 이용하자. 'FILE' ASCII는 16진수로 0x46494c45이다.

 

#sigfind -o 0 46494c45 ntfs9.dls

 

-> 이것은 섹터 412를 포함해 여러 곳에서 일치한다. 

 

※ 섹터 412의 내용은 다음과 같다.

-> 위 결과는 MFT엔트리 헤더이다. 바이트 22~23에 있는 플래그 값은 포맷전에 이 엔트리가 할당된 사실을 보여준다. (리틀엔디안으로 0x0001), 바이트 20~21은 첫 속성 오프셋이 56(0x0038)바이트에서 시작하는 것을 보여준다. 

 

※ 첫 속성의 헤더는 다음과 같다.

-> 이러한 첫 번째 속성은 $STANDARD_INFORMATION 속성(0x0001)이며, 길이는 96(0x0060)바이트이다. 시간 같은 임시정보를 확인하기 위해서는 이 속성을 분석해야 한다. 

 

※ 다음은 바이트 56에서 152까지 96바이트를 보도록 하자.

-> 두번째 속성은 $FILE_NAME 속성(0x0030)이며, 그 길이는 112(0x0070)바이트이다. 또한 이 파일의 부모 디렉토리는 루트 디렉토리이니 MFT엔트리 5였다는 것을 확인할 수 있다. 또한 파일이름은 'letter1.txt'이다.

 

※ 다음은 시작 위치 152바이트에서 112를 더한 바이트 264를 보도록 하자.

-> 세 번째 속성은 $OBJECT_ID 속성(0x0040)이며, 길이는 40(0x28)이다. 바이트 304에서 다음 속성이 계속된다.

 

※ 마지막 속성을 보자.

-> 이 마지막 속성은 $DATA 속성(0x0080)이며, 길이는 456바이트(0x01c8)이다. 속성 내용은 바이트 328에서 시작하고, 'Hello Mr.Jones'으로 시작한다. 전체 글자는 엔트리가 거주 속성이기 때문에 MFT엔트리 내에 있다. 그것이 버거주였다면, runlist를 해석하고, 파일시스템 이미지에서 그 클러스터들의 위치를 찾아야만 했을 것이다. 이 엔트리는 다음 그림에서 확인할 수 있다.

최근에 포맷된 볼륨의 비할당 공간에서 확인한 MFT 엔트리 레이아웃

 

- 이 시나리오에서 볼륨 포맷 전에 존재하던 파일들의 증거를 찾았다. MFT엔트리에 존재하는 'FILE' 시그니처로 해당 증거들을 찾았고, 직접 하나씩 해석했다. 각 속성에 데이터 구조체는 다음 장에서 좀 더 상세히 분석한다. 

 

 


p.s 이제까지 한거중에 제일 길었다....

 

속성이 존재하고 그 안에 $DATA에 내용들이 있는 것

$SDH, $SII, $SDS