안녕하세요 EnIaC 입니다.


어제는 몸이 좀 많이 아팠던 관계로 블로깅 하다가 좀 쉬었습니다. (내용 쓰다가 그상태로 잠들었네요..) 여튼 오늘 배워볼 내용은 이전 [제 9강] 에서 바로 이어지는 Directory Entry 에 대해 공부해 보도록 하겠습니다.



1. Directory Entry

디렉터리 엔트리는 Windows 의 FAT(File Allocation Table) 파일 시스템에서 파일 이름, 확장자, 위치, 크기, 시간정보 등을 표현하기 위해 만들어진 구조체 입니다. 하나의 파일 및 디렉터리는 각각의 META 정보를 표현하기 위해 하나의 디렉터리 엔트리를 갖습니다. 편의상 디렉터리라는 용어는 통일해서 이야기 하도록 하겠습니다.

FAT File System 에서 FAT Area 에 이어 오는 루트 디렉터리(Root Directory) 영역 (FAT32 는 이론상 DATA Area 어디든 위치할 수 있고 일반적으로 Cluster 2 에 위치합니다.)을 살펴보면 취상위 디렉터리에 존재하는 파일들의 디렉터리 엔트리를 확안할 수 있습니다. 모든 디렉터리의 시작은 최상위 즉, "\" 에서 부터 시작되므로 (예를들어 드라이브 문자를 부여하자면 예컨대 C:, D: 와 같다.) 파일, 폴더 구조 또한 무조건 최상위로 부터 시작된다. 따라서 루트 디렉터리를 찾게 된다면 이론상 모든 파일과 폴더 구조를 찾아나갈 수 있는 것 입니다.

[그림 1. Disk allocation letters]



[그림 1-1. Root Directory]


이 디렉터리 엔트리는 DATA Area 에 존재하며, 실제 데이터에 대한 내용을 담고 있습니다. 따라서 각 파일 및 폴더당 하나씩 갖고 있으며 데이터 저장은 당연히 클러스터 단위로 저장하게 됩니다. 만약 저장하려고 하는 데이터가 한 개 클러스터 보다 크게 된다면 필요한 만큼 클러스터를 더 할당하여 저장하게 되며 이 경우 데이터를 모두 저장하고 나서 마지막 클러스터에 공간이 남는다고 해도 이미 사용한 클러스터라고 FAT Area 즉, FAT32 Table 에 기록되기 때문에 해당 클러스터는 더이상 사용이 불가하고 남는 공간은 그냥 버려지는 슬랙 공간이 되는 것 입니다. 이 공간에 악성 프로그램이 숨기도 합니다.

실제 데이터를 저장할때는 파일이냐 디렉터리냐에 따라 저장 방식에 약간의 차이가 있는데, 만약 파일이라면 클러스터에 파일의 내용이 직접적으로 기록되어 저장하는 구조를 갖고, 디렉터리라면 디렉터리 엔트리 라는 구조체 중 Extender 영역에 0x20, Attribute 값에 0x10 값을 기록하여 본 디렉터리 엔트리 구조를 갖는 데이터는 "폴더" 라는것을 알리게 됩니다. 따라서 이러한 구조로 포렌식을 진행하는 수사관들이 해당 데이터가 폴더인지 아니면 일반적인 파일인지 구별 가능하겠죠. Extender 는 확장자를 표기하는 영역이므로 파일이라면 해당 파일이 갖는 확장자를 기록하여 직접 GUI 로 확인하지 않고도 해당 파일의 확장자를 알 수 있습니다. 어쩌면 당연한 구조이죠. GUI 로만 확인이 가능한 구조가 있다는것은 애초에 CLI 환경을 무시하는 경우가 되니까요.

디렉터리 엔트리(Directory Entry) 의 구조는 이전 [제 9강] 에서 확인한 것과 같습니다.
아래 [그림 2] 를 참고 하시길 바랍니다.


2. Directory Entry Detail Structure

[그림 2. Directory Entry Detail Structure]


이전 [제 9강] 에서 이미 한번 간단하게 훑은 내용입니다. 하지만 오늘은 하나하나 어떤 역할을 하는지 자세히 살펴보도록 하겠습니다.

