Notice
Recent Posts
Recent Comments
Link
«   2025/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

Chapter 11. NTFS의 개념 본문

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

Chapter 11. NTFS의 개념

Pikigod 2020. 2. 28. 17:21

- NTFS(New Technologies File System)은 마이크로소프트에 의해서 설계되고 사용되던 기본 파일 시스템이다.

- NTFS는 많은 특징들을 제공하고 확장성이 매우 뛰어나기 때문에 FAT보다 더 복잡한 파일 시스템이다. 따라서 앞서 배운 FAT보다 더 많은 시간을 투자해서 설명하겠다.

 

 

11.1 소개 

- NTFS는 신뢰성, 보안, 대용량 장치를 지원하기 위해 설계되었다. 특정 내용으로 데이터 구조체를 감싸는 포괄적인 데이터 구조체를 사용해서 확장성을 제공한다. 또한 포괄적인 래퍼(Wrapper)는 지속되었는데, 이 한 예는 NTFS파일시스템 데이터의 모든 바이트가 한 파일에 할당되는 것이다. 이 장에서는 NTFS파일 개념에 대해 설명하겠다. 

- NTFS는 복잡한 파일시스템이고 마이크로소프트에서 명세를 공개하지 않았다. 그래서 실제 구조에 대해서는 공개되지 않았지만 많은 그룹들은 NTFS 구조를 분석했다. 따라서 실제와 다를 수 있다는 것에 유의하자.

 


11.2 모든 것이 파일

- NTFS 설계를 이해하는데 가장 중요한 개념 중 하나는 중요한 데이터가 파일로 할당된다는 것이다. 이것은 일반적으로 다른 파일시스템에서 레이아웃에 숨겨져 있는 파일시스템의 관리데이터가 파일로 저장된다는 것이다. 그래서 NTFS 파일시스템은 다른 파일시스템과 같이 특정 레이아웃을 갖지 않는다. 전체 파일시스템은 데이터영역으로 간주되고, 어떠한 섹터도 파일에 할당될 수 있다. 볼륨의 첫 섹터에 부트섹터를 포함하고 거기에 부트코드가 존재한다. 

 


11.3 MFT (Master File Table)

-> MFT는 모든 파일들과 디렉토리에 대한 정보를 가지고있기 때문에 NTFS의 핵심으로 볼 수 있다. 모든 파일과 디렉토리는 테이블에 한 엔트리를 반드시 가지고, 그 구조는 매우 간단하다. 엔트리크기는 1KB이고, 첫 42바이트는 미리 정의된 목적을 갖는다. 그 밖의 나머지 바이트들은 매우 특정한 목적을 갖는 데이터 구조체로 이루어진 속성들을 저장한다. 

<엔트리 레이아웃>

 

- 예를들어 한 속성은 파일명을 저장하기위해 사용되고, 다른 것들은 파일 내용을 저장하기 위해 사용된다.

- 마이크로소프트에서는 각 엔트리를 '파일레코드'(File Record)로 부르지만 여기서는 혼란을 피하기위해 'MFT엔트리'로 부르도록 하겠다. 각 엔트리는 그 테이블에서 위치를 나타내는 한 개의 주소를 가지고 0으로 시작한다. 모든 엔트리크기가 1,024바이트지만(1KB) 그 정확한 크기는 부트섹터에서 정의한다. 

- MFT는 한파일이다. 그렇지만 자체 엔트리를 하나 가지는데 그 테이블의 첫 엔트리는 $MFT 이름이며, 그것은 MFT의 디스크 위치를 설명한다. 그것은 단지 MFT의 위치를 설명하는 장소이고 MFT의 레이아웃과 크기를 결정하기 위해서는 $MFT를 해석할 필요가 있다.

그 MFT 시작위치는 파일시스템의 첫 번째 섹터에 위치한 부트섹터에서 주어진다. 

 

부트섹터에서 첫 번째를 알고 거기서 찾자

