안녕하세요 EnIaC 입니다.


오늘 배워볼 내용은 이전 [제 8강] 에 이어 바로 DATA Area 에 대해 공부하는 시간을 갖도록 하겠습니다. 이전 강의에서는 FAT Area 로써 클러스터 할당 정보를 기록하는 작은 테이블 즉, FAT32 Table 영역(FAT Area 와 동일한 의미) 을 공부 했었는데 이 FAT Area 는 실제 클러스터의 내용을 기록하는게 아닌, 몇번 클러스터를 사용중이다 아니다를 표시하는 큰 틀로써 사용 되었습니다. 그러나, 이번에 배울 내용은 실제 데이터를 표기하는 DATA Area 로써 클러스터와 매칭되는 구조에 대해 어떻게 기록되는지 보도록 하겠습니다.



1. FAT DATA Area

[그림 1. FAT32 R,F,D Structure]


우선 위 [그림 1] 을 통하여 FAT DATA Area 영역은 Reserved Area(예약 영역), FAT Area 다음에 위치하게 된다는 것을 알 수 있습니다. DATA Area 에 저장되는 데이터는 크게 파일의 META Data (파일 이름, 크기, 타입, 시간 정보, 시작 클러스터 위치 등..)을 저장하고 있는 Directory Entry (디렉터리 엔트리)라는 구조와 실제 파일 데이터로 나누어 볼 수 있습니다.


[그림 1-1. FAT32 DATA Area Detail]


다음으로 위 [그림 1-1] 로 DATA Area 를 살펴 보도록 하겠습니다. 위 그림은 루트 디렉터리 내부에 서브 디렉터리가 하나 일때를 가정하여 나타낸 그림 입니다. 루트 디렉터리는 이전 버전인 FAT12/16 에서 FAT Area 에 바로 따라오게 되어 있습니다. 하지만 FAT32 는 그 위치가 고정 되어있지 않고, 예약된 영역 부트 섹터 내부의 BPB(Bios Parameter Block)의 값인 즉, (44~47, Root Directory Cluster Offset)을 통하여 그 위치를 나타내게 됩니다. 그러나 FAT32도 일반적으로 FAT Area 뒤에 따라오게 됩니다. (대부분 Cluster 2에 위치하게 됩니다.) 지금까지 분석해온 FAT 의 경우 모두 FAT Area 다음의 첫 클러스터에 위치하였고 이론상으로는 DATA Area 그 어디든지 Root Directory 가 위치할 수 있습니다.


루트 디렉터리가 FAT Area 다음의 첫 클러스터에 오지만 FAT Entry 0, 1번이 예약되어 사용되지 않기 때문에 첫 클러스터의 변호는 FAT Area 를 기준으로 하여 2번이 된다. (2번 클러스터가 된다는 뜻이다.) 이 부분에 대해 이해가 잘 가지 않는다면 [제 8강] 을 다시 한번 읽고 오길 바랍니다. 루트 디렉터리는 우리가 탐색기로 최상위 루트 혹은 루트라고 부르는 (C:) 를 클릭 해서 들어갔을때 나타내는 폴더 및 파일의 정보를 담고 있습니다.


폴더 및 파일의 정보는 Directory Entry(디렉터리 엔트리) 라는 구조를 통해 나타냅니다. 각각의 폴더 및 파일은 하나 이상의 디렉ㅌ터리 엔트리를 통해 표현되며, 그 크기는 32Byte 입니다. 다음은 디렉터리 엔트리의 데이터 구조를 나타낸 [그림 2] 입니다.



2. FAT DATA Area, Ditrectory Entry


[그림 2. Directory Entry Detail]


디렉터리 엔트리는 위 [그림 2] 와 같이 이름, 확장자, 속성, 생성 날짜 및 시간, 마지막 접근 시간, 마지막 수정 날짜 및 시간, 시작 클러스터 위치, 논리적 파일 크기 정보를 갖고 있습니다. 만약 폴더(Folder)를 표현할 경우 확장자가 없으므로 확장자는 표현하지 않습니다. 즉, 확장자를 표기하는 Extension 영역에는 0x00 값으로 채워지죠. 루트 디렉터리에 위치한 특정 파일이나 폴더에 접근하고자 하는 경우, 루트 디렉터레의 디렉터리 엔트리를 검색 하면서 해당 파일 이름을 찾을 수 있습니다. 아래는 위 디렉터리 엔트리에 대한 상세 설명입니다.



3. FAT DATA Area, Ditrectory Entry Detail