우선 디렉터리 엔트리에서 NAME 영역에 대해 간단히 이야기 해 보도록 하겠습니다. 디렉터리 인트리는 기본적으로 이름을 표현할 수 있는 필드가 8Byte 뿐입니다. 그 중 첫 번째 바이트는 파일이 파일 시스템상에 존재할 경우 파일 이름을 표현하기 위해 사용되지만 파일이 삭제 되었을 경우에는 0xE5 로 해당 파일이 삭제 되었음을 알립니다. 미리 말씀 드리지만, 실제 우리가 윈도우에서 삭제를 하더래도 빠른 처리를 위하여 실제 데이터를 0x00 으로 덮어 씌우는 것이 아니라, 삭제 되었으니 인식하지말라는 표시를 해 놓습니다. 그게 바로 0xE5 이죠. 물론 클러스터 값이 담겨있는 FAT Area 에선 변화가 있습니다. 따라서 포렌식 툴에서 복구를 할때 시스템에서 사용중인 디스크에 복구 하지 말라는 메시지가 뜨는 이유 중 하나 입니다. 원본 훼손 우려와 클러스터 문제 때문이죠. (사실은 원본 훼손이 큰 이유를 차지합니다.) 또한 이 8Byte 라는 틀을 깨기 위해서 LFN 즉, Long File Name 이라는 엔트리라는 새로운 구조를 사용해 파일 이름을 표현하기로 했습니다. 따라서 8Byte 이상의 파일 이름도 지정할 수 있다는 얘기가 된 것이죠. 기존의 문제점을 새로운 엔트리를 통해 극복 했습니다. 이 경우는 곧 있을 LFN 파트에서 배우도록 하겠습니다.

이름

 설명


Name

파일/디렉토리의 이름, 대문자로 최대 8자까지 넣을 수 있으며 남는 공간은 0x20으로 채워진다. 단 만약 해당 파일/디렉토리가 지워진 경우에는 최고 상위 bit가 0xE5로 채워짐.


Extender
 Hidden file확장자, 대문자로 최대 3자리까지 입력이 가능하며 이 역시 남는 공간은 0x20으로 채워지는데 디렉토리의 경우에도 이 공간이 0x20으로 채워진다.

Attribute
해당 Directory Entry의 용도를 기록하는 항목으로 System File은 0x04로, 서브 디렉토리의 경우 0x10, 일반 파일은 0x20, LFN 이 적용되었다면 0xF0로 채워진다.

(Reserved) NT Resource

Windows NT 의 예약된 공간으로 항상 0으로 채워져 있다.


(Reserved) Create Time Tenth


파일이 생성된 시간을 1/10 초 단위로 기록하는 항목.


Create Time
파일 생성 시간으로 상위 5bit는 초, 다음 6bit는 분, 마지막 5bit는 시를 의미한다. 다른 값은 일반적으로 식별하는 시간이 맞으나 초의 경우 값이 1증가할때마다 2초씩 증가한다.

Create Date

생성 날짜로 상위 5bit는 일, 다음 4bit는 월, 마지막 7bit는 년을 의미한다. 단 년도의 경우 1980년으로 부터의 오프셋인데 만약 11이라면 1980+11=1991년을 의미한다.
 
Last Access Date

 
가장 최근의 읽기/쓰기를 한 날자를 의미한다.
 
First Cluster High 2Byte


파일의 첫 번째 클러스터 번호의 상위 2Byte를 말한다. 
 
Write Time

최근 파일 수정 시간을 말하며 파일 생성 역시 쓰기로 간주하기 때문에 파일 최소 생성 시에는 이 Write Time과 Create Time 이 일치한다. 

 
Write Date


최근 수정 일자로 파일 최초 생성시에는 Create Date와 일치 

 
First Cluster Low 2Byte


파일의 첫 번째 클러스터의 하위 2Byte를 말한다. 

 
File Size


파일의 크기를 의미하며 단위는 Byte이다. 만약 디렉토리라면 이항목은 0으로 채워진다.


위 내용으로 디렉터리 엔트리 구조에 대한 설명은 마치도록 하겠습니다. 다음은 지금까지 배운 디렉터리 엔트리 구조를 이용한 파일 분석 입니다.