-> 부트섹터를 이용해서 첫번째 MFT 엔트리를 찾을 수 있다. 또한 첫 엔트리를 통해 MFT가 클러스터 32~34, 56~58에 단편화되어 있다는 것을 알 수 있다. NTFS는 FAT처럼 연속적인 섹터그룹인 클러스터를 이용한다.

 

- NTFS 구현에서 NTFS를 작게 시작하고 엔트리가 많이 필요해지면 크기를 확장하는 식으로 사용한다. 한 운영체제에서 파일시스템 생성시 고정된 수의 엔트리를 생성하고 필요시 동적으로 크게 만든다. 마이크로소프트에서는 MFT엔트리 생성 후 그것들을 지우지 않는다. 

 

 

▶ MFT 엔트리 내용

- MFT의 각 엔트리 크기는 부트섹터에서 정의하지만, 마이크로소프트의 모든 버전들은(여기선 xp까지이다..오래된 책이라) 1024바이트 크기를 사용한다. 데이터 구조체의 첫 42바이트는 12개의 필드를 포함하고 나머지 982바이트는 비구조적으로 속성값을 가지고있다. 

- 각 엔트리의 첫 필드는 시그니처이고 표준 엔트리는 ASCII 문자열 'FILE'을 가지고 있다. 만약 그 엔트리에서 오류를 발견하면 'BAAD'라는 문자열을 갖는다. 그 엔트리(각 엔트리)를 사용하는지, 아니면 그 엔트리가 디렉토리를 위한 것인지를 구분하는 플래그 필드가 있다. MFT엔트리의 할당상태는 $MFT파일에 $BITMAP속성을 결정하고 이는 13장에서 자세히 다룬다. 

- 파일이 한 개의 엔트리내에서 그 파일의 속성을 나타내기 적합하지 않으면 여러 엔트리를 사용할 수 있다. 이 같은 경우가 발생하면 첫 엔트리는 기준 파일 레코드나 기준 MFT엔트리로 불리며 각 다음 엔트리들은 고정된 필드들 중 하나에 기준 엔트리 주소를 포함한다. 13장에서 MFT엔트리를 위한 구조체를 보여주고, 예제 파일시스템 이미지를 상세히 분석하자. 

 

 

▶ MFT 엔트리 주소

- 각 MFT 엔트리는 48비트 값을 이용하여 순차적으로 주소가 지정되며, 첫 엔트리는 주소 0을 갖는다. 최대 MFT주소는 MFT가 증가할 때마다 변경되고 $MFT 크기를 각 엔트리 크기로 나눠서 결정한다. 이러한 순차적 주소를 '파일번호(File Number)'라고 부른다.

- 모든 MFT엔트리는 할당될 때마다 증가하는 16비트 순서번호를 갖는다. 또한 순서번호와 파일번호를 결합해 파일 참조주소를 만든다. 여기서 살짝 헷갈렸었는데 순서번호는 그 엔트리에 할당될때마다 1씩 올라가는 개인 순서번호이다.

 

순서번호(16) + 파일번호(48) = 파일참조주소(64비트)

 

<MFT 엔트리 주소 예>

 

- NTFS는 순서번호가 파일시스템이 손상된 상태인지 아닌지를 판단하기 쉽게 해주기 때문에 MFT엔트리를 참조하는 '파일 참조 주소'를 사용한다. 순서번호는 데이터 구조체가 MFT엔트리 주소를 포함하는지 판단한다. (순서번호는 이전파일이 그 엔트리 주소를 사용했거나 아니면 새로운 파일의 부분임을 판단할 수 있기 때문이다.)

또한 지워진 파일을 복구할 때도 사용할 수 있다. 예를들어 참조번호를 갖는 구조체가 있다면 구조체 엔트리를 사용한 이후로 MFT엔트리가 재할당되었는지 판단할 수 있다. 

순서번호는 유용하지만 이 장에서는 파일번호나 MFT엔트리 주소를 사용하겠다.

 

 

