2013. 7. 18. 01:10

[ntfs forensic 강좌] 2. ntfs layout(개요)

2013/07/14 - [Research/Forensic & NTFS] - [ntfs forensic 강좌] 1. ntfs 기본 (file, file record, inode, attribute)에 이어 두번째 강좌를 시작하겠습니다.


2013/06/03 - [Research/Forensic & NTFS] - ntfs parser (ntfs parsing, analysis, c, c++) (ntfs 파싱, 분석, VC++ 9.0)에 관련 코드를 찾을 수 있습니다.


2-1. file system

ntfs의 layout을 설명하기 위해, ntfs를 맨 위에서 부터 내려다 보겠습니다.

우선, 맨 위는 무엇을 의미할까요? 바로 물리적 Disk 입니다.

Hard disk dissection
[fig. 01] Hard disk dissection by Roberto F. 저작자 표시비영리변경 금지

위 그림과 같이 hard disk는 CHS, 즉, cylinder-head-sector 구조로 되어 있습니다. 우리는 보통 메모리와 같이 hard disk도 (단일주소<-->값)으로 단순하게 매핑될 것으로 생각되지만, 실제로 주소는 c-h-s 값의 조합으로 이뤄집니다. 즉, chs<-->값으로 이뤄집니다. 물론, chs 조합으로 발생하는 용량의 한계 때문에, 이제는 LBA라는 주소체계를 이용하게 됩니다. LBA는 그냥 단순히, 8byte 값이라 생각하면 됩니다. 그 단위는 sector이므로, 0xFFFFFFFFFFFFFFFF * 512(일반적인 sector 크기)byte가 물리적으로 최대 용량이 됩니다. LBA구조가 되면서, 이제 hard disk는 위 그림의 원반형 구조에서 보통 메모리 같이 아래와 같이 단순하게 표현할 수 있습니다.

[fig. 02]

어떻습니까? LBA이전에는 원반형 그림에 Track/Sector 등을 그려 표현한 것보다 훨씬 이해하기 쉬울겁니다. 이러한 물리적 hard disk(물리적 hard disk가 아니더라도 Windows vista 이후부터는 *.vhd 파일을 직접 mount하여 가상 논리 디스크를 만들 수 있습니다.)는 windows에서 \\.\PhysicalDrive0 그리고 linux에서는 /dev/sda와 같이 표현됩니다. 어찌되었든, 해당 장치도 하나의 파일이 될 수 있는데, "엄청긴동영상.avi" 파일이 2TB 정도의 크기라면, 위 경로(\\.\PhysicalDrive0)에 바로 쓸 수 있습니다. 즉, 해당 disk도 단일 파일을 쓸수 있는 공간이라 보면 됩니다. 문제는 세상엔 그리 큰 파일 보다는 크기가 작은 파일들이 대다수라는 것입니다. 만일 12KB의 readme.txt를 2TB의 disk에 바로 쓰게 된다면, 거의 대부분의 2TB(정확하게는 2TB-12KB)는 그냥 버려지게 됩니다.

이러한 문제를 극복하고, disk의 관리를 용이하게 하기 위해, Partition이 등장하게 됩니다. 해당 정보는 2012/12/18 - [Research/Forensic & NTFS] - Partition(파티션) 정보 [MBR/Primary(주)/Extended(확장)/Logical(논리)/GPT] 구하기 (Visual C++/GCC)에서 참고하시기 바랍니다.

여하튼 그러하다면, 다음과 같이 disk는 몇개의 partition으로 분리됩니다.

[fig. 03]

즉, 위 예는 하나의 disk(=134GB)가 3개의 partition(혹은 volume)으로 분리가된 경우입니다. 하나의 partition은 그 자체가 물리적 disk 처럼 독립적으로 존재합니다. window에서는 C:, D: 그리고 E:와 같이 표현되며, linux에서는 /dev/sda1, /dev/sda2, /dev/sda3과 같이 사용됩니다. [fig. 03]과 같다면, 이제 2TB에 최대 3개의 독립적 파일을 저장할 수 있군요. 물론, 2TB disk를 구매하고 3개의 파일만 저장할 바보는 없을 것으로 압니다.