3. Directory Entry Detail Analysis

위에서 지금까지 배운 내용을 토대로 실제 분석을 진행 해 보도록 하는 시간을 갖겠습니다. 우선 최상위 즉, 루트 디렉터리에 테스트용 파일을 하나 생성해 주시길 바랍니다. 여기서는 test04 라는 파일 명으로 txt 파일을 생성 하였습니다. 여기서 주의하실점이 있는데, 파일을 생성한 뒤 "우클릭 - 이름바꾸기" 메뉴를 통한 이름 바꾸기는 실제 이미 이전에 이름으로 기록된 데이터의 파일이 있기 때문에 새로운 클러스터에 할당받아 데이터를 저장하는 경우가 발생합니다. 따라서 파일 생성은 다른 디스크 혹은 다른 파티션에서 생성하여 이름 변경까지 마친 뒤, 테스트를 할 수 있는 디스크 혹은 파티션으로 복사[Ctrl + C] 후 붙여넣기[Ctrl + V] 해 주시면 분석시 굉장히 깔끔한 데이터 구성을 보실 수 있습니다.



[그림 3. Directory Entry Analysis Example]


[그림 3] 과 같이 F:\ 로 명명된 Partition 2 혹은 [n] 의 Root Directory 에는 dirtest 라는 디렉토리가 있으며 그 내부에는 test04.txt 라는 파일을 갖고 있습니다. 지금부터 Root Directory Entry 로부터 test04.txt 라는 파일까지 찾아가 보도록 하는 실습을 시간을 갖겠습니다.



[그림 3-1. Partition Root Directory Entry]


[그림 3-1] 은 Partition 의 Root Directory Entry 로써 최상위 디렉터리가 있는 곳 입니다. 이곳에 있는 Directory 중 Attribute 항목이 디렉토리로, 즉, 0x10 으로 표기된 항모글 찾으면 가장 하위에 있는 것을 확안할 수 있습니다. 위 그림에 있는 내용중 일부를 덤프뜬 내용 입니다. 아래의 내용으로 상세 분석을 하도록 하겠습니다.


 44 49 52 54 45 53 54 20 20 20 20 10 08 2A 17 89 

 03 45 03 45 00 00 18 89 03 45 07 00 00 00 00 00 


- Name : 0x4449525445535420 (파일명 DIRTEST)

- Extender : 0x202020 (Directory)

- Attribute : 0x10, Directory

- NT Resource : 0x08

- Create Time Tenth : 0x2A

- Create Time : 0x8917, 10001 001000 10111 => 17시 8분 46초

- Create Date : 0x4503, 0100010 1000 00011 => 2014년 8월 3일

- Last Access Date : 0x4503, 2014년 8월 3일

- First Cluster High 2 Byte : 0x0000

- Write Time : 0x8918, 10001 001000 11000 => 17시 8분 48초

- Write Date : 0x4503, 2014년 8월 3일

- First Cluster Low 2Byte : 0x0007 => High + Low = 0x00000007 => Cluster 7

- File Size : 0x00000000, Directory


위 분석 결과를 토대로 TEST04.TXT 의 위치는 15번 클러스터로 확인 되었으며, 해당 클러스터가 갖는 섹터를 계산 (15 - 2) * 8 = 104 Sector 하여 104 Sector 만큼 이동해야 함을 알아 냈습니다. 그럼 위 계산을 통하여 위치를 이동하도록 합니다.



[그림 3-2. TEST04.TXT Data Check]


이로써 해당 섹터로 이동하면 파일의 데이터 값이 그대로 보이게되며 여기서는 TXT 파일로 저장 했으므로 데이터가 그대로 저장되어 내용물을 알아볼 수 있음을 알 수 있습니다.



4. LFN, Long File Name Entry Structure

LFN Entry 란, 기존의 파일 작명 방식은 이름 8자와 확장자 3자의 한계를 보완하기 위해 생겨난 작명 방법입니다. 이 LFN 방식은 UTF-16 인코딩을 사용하여 다국어 지원이 가능하며 최대 255자 라는 엄청난 파일이름 작명까지 가능하게 되었습니다. LFN 구조는 다음과 같습니다.