[그림 3. Directory Entry Detail 2]



이름

 설명


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으로 채워진다.

 


파일 이름을 가진 디렉터리 엔트리를 찾았다면 시작 클러스터 정보(Starting Cluster High + Starting Cluster Low) 를 얻어 해당 위치부터 파일 크기 만큼 파일을 획득하면 될 것 입니다. 하지만, 파일은 항상 데이터 영역의 연속된 클러스터로 표현되지 않고 충분히 조각나 저장되어 있을 수 있기 때문에 이러한 조각난 파일 정보는 FAT Area 에서 시작 클러스터 부터 따라가면서 원하는 클러스터 만큼 획득하면 됩니다. (약간 노가다성 정보 수집이죠.) 파일 크기에 해당하는 클러스터를 획득한 경우에 마지막 클러스터에는 파일 슬랙이 존재할 수 있으므로 정확한 파일 데이터만 얻고자 한다면 파일 크기만큼 떼어내고, 그게 아니라면 클러스터 계산법에 의하여 4의 배수만큼 잘라내면 될 것입니다. (슬랙 공간에 악성 프로그램이 숨어있는 경우가 종종 있으므로 전자의 방법 보다는 후자의 방법을 권장 합니다.)


하위 디렉터리를 탐색하고자 한다면 파일과 마찬가지로 하위 디렉터리 이름을 갖는 디렉터레 인트리를 얻어, 하위 디렉터리가 위치한 클러스터로 이동하면 될 것 입니다. 그렇게 이동하게 되면 다시 클러스터에는 하위 디렉터리의 폴더 및 파일의 정보를 담고 있는 32 Byte 의 디렉터리 엔트리가 연속적으로 나오게 됩니다.


우리가 흔히 탐색기를 열어 확인할 수 있는 파일의 이름, 확장자, 시간 정보 등은 데이터 영역의 실제 파일을 통해 얻어오는 정보가 아닌, 디렉터리 엔트리만 탐색하여 얻는 정보 입니다. 이렇게 해야 수많은 파일을 한꺼번에 불러올때 PC 가 버벅거리지 않고 좀더 수월하게 작업할 수 있게 됩니다. META Data 의 존재 이유도 바로 이러한 이유 떄문입니다. 가장 쉬운 예로는 이미지 파일의 미리보기를 저장하는 Thumb.db 이기도 합니다. 그렇다면 숨김파일, 읽기 전용 파일, 시스템 파일 등은 어떻게 구별하는 것인지 의문이 드실겁니다. 그 방법은 바로 디렉터리 엔트리의 속성을 통해 가능합니다. 다음은 디렉터리 텐트리의 속성 (Offset 11)에 나올 수 있는 값 들 입니다.



 값 (Binary) 설명
 0000 0001 Read only
 0000 0010 Hidden file
 0000 0100 System file
 0000 1000 Volume label
 0000 1111 Long file name
 0001 0000 Directory
 0010 0000 Archive


여기서 한가지 궁금한게 있으실 겁니다. 위 디렉터리 엔트리 구조에 의하면 파일 이름을 표현하기 위해 8Byte 를 사용합니다. 그렇다면 8Byte 보다 긴 파일 이름은 어떻게 표현할 수 있는지에 대해 말입니다. 위 표를 자세히 읽은 독자라면 속성 부분에 "0000 1111"을 갖는 긴 파일 이름 속성이 있다는 것을 확인할 수 있을 것 입니다. 긴 파일의 경우(Long File Name, 축약하여 LFN 이라 부름) LFN 엔트리를 추가적으로 사용하게 됩니다. 디렉터리 엔트리에 대한 자세한 내용은 다음 [제 10강] 에서 알아보도록 하겠습니다.


이처럼 복잡한 폴더 구조 또한 루트 디렉터리를 기점으로 탐색해 나간다면 쉽게 모든 파일을 탐색할 수 있을것 입니다. 다만, 그 과정을 모두 수동으로 한다면 시간은 조금더 걸리겠지요. 탐색하여 원하는 파일을 찾은 경우에는 해당 파일의 시작 클러스터 위치를 통해 FAT Area 영역을 확인하여 연결된 파일 데이터를 획득 후 슬랙 영역을 제거하면 논리적인 파일을 얻을 수 있을 것 입니다.



다음 강의에서는 파일 분석을 위한 Directory Entry 구조에 대해 좀더 자세히 다뤄보는 시간을 갖도록 하겠습니다.



감사합니다.




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

,