▶ 파일시스템 메타데이터 파일

- 볼륨의 모든 바이트는 파일에 할당되기 대문에 파일시스템 관리데이터를 저장하는 별도의 파일이 있어야 한다. 마이크로소프트는 이러한 파일들을 메타데이터 파일이라 부르지만 여기서는 '파일시스템 메타데이터 파일'이라 부르겠다.

- 마이크로소프트는 첫 16개 MFT 엔트리들을 파일시스템 메타데이터 파일로 예약한다. 이 예약된 엔트리들 중 사용하지 않아도 할당된 상태이고 기본적이고 일반적인 정보만 갖는다. 이 파일시스템 메타데이터 파일은 사용자들에게 숨겨지지만 루트디렉토리에 존재하게 된다. 각 파일시스템 메타데이터 파일명은 '$'로 시작하고 첫 문자는 대문자로 쓴다. 자세한 내용은 12장에서 다루도록 하자.

 

사용하지 않더라도 할당된 상태이다.

 


11.4 MFT 엔트리 속성 개념

-> 앞에서 배웠듯, MFT엔트리는 내부 구조체를 사용하고 대부분은 특정 유형 데이터를 저장하는 '속성'을 저장하는데 사용한다. 많은 타입들이 있고 각각은 자신의 내부 구조체를 갖는다. 이것은 다른 파일시스템과 다른 점이다. 대부분의 파일시스템은 파일 내용을 읽고 쓰기 위해 존재하지만 NTFS는 속성들을 읽고 쓰기 위해 존재한다. 

 

MFT엔트리 헤더는 모든 속성을 포괄하고 기준이된다.

-> 엔트리속에 각 속성은 헤더와 내용으로 이루어져있다. MFT엔트리 헤더는 모든 속성을 포괄하며 기준이된다. 

 

 

 속성헤더

- 속성헤더는 속성의 타입, 크기, 이름을 구분한다. 또한 값들의 압축여부, 암호화 여부를 식별하는 플래그 값이 있다. 

여기서 '속성 타입'은 데이터 타입에 기초하는 숫자 식별자이다. 한 MFT엔트리에는 동일 타입의 여러 속성이 있을 수 있다.

- 속성은 MFT엔트리 내에서 고유한 식별자를 가지고 어떤 속성은 UTF-16인 이름에 할당 될 수 있다.

 

 

 속성내용

- 속성내용은 어떤 형식과 크기가 될 수 있다. 예를들어 어떠한 속성은 파일에 내용을 저장하기 위해 사용되고 그 크기가 수 MB에서 GB가 될 수 있다. 하지만 1024바이트인 MFT엔트리에 이러한 데이터를 저장하는 것은 실용성에서 많이 떨어진다. 그래서 NTFS에서는 이 문제를 해결하기 위해 속성 내용이 저장되는 두 장소를 제공한다. 

 

1. '거주(Resident)' 속성은 헤더가 있는 MFT 엔트리 내용을 저장한다. -> 오직 작은 속성에서 사용한다.

2. '비거주(Non-Resident)' 속성은 파일시스템 외부 클러스터에 내용을 저장한다.

 

속성이 '거주'이면 헤더뒤에 내용이 오고, '비거주'이면 헤더에 클러스터 주소가 주어진다. 아래의 예는 초록색 속성이 너무커서 클러스터 829에 할당된 모습이다. 

 

초록색만 비거주 속성이다.

 

 

  비거주 속성들은 연속된 클러스터들을 Cluster Runs에 저장하며 그 run은 시작 클러스터 주소와 run의 길이를 이용해 문서화한다. 아래의 예를 보자.

<할당된 클러스터에 3개의 run이 있는 문서화된 목록>

 

 