이러한 문제해결을 위해, partition에 임의의 file system으로 포맷하면 여러개의 file을 구성할 수 있습니다. 만일, C:가 ntfs file system으로 format되었다면, C:\a.txt나 C:\Windows\notepad.exe등 수많은 파일을 구성할 수 있습니다. 다시 말하자면, file system은 큰 용량의 partition을 여러개의 file로 나눠서 사용할 수 있도록 도와주는 partition <--> file mapping에서 그 중간의 interface를 해주는 system으로 정의할 수 있습니다.


2-2. ntfs top view

앞선 2-1에서 file system은 disk상의 partition위에 동작한다고 설명하였습니다. 그럼 이제 [fig. 03]의 D:가 ntfs로 format되었다고 가정하고 시작하겠습니다. 앞선 강좌인 "1-1. ntfs에게 file이란?"에서 ntfs는 모두 file로 구성되어 있다고 하였습니다.

사실은 -no- 즉, 아닙니다. file이 아닌 영역도 있기 때문입니다. 대표적으로 BPB(bios parameter block)입니다. 해당 영역은 첫 byte 위치에서 512byte 크기로 이뤄져 있습니다.

[fig. 04]

즉, BPB는 parition data 시작 부분의 첫 512 byte로서, 다음과 같은 정보가 전달됩니다.

- sector당 byte 수 (보통 512)

- cluster당 sector 수 (보통 8, 즉, cluster 크기는 512 * 8 = 4096 bytes)

- disk(즉, partition)에서 전체 sector 수 (disk 크기를 구함. 예를 들어, 즉, E: 의 크기)

- $MFT의 위치

- File Record당 cluster 수

- ...

와 같은 값으로 이뤄져 있습니다.

즉, disk(이제 부터 partition이라는 용어 대신 disk라는 용어를 사용하겠습니다.)의 최상위 512 byte는 ntfs 동작 운영에 필요한 meta-data가 저장됩니다. 해당 BPB 영역은 다음에 설명하겠습니다.

[fig. 05]

[fig. 05]는 [fig. 04]보다 좀더 위에서 내려다본 그림입니다. [fig. 05]를 보면, 우선 disk는 BPB, Data, MFT로 이뤄진것으로 보여집니다. MFT는 Master File Table로, 모든 file의 정보가 저장된 file이라고 보면 됩니다. 특이한것은, MFT 또한 file로 되어 있다는 것입니다. 즉, C:\abc.txt나 C:\Windows\notepad.exe등의 파일 이름, 등록 정보 그리고 속성등이 MFT에 저장되어 있다고 보면 됩니다. 물론, filedata가 "hello world"같은 단지 몇 byte로만 구성된 경우에는 MFT 내에 그 data가 저장될 수 있지만, 일반적으로는 MTF 밖의 Data 영역에 따로 저장됩니다. 그리고, [fig. 05]에서 MFT는 2개로 파편화(fragment)되어 있습니다. 즉, file system에 저장되는 file이 계속 늘어날수록 MTF 영역이 늘어나야 하므로, 파편화는 피할수 없습니다.

그리고 중요한게 inode인데, MFT는 일반적으로 1024 byte인 file record의 집합으로 이뤄져 있습니다. 2013/07/14 - [Research/Forensic & NTFS] - [ntfs forensic 강좌] 1. ntfs 기본 (file, file record, inode, attribute)에서 inode 정보를 확인해 보시기 바랍니다.

그리고, MFT 1을 위치를 구하는 방법은 BPB 영역의 정보를 이용하여 찾을 수 있습니다.


[fig. 06]

