4. NTFS
- NTFS 소개
NTFS(New Technology File System)는 Windows NT계열 운영체제의 파일 시스템으로 XP, 2000, 2003, 2008, Vista, 7 등에도 포함되어 있다.
ⅰ. USN 저널(Update Sequence Number Journal 또는 Change Journal)
NTFS를 사용하는 볼륨에서 파일의 변경 내용을 기록하는 로그이다. 특정 작업을 하던 중 예기치 못한 시스템 오류가 발생하는 경우, USN 저널은 변경되는 모든 부분을 기록하고 있다가 시스템이 재부팅될 때 완료하지 못한 작업을 복원(Rollback)한다.
ⅱ. ADS(Alternate Data Stream)
파일 이름, 소유자, 시간 정보 등을 속성이라는 스트림(바이트 배열)을 통해 표현한다. 일반적으로 파일 당 하나의 데이터 스트림을 가지는데, ADS는 파일 당 하나 이상의 데이터 스트림을 저장할 수 있도록 지원하는 것이다.
추가된 ADS는 "filename : streamname"와 같이 표기한다. filename은 파일 이름, streamname은 데이터 스트림의 이름이다.
ADS는 윈도우 탐색기를 통해 확인할 수 없을 뿐만 아니라 파일 크기 또한 원본 파일에 포함되지 않는다. 또, NTFS에서만 지원하기 때문에 네트워크나 USB를 통해 다른 파일 시스템으로 전송할 경우 전송되지 않고, 원본 스트림만 전송된다.
ⅲ. Sparse File
파일의 데이터가 '0'일 경우 실제 데이터를 기록하지 않고 크기 정보만 유지하는 파일을 의미한다.
ⅳ. 파일 압축
NTFS는 LZ77 알고리즘을 변형한 압축 방식을 지원한다.
ⅴ. EFS(Encrypting File System)
NTFS 상의 파일 및 디렉터리를 암호화 하는 기능이다. CryptoAPI와 EFS File System Run-Time Library(FSRTL)를 이용해 구현한다. 빠른 암호화와 복호화를 위해 FEK(File Encryption Key)를 통한 대칭키 방식으로 암호화한다.
ⅵ. VSS(Volume Shadow Copy Service)
Windows 2003부터 지원되어 현재 Widows 2008, 7 등에서 사용되고 있는 기능이다. 새롭게 덮여 쓰인 파일 및 디렉터리에 대해 백업본을 유지하는 기능이다. 즉, 특정한 시각의 파일, 폴더 또는 특정한 볼륨의 수동 또는 자동 복사본이나 스냅샷을 저장해둔 것을 말한다. 이렇게 저장된 백업본은 시스템을 재부팅할 때 시스템 체크 과정에서 USN 저널과 함께 좀 더 안전한 복구를 할 수 있도록 도와준다.
ⅶ. Quotas
다중 사용자를 지원하는 환경에서 각 사용자의 디스크 사용량을 제한할 수 있는 쿼터(Quota) 기능을 지원한다.
ⅷ. 유니코드 지원
다국어 지원을 위해 유니코드를 사용한다. 파일, 디렉터리, 볼륨 등의 이름을 지정할 때 모두 유니코드를 사용한다.
ⅸ. 동적 배드 클러스터 재할당
배드 섹터가 발생한 클러스터는 사용할 수 없다. 배드 섹터가 발생한 클러스터에 있는 정상 데이터를 자동으로 새롭게 할당한 클러스터에 복사하는 기법이다. 배드 섹터가 발생한 클러스터는 플래그를 통하여 더이상 사용 되지 않도록 한다.
- NTFS 구조
VBR 영역은 부트 섹터와 추가적인 부트 코드가 저장된다.
MFT 영역은 파일과 디렉토리를 관리하기 위한 MFT Entry의 집합체이다.
FAT 파일시스템에서 FAT 영역의 크기가 데이터 영역의 클러스터 수에 따라 정해지기 때문에 파일 시스템을 생성할 때에 고정된 FAT 공간을 할당할 수 있다. 하지만 MFT 영역에 들어가는 MFT Entry는 생성될 파일의 수를 미리 예측하기 어렵기 때문에 NTFS 의 MFT 영역은 고정된 크기를 가질 수 없다.
파일 시스템을 포맷할 때, 기본적인 MFT 영역의 크기가 할당되는데, 만약 해당 MFT가 모두 사용되면 동적으로 클러스터를 추가로 할당해 MFT 영역의 크기를 증가시킨다. FAT 영역과 다르게 파일 시스템의 여러 부분에 조각나 분포되어 있을 수 있다.
DATA 영역은 파일의 실제 내용이 저장되는 공간이다.
- VBR(Volume Boot Record)
NTFS로 포맷된 드라이브의 가장 앞부분에 위치하며 부트 섹터와 추가적인 부트 코드가 저장되어 있다. 크기는 고정된 값을 가지지 않고 클러스터 크기 또는 포맷 소프트웨어에 따라 차이가 있다.
VBR의 첫 섹터에는 부트 코드를 포함한 부트 섹터가 위치한다.
클러스터 크기가 512 byte인 경우 VBR 자체가 부트 섹터가 된다.
VBR 크기가 1 sector를 넘는 경우 나머지 섹터들은 추가적인 부트 코드의 저장 용도로 사용되거나 NTDLR(NT Loader)을 빠르게 로드하기 위해 NTDLR의 위치를 저장하기 위한 용도로 사용된다.
첫 3바이트는 부트 코드로 점프하기 위한 점프 명령어가 위치한다.
다음은 OEM ID가 위치하는데 윈도우 시스템에서 "NTFS"라 기록한다. 이어 볼륨의 여러 가지 설정 값을 담고 있는 BPB와 NTDLR을 로드하기 위한 부트 코드가 나온다. 마지막으로 부트 섹터 끝을 나타내는 signature(0x55AA)가 온다.
NTFS 부트 섹터 덤프
MBR에서 부팅 가능한 파티션(볼륨)을 찾으면 해당 볼륨의 첫 섹터를 메모리에 로드한 후 실행한다.
첫 3바이트 -> EB 52 90 : JMP 52h + NOP
이후 BPB 항목을 참조하여 해당 볼륨의 운영체제를 로드하는 부트 코드가 실행된다.
NTFS는 모든 데이터를 파일 형태로 관리한다. 각 파일들의 위치, 시간 정보, 크기, 파일 이름 등의 속성 정보는 MFT Entry(File Record)라고 불리는 특별한 형태의 구조를 사용하여 저장되고, 묶음으로 모든 파일들의 정보를 가지고 있다.
- MFT(Master File Table)
NTFS에서 MFT는 VBR과의 사이에 물리적인 공간이 존재한다. 위치 또한 고정적이지 않다.
ⅰ. MFT Entry
모든 MFT Entry는 1,024 byte의 고정된 크기를 가진다.
파일 시스템의 메타파일 역할을 하는 MFT Entry(0~15번)로 파일 시스템을 생성할 때 함께 생성된다. 이러한 예약된 NTFS Entry들은 NTFS의 다양한 특성을 지원하기 위해 사용된다. 이후 사용자에 의해 파일이 생성될 때마다 새로운 MFT Entry가 할당되어 해당 파일의 정보를 유지 관리한다.
$MFT는 MFT 자체를 가리키는 것으로 MTFS 상에 존재하는 모든 MFT Entry 정보를 담고 있다.
MFT는 파일 시스템의 여러 영역에 조각나 존재할 수 있기 때문에 MFT 전체 정보를 유지 관리하기 위한 파일이 필요한데 $MFT가 그 역할을 수행하고 있다. 따라서 각 파일들을 분석하기 위해 전체 MFT 정보를 획득하는 것이 선행되어야 한다.
먼저 VBR의 부트 섹터 BPB 항목을 살펴보면 MFT 시작 위치를 알 수 있다. $MFT 파일 정보는 MFT Entry 0번에 저장되어 있으므로 BPB 항목에 의해 바로 접근할 수 있다. 이후 $MFT 파일의 $DATA 속성 정보를 확인하면 조각나 있는 MFT Entry 정보를 확인할 수 있다.
42 byte의 고정된 헤더가 나오고 Fixup 배열과 속성들이 온다. Entry 의 마지막을 표시하기 위해 End Marker(0xFFFFFFFF)를 사용한다. 속성들의 정보가 많아져 하나 이상의 MFT Entry를 사용할 경우 마지막 MFT Entry의 끝에 End Marker가 표시된다.
이 중 Fixup 배열은 저장하고자 하는 데이터가 하나 이상의 섹터를 사용할 경우 각 섹터의 마지막 2 byte를 따로 저장하여 두는 것이다.
Fixup을 사용하는 데이터들은 다음과 같다.
- MFT Entries
- INDEX Records
- RCRD Records
- RSTR Records
Fixup이 적용되기 이전과 이후 상태를 보여준다. 3개의 섹터를 사용하는 데이터이므로 각 섹터의 마지막 2 byte 공간에 별도의 시그니처를 저장해준다. 해당 데이터가 저장되는 섹터의 이상 유무를 점검하기 위해 존재한다.
ⅱ. 속성
파일의 시간 정보, 이름, 데이터 등은 각각 하나의 속성으로 표현되는데 파일의 종류에 따라 하나 이상의 다양한 속성들이 저장된다.
속성의 이름은 미리 예약된 MFT Entry 이름과 다르게 $(uppercase)와 같이 표현된다. (단, $MFT 제외)
각 속성 앞부분에는 공통적으로 속성 헤더(Attribute Header)가 온다.
사진 속 이름 처럼 일반적인 속성 헤더의 데이터 구조이다.
Resident 속성일 경우에 추가적인 헤더의 데이터 구조와 Non-resident 속성일 경우 추가적인 헤더의 데이터 구조이다.
속성 헤더 항목은 해당 속성이 Resident 속성이냐 Non-resident 속성이냐에 따라 데이터가 구조가 조금 다르다.
일반적인 파일의 경우에 수많은 속성 중 $STANDARD_INFORMATION, $FILE_NAME, $DATA 속성만 온다.
$STANDARD_INFORMATION 속성은 모든 파일에 기본적으로 존재하는 속성으로 파일의 생성·수정·접근시간, MFT 수정시간, 타입(읽기전용, 숨김, 시스템, 장치 등), 소유자 등의 정보를 나타낸다.
$FILE_NAME 속성은 파일 이름을 나태내기 위해 존재하는 속성이다. 유니코드로 표현되며 파일 크기, 파일의 부모 디렉터리, 파일 이름의 생성·수정·접근 시간 등도 함께 저장된다.
$STANDARD_INFORMATION과 $FILE_NAME 속성에 모두 시간 정보가 존재하는 것을 알 수 있다.
두 속성의 시간 정보는 처음에는 동일하나 이후 파일의 접근이나 이동 등과 같이 파일 자체에 대해 특정 행위를 한 경우 $STANDARD_INFORMATION의 시간 정보가 변경된다. $FILE_NAME의 시간 정보는 파일의 이름을 변경하였을 경우에만 변경된다.
이 두 속성을 조합하면 해당 파일의 생성, 접근, 이동, 복사, 수정, 이름 변경 등의 시간을 확인할 수 있다.
$DATA 속성은 파일의 내용을 담기 위한 속성으로 특별한 구조 없이 단순히 파일의 내용을 담고 있다.
$INDEX_ROOT, $INDEX_ALLOCATION 속성은 파일을 빠르게 탐색하기 위한 속성으로 트리 형태이다.
윈도우 시스템에서 Explorer를 통해 파일을 탐색하거나 검색할 경우 이 속성을 사용하여 탐색한다.
ㄱ. Resident 속성과 Non-resident 속성
Resident 속성은 MFT Entry 내에 속성 헤더와 속성 내용이 모두 저장되는 경우를 의미한다.
Non-resident 속성은 속성 내용이 많아지면 일반적으로 여러 개의 MFT Entry를 사용하는데 MFT Entry(1,024 byte)로는 감당하지 못할 크기의 속성일 경우, 별도의 클러스터에 해당 속성을 저장하고 속성 내용에는 저장한 클러스터의 위치 정보만 저장하는 것을 의미한다.
대부분의 속성은 Resident 속성이고, $DATA, $ATTRIBUTE_LIST 속성은 Non-resident가 될 수 있다.
$DATA 속성의 경우 속성 내용이 700byte 이하일 경우 Resident 속성으로 저장되고 넘을 경우 Non-resident 속성으로 저장된다.
ㄴ. Cluster Runs
Non-resident 속성일 경우 내용이 크면 해당 내용을 저장하는데 많은 클러스터가 할당되게 된다. 각각의 클러스터 정보를 유지할 수도 있겠지만 이는 파일 크기가 커질수록 저장해야 하는 양이 많아진다. Cluster Runs은 이러한 정보를 효과적으로 관리하기 위해 존재하는 구조이다.
클러스터의 시작 위치와 수를 표현하여 할당된 클러스터를 나타내므로 다수의 클러스터가 할당 되었을 경우에도 간단히 표현할 수 있다.
조각난 만큼 Cluster Runs이 증가하게 된다.
- 파일의 할당·삭제로 인한 변화 요소
ⅰ. 파일 할당
파일 "\dir1\file1.dat"을 생성할 때, NTFS에서 변화되는 정보이다. \dir1 디렉터리는 이미 생성되어 있고 클러스터 크기는 2,048 byte, file1.dat의 크기는 4,000 byte이라 하자.
1. VBR의 BPB 정보에 MFT 시작위치 정보를 얻어 MFT 시작위치로 이동한다.
2. $MFT(MFT Entry 0) 파일을 읽어 전체 MFT 구조를 파악한다.
3. $MFT 파일의 $BITMAP 속성에서 현재 사용되지 않는 MFT Entry를 검색한다. MFT Entry 240번이 미사용 중이므로 Entry를 할당한 후 $BITMAP 속성에서 해당 Entry 위치의 비트를 1로 설정한다.
4. MFT Entry 240번을 초기화한 후 $STANDARD_INFORMATION, $FILE_NAME 속성을 기록하고 MFT Entry의 in-use 플래그를 설정한다.
5. file1.dat는 2개의 클러스터가 필요하므로 $Bitmap(MFT Entry 6) 파일의 클러스터 할당 정보에서 사용할 클러스터를 검색한다. 할당 알고리즘에 의해 연속된 2개의 클러스터 446, 447번이 선택된다. 이 클러스터에 해당하는 비트를 1로 설정한다.
6. 루트 디렉터리(MFT Entry 5) 파일에서 \dir1의 위치를 검색한다.
7. \dir1의 위치인 MFT Entry 100번에서 새로운 파일에 대한 인덱스 Entry를 생성하면 인덱스가 재배열된다. 이 경우 디렉터리의 last written, modified, accessed time이 변경된다.
8. 마지막으로 각 작업에 대해 $LogFile과 \$Extend\UsnJrnl 파일에 로그 정보가 기록되고 Quotas 기능이 사용 중이면, 해당 사용자의 할당량을 관리하는 $Extend에 있는 $Quota 정보가 수정된다.
ⅱ. 파일 삭제
"\dir1\file1.dat" 를 삭제할 때, NTFS에서 변화되는 정보를 나타낸다. 클러스터의 크기는 2,048 byte라 하자.
1. VBR의 BPB 정보에 MFT 시작위치 정보를 얻어 MFT 시작위치로 이동한다.
2. $MFT(MFT Entry 0) 파일을 읽어 전체 MFT 구조를 파악한다.
3. 루트 디렉터리(MFT Entry 5) 파일의 $INDEX_ROOT와 $INDEX_ALLOCATION 속성에서 \dir1 Entry 위치를 탐색한다.
4. 탐색 결과 \dir1은 MFT Entry 100번, file1.dat는 MFT Entry 240번을 사용하는 것이 확인되었다.
5. MFT Entry 100번에서 file1.dat와 관련된 인덱스 Entry를 삭제한다. 이 경우 디렉터리의 last written, modified, accessed time이 변경된다.
6. $MFT 파일의 $BITMAP 속성에서 삭제된 MFT Entry에 해당하는 비트를 0으로 설정한다.
7. $BITMAP 파일에서 삭제 파일의 $DATA 속성 내용으로 할당되었던 클러서트에 관련 비트를 0으로 설정한다.
8. 마지막으로 각 작업에 대해 $LogFile과 \$Extend\UsnJrnl 파일에 로그 정보가 기록되고 Quotas 기능이 사용 중일 경우 해당 사용자의 할당량을 관리하는 \$Extend\$Quota 정보가 수정된다.
- http://forensic-proof.com/archives/431 [본문으로]
'Digital Forensics > Pre Digital Forensic' 카테고리의 다른 글
디지털 증거의 무결성 유지 기술 (0) | 2017.01.18 |
---|---|
파일 시스템과 파일 복구 IV (0) | 2017.01.16 |
파일 시스템과 파일 복구 II - FAT 파일 시스템 (0) | 2017.01.05 |
파일 시스템과 파일 복구 I (0) | 2017.01.03 |
디지털 증거 분석 기술 (0) | 2016.12.29 |