[그림 4. LFN Structure]


이름

 설명

Order (Sequence Number or Status Byte)

LFN 의 순서를 기록하는 항목으로써 가장 처음은 0x01 로 시작되고, 가장 마지막은 0x40 과 OR 연산을 한 값으로 기록.


Name 1



1~5번째 문자열 기록하는 곳. (Unicode)


Attribute


항상 0x0F 로 고정 되어있는 값.

Type


일반적으로 0x00 으로 채워지는 값.

Checksum


해당 LFN 과 대응되는 Short Directory Entry 의 Checksum

DATA 를 저장하는 곳.



Name 2


6~11번째 문자열 (Unicode)


First Cluster Low


반드시 0 이 들어가는 값

 
Name 3

 
12~13번째 문자열 (Unicode)



위 표를 토대로 LFN 을 사용하는 파일을 분석 해보도록 하겠습니다.


[그림 4-1. LFN File Data GUI Check]


[그림 4-1] rhk rkxdl F:\LNF Test\thislnftestfile 이라는 파일을 분석하여 실제 LFN 이 어떻기 기록하는가에 대해 두 눈으로 직접 확인 해 보도록 하겠습니다. 파일 명은 thisislfnfile 이며 확장자를 빼고도 16개의 문자로 이루어져 있기 때문에 기존의 Short Directory Entry 로는 저장할 수 없다는 사실을 직접 계산할 수 있습니다.



[그림 4-2. LFN File Data Hex Check]


Test File 의 Directory Entry 로 이동해보면 THISIS~1TXT 로 파일명과 확장자가 표현 된 것을 확인할 수 있는데, 그 윗쪽을 살펴보면 Attribute 값이 0x0F 로 되어있는 2개의 Entry 가 보일 것 입니다. 이는 해당 Test File 이 LFN 임을 알 수 있습니다.


아래 HEX 값을 통해 보다 자세히 알아보도록 하겠습니다. 색을 달리하고 기울림 처리가 되어 있는 곳이 중요하게 보아야 할 곳 입니다.


 42 66 00 69 00 6C 00 65 00 2E 00 0F 00 43 74 00

78 00 74 00 00 00 FF FF FF FF 00 00 FF FF FF FF

01 74 00 68 00 69 00 73 00 69 00 0F 00 43 73 00

6C 00 66 00 6E 00 74 00 65 00 00 00 73 00 74 00 


LFN 에 대해서만 상세히 분석하려 하는데 우선 2개의 Order 을 확인하면 가장 처음은 01로 그 다음에는 42로 시작하는 것을 확인할 수 있습니다. 이는 0x40 | 0x02 의 결과로 해당 LFN 이 가장 마지막 LFN 임을 의미하는 것 입니다. 그러므로 1번 Entry 의 Name 1 부터 Name 3 까지 읽고 그 다음 2번 Entry Name 1 부터 Name 3 까지 읽으면 thisislfntestfile,txt 로 정확히 파일 명과 일치하는 것을 알 수 있습니다.




이로써 FAT32 에 대한 모든 내용은 끝난 상태 입니다. FAT32 구조를 직접 다 보았고 다음 강의부터는 보충 설명과 실제 필자가 만든 문제를 풀어보고 풀이 과정을 상세히 정리하여 포스팅 하는 방식으로 포스팅 하도록 하겠습니다. 또한 NTFS 는 제가 시간 되는대로 하나씩 최대한 빠르게 포스팅 하도록 하겠습니다.


지금까지 FAT32 공부하시느라 고생하셨고, 앞으로 NTFS 가 기다리고 있으니 좀더 화이팅 하시길 바랍니다...!! :)



* 본 FAT32 강의는 이론적 내용을 담고있으며 본인의 것으로 만드려면 직접 문제를 풀어보고 실습하는 시간을 필수로 요구하는 과정입니다. 그에 따라서 직접 분석 과정을 올릴 예정이오나, 독자분들 스스로 공부하려는 의지가 받쳐줘야 한다는 사실을 명심 하시길 바랍니다.


감사합니다!


WRITTEN BY
EnIaC
WhiteHackerGroup 『LockDown』 EnIaC 입니다.

,