[fig. 06]은 [fig.05]의 MFT 1부분은 좀더 자세히 표현한 그림입니다. 우선, inode는 순서상으로 File record 크기인 1024 byte 만큼 순서대로 나열되어 있습니다. 그리고 중요한건, 해당 File recordFILE이라는 byte(unsigned char)로 시작됩니다. 즉, 임의의 file 속성 data는 1024 byte에 결정되어야 합니다(물론, $ATTRIBUTE_LIST를 통해 극복할 수 있는데 이는 향후 설명됩니다). 그리고, 하나의 Cluster에는 4개의 file record가 있음이 확인됩니다. 여기에서 중요한 것은, 임의의 inode 위치를 가르키는 방법입니다. 만일, C:\Windows\notepad.exe의 inode가 654번 이라면, 해당 inode를 찾기 위해서는 (Cluster 번호, Cluster 시작에서 몇번째 byte 떨어져 있는가?)에 해당되는 pair만 있으면 됩니다. 즉, 만일 [fig. 06]에서 2번 inode는 (30th cluster pos, +2048 bytes)로 설명할 수 있습니다. 물론, MFT 1 부분이 전체 disk에서 30번째 cluster에 있다는 가정을 하였습니다.

이러한 addressing 방법으로, LCN-VCN mapping 기법이 있는데 이는 향후에 좀더 설명이 되리라 봅니다.

[fig. 07]

위 그림은 [fig. 06]에서 Cluster를 구성하고 있는 file record 내부를 논리적으로 들여다본 그림입니다. 즉, 하나의 inode는 위 [fig. 07]과 같은 구조를 가지고 있습니다. "FILE"로 시작하여 file attribute header가 위치하며, 그 뒤로 연속하여 각각의 속성들이 들어 있습니다. 해당 속성들은 inode의 종류에 따라 다르지만, 일반적으로 $STANDARD_INFORMATION$FILE_NAME등은 필수로 포함되어 있습니다(참고, ntfs에서 inode의 attribute는 $로 시작하고 모두 대문자로 표기됩니다). 

참고로, 제 PC에 있는 C:\Windows\notepad.exe의 inode는 11199였습니다(파일의 inode를 찾는법은 향후에 기술됩니다). 해당 inode를 물리적으로 dump를 뜨면 다음과 같습니다(Fix-up 처리가 완료된 상태. 이는 향후 기술됨).

[00000] 46 49 4C 45 30 00 03 00 C7 F7 3E 27 05 00 00 00  FILE0.....>'....

[00010] 03 00 04 00 38 00 01 00 D0 02 00 00 00 04 00 00  ....8...........

[00020] 00 00 00 00 00 00 00 00 08 00 00 00 BF 2B 00 00  .............+..