- 이 책을 공부하면서 주소를 논리적 파일 시스템 주소파일시작에서 상대적인 논리적 파일 주소로 설명했다. NTFS에서 LCN(Logical Cluster Name)은 논리적 파일 시스템 주소를 나타내고, VCN(Virtual Cluster Name)은 논리적 파일 주소와 같다. 

- NTFS에서는 비거주 속성인 runs를 설명하기 위해서 VCN을 LCN으로 매핑한다. 위에 그림을 보면 run을 다음과 같이 매핑하는 것을 알 수 있다.

VCN 0~4 -> LCN 48~52

VCN 5~6 -> LCN 80~81

 

 

▶ 표준 속성 유형들

- 지금부터 몇가지 표준 속성들의 기본 사항에 대해서 알아보도록 하겠다. 각 속성타입은 번호로 정의되고 마이크로소프트는 이러한 번호를 사용해서 엔트리 속성을 분류했다. 그 표준 속성들은 기본 타입 값을 갖지만 $AttrDef 파일시스템 메타데이터 파일에 그것들이 재정의 되어있는 것을 볼 수 있다.

숫자 이외에 각 속성 타입은 이름을 가지고, 모두 대문자로 구성되며 앞에 '$'를 갖는다.

기본 속성 타입의 일부와 식별자들은 아래 그림에 있다. (전부는 아니며 12자에서 자세히 설명하고, 데이터 구조체는 13장에서 설명한다.)

 

- 비기준 MFT엔트리를 제외하고 거의 모든 MFT엔트리는 $FILE_NAME과 $STANDARD_INFOMATION 타입 속성을 갖는다.

 

$FILE_NAME 속성은 파일명, 크기, 임시정보를 포함한다. 

$STANDARD_INFOMATION 속성은 소유권, 보안, 임시정보를 포함한다. 

 

- 파일과 디렉토리에서 보안과 용량은 강제적인 요소들이다. 따라서 $STANDARD_INFOMATION 속성은 모든 파일과 디렉토리에 존재한다. $FILE_NAME과 $STANDARD_INFOMATION타입 속성은 거주 속성이다.

 

- 모든 파일은 파일내용을 저장할 $DATA 속성을 갖는다. 내용이 약 700바이트라면 비거주가 되고 외부클러스터에 저장된다. 파일에 한개 이상의 $DATA 속성이 있을 때 그 추가 속성들이 ADS(Alternate Data Streams)를 참조할 수도 있다. 파일이 생성될 때 생성되는 기본 $DATA 속성은 그것과 관련되는 이름을 갖지는 않지만, 추가적인 $DATA 속성에는 반드시 이름 하나가 포함되어야 한다. 속성이름은 타입이름과 다르다. 예를들어 $DATA는 '속성 타입'의 이름이고 그 속성이름은 'fred'가 될 수 있다. TSK를 포함한 몇개의 도구들은 기본 $DATA 속성에 $Data 이름을 할당한다.

 

- 모든 디렉토리는 그 디렉토리내에 위치한 파일들과 하위 디렉토리 정보들을 포함하는 $INDEX_ROOT 속성을 갖는다. 디렉토리가 크면 정보를 저장하기 위해 $INDEX_ALLOCATION과 $BITMAP 속성들을 사용한다. 디렉토리에는 $INDEX 속성 외에 $DATA 속성이 있을 수 있다. -> 다른 말로 한 디렉토리내에 파일이 있을 수 있고 하위 디렉토리목록을 저장할 수 있다. $DATA 속성은 응용프로그램이나 사용자가 저장하기 원하는 어떠한 내용이던지 저장할 수 있다.

디렉토리 $INDEX_ROOT와 $INDEX_ALLOCATION 속성에는 일반적으로 이름 '$I30'이 있다.

 

-> 앞에서 보여준 MFT엔트리에서 속성이름과 속성이 주어지고 3개의 표준 파일 속성이 있다. 여기서 모든 속성은 거주 속성을 갖는다.

 

 

 

 


p.s 진짜 기본을 배운 느낌이지만 뭔가 더 정리된 느낌?!