[00030] 0D 00 01 00 00 00 00 00 10 00 00 00 60 00 00 00  ............`...

[00040] 00 00 00 00 00 00 00 00 48 00 00 00 18 00 00 00  ........H.......

[00050] 3C 79 08 63 13 04 CA 01 10 C5 BC 6E 20 04 CA 01  <y.c.......n ...

[00060] F3 74 E4 F3 59 3A CE 01 3C 79 08 63 13 04 CA 01  .t..Y:..<y.c....

[00070] 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ...............

[00080] 00 00 00 00 C3 01 00 00 00 00 00 00 00 00 00 00  ................

[00090] 90 D3 F9 B2 01 00 00 00 30 00 00 00 70 00 00 00  ........0...p...

[000A0] 00 00 00 00 00 00 06 00 58 00 00 00 18 00 01 00  ........X.......

[000B0] 05 02 00 00 00 00 01 00 3C 79 08 63 13 04 CA 01  ........<y.c....

[000C0] 10 C5 BC 6E 20 04 CA 01 E5 FC 59 28 68 94 CD 01  ...n .....Y(h...

[000D0] 3C 79 08 63 13 04 CA 01 00 C0 02 00 00 00 00 00  <y.c............

[000E0] 00 BE 02 00 00 00 00 00 20 00 00 00 00 00 00 00  ........ .......

[000F0] 0B 00 6E 00 6F 00 74 00 65 00 70 00 61 00 64 00  ..n.o.t.e.p.a.d.

[00100] 2E 00 65 00 78 00 65 00 30 00 00 00 70 00 00 00  ..e.x.e.0...p...

[00110] 00 00 00 00 00 00 04 00 58 00 00 00 18 00 01 00  ........X.......

[00120] 99 1A 00 00 00 00 01 00 87 23 27 25 68 94 CD 01  .........#'%h...

[00130] 87 23 27 25 68 94 CD 01 87 23 27 25 68 94 CD 01  .#'%h....#'%h...

[00140] 87 23 27 25 68 94 CD 01 00 C0 02 00 00 00 00 00  .#'%h...........

[00150] 00 BE 02 00 00 00 00 00 20 00 00 00 00 00 00 00  ........ .......

[00160] 0B 00 6E 00 6F 00 74 00 65 00 70 00 61 00 64 00  ..n.o.t.e.p.a.d.

[00170] 2E 00 65 00 78 00 65 00 30 00 00 00 70 00 00 00  ..e.x.e.0...p...

[00180] 00 00 00 00 00 00 02 00 58 00 00 00 18 00 01 00  ........X.......

[00190] 9A 1A 00 00 00 00 01 00 87 23 27 25 68 94 CD 01  .........#'%h...

[001A0] 87 23 27 25 68 94 CD 01 87 23 27 25 68 94 CD 01  .#'%h....#'%h...

[001B0] 87 23 27 25 68 94 CD 01 00 00 00 00 00 00 00 00  .#'%h...........

[001C0] 00 00 00 00 00 00 00 00 20 00 00 00 00 00 00 00  ........ .......

[001D0] 0B 00 6E 00 6F 00 74 00 65 00 70 00 61 00 64 00  ..n.o.t.e.p.a.d.

[001E0] 2E 00 65 00 78 00 65 00 30 00 00 00 70 00 00 00  ..e.x.e.0...p...

[001F0] 00 00 00 00 00 00 05 00 58 00 00 00 18 00 01 00  ........X.......

[00200] BC 07 00 00 00 00 01 00 3C 79 08 63 13 04 CA 01  ........<y.c....

[00210] 10 C5 BC 6E 20 04 CA 01 E5 FC 59 28 68 94 CD 01  ...n .....Y(h...

[00220] 3C 79 08 63 13 04 CA 01 00 C0 02 00 00 00 00 00  <y.c............

[00230] 00 BE 02 00 00 00 00 00 20 00 00 00 00 00 00 00  ........ .......

[00240] 0B 00 6E 00 6F 00 74 00 65 00 70 00 61 00 64 00  ..n.o.t.e.p.a.d.

[00250] 2E 00 65 00 78 00 65 00 40 00 00 00 28 00 00 00  ..e.x.e.@...(...

[00260] 00 00 00 00 00 00 07 00 10 00 00 00 18 00 00 00  ................

[00270] A6 E9 DE 02 25 A6 E2 11 85 40 00 50 56 C0 00 08  ....%....@.PV...

[00280] 80 00 00 00 48 00 00 00 01 00 00 00 00 00 03 00  ....H...........

[00290] 00 00 00 00 00 00 00 00 2B 00 00 00 00 00 00 00  ........+.......

[002A0] 40 00 00 00 00 00 00 00 00 C0 02 00 00 00 00 00  @...............

[002B0] 00 BE 02 00 00 00 00 00 00 BE 02 00 00 00 00 00  ................

[002C0] 31 2C 29 EE 00 00 AE DD FF FF FF FF 82 79 47 11  1,)..........yG.

[002D0] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

[002E0] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

[002F0] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

[00300] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

[00310] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

[00320] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

[00330] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

[00340] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

[fig. 08]

앞선 설명처럼 FILE로 시작하고 있습니다. 그리고, 중간중간 UTF-16 형태의 notepad.exe가 보여집니다. 그리고, 1024 byte라면, [003F0]까지 표시되어야 하는데, [00340]까지 적어둔것은 그이후가 모두 0으로 채워져있기 때문입니다. 이와 같이 대략 사용되지 않고 버려지는것을 slack 공간이라고 합니다.

2-3. 마무리

2장에서는 ntfs file system의 이해를 돕기 위해 가장 큰 단위인 disk에서 부터 가장 작은 단위인 inode까지 top-down 방식으로 살펴보았습니다. 다음장부터는 좀더 ntfs의 기본 속성들에 대해 알아보도록 하겠습니다.