Boot Record | Reserved | FAT #1 | FAT #2 | Root Directory | Data | 사용하지 않는 영역 |
---|
Boot Record로 시작하여, 사용하지 않는 영역으로 끝난다.
명칭 | 내용 |
---|---|
Jump Boot code | Boot Strap Code로 이동 |
OEM Name | OEM 회사를 나타내는 문자열 |
Byte per Sector | Sector의 구성 byte를 표현한다. (기본 512byte) |
SP | Cluster 구성 섹터 수 |
RS | 예약된 Sector의 개수 |
FAT 개수 | FAT의 개수 |
Media Type | Volume이 사용하는 Media의 종류를 나타낸다. |
FAT Size 32 | FAT 영역의 섹터 수 (1개 당) |
File System Version | FAT32의 버전 정보 |
Root Directory Cluster | Root Directory의 시작 위치 |
File system Information | FSInfo 구조체의 위치 |
Boot Record Backup Sector | BR이 백업되어 있는 섹터 번호 (기본 6) |
Volume ID | Volume Serial Number |
Volume Label | Volume의 이름을 기록 |
File System Type | 해당 File System의 Type |
BPS / SP / Total Sector 32 / Volume ID 를 디지털 포렌식 전문가 2급 시험 때 주로 사용하였다.
BPS * SP = Cluster 당 Byte를 구할 수 있음.
Boot Record Backup Sector의 값이 기본적으로 6 이기 때문에, Back up 본을 기본 VBR 주소 + 6을 통해 구할 수 있는 것이다.
Root Directory Address = VBR Address + Reserved Address + (FAT Size * 2)(=FAT#1 + FAT#2)
2-1. Root Directory
Root Directory는 FAT32에 존재하는 File과 Directory들의 정보를 가지고 있는 영역이다. 자세한 설명에 앞 서서, 실제 Root Directory로 찾아가는 과정을 경험해보자.
앞 서 살펴본 것 처럼, MBR 영역에서 우리는 FAT32의 LBA 시작 주소를 확인할 수 있다. 0x3F(=63) 섹터이다.
이동한다면, 우리는 FAT32의 VBR 영역을 확인할 수 있고, 그림에서 표시된 부분은 각각 우측 상단이 Reserved, 좌측 하단이 FAT Size를 표현한 위치이다. Root Directory의 위치를 구하기 위하여 계산을 수행해보자.
VBR Address : 63
Reserved : 0x01 F0 (=496)
FAT Size : 0x0F 08 (=3848)
63 + 496 + 3848*2 = 8255
8255 Sector로 이동하면 Root Directory가 위치하고 있음을 확인할 수 있다.
그런데, Root Directory의 위치를 구하기 위해 앞 서 언급한 계산을 수행해야하는 것은 알겠지만, 그 값들이 의미하는 건 무엇일까? 다시 말해, FAT 영역은 무엇을 하는 공간일까?
FAT32에서 FAT 영역은 4바이트씩 표현된다.
0~3 | 4~7 | 8~11 | 12~15 |
---|---|---|---|
Media Type | Partition Status | Cluster 2 | Cluster 3 |
Cluster 4 | Cluster 5 | Cluster 6 | Cluster 7 |
Cluster 8 | Cluster 9 | Cluster 10 | Cluster 11 |
Cluster 12 | Cluster 13 | Cluster 14 | Cluster 15 |
Cluster 16 | Cluster 17 | Cluster 18 | Cluster 19 |
Cluster 20 | Cluster 21 | Cluster 22 | Cluster 23 |
.....+@ |
추 후 파일을 복구 작업 시에 다시 언급하겠지만, FAT32의 0번 1번 클러스터는 별도의 용도로 예약된 영역이다. (Media Type : F8 FF FF 0F => 하드디스크)
FAT Entry의 값에 따라 다음과 같다. (FAT32의 경우)
0x00000000 : 해당 클러스터가 사용 가능하다는 의미. 비할당 상태이다.
0x0FFFFFF7 : Bad Cluster
0x0FFFFFF8(보다 큰 값) : 파일의 끝을 나타낸다.
따라서 OS가 새로이 파일과 디렉터리를 할당하기 위해서는, 0x00인 클러스터를 찾아 할당한다.
A. 파일이나 디렉터리의 크기가 항상 1개의 Cluster의 크기보다 작지는 않을 것이다. (BPS * SP = Cluster Size, 보통 4096) 그렇다면, 여러개의 클러스터를 묶어서 사용한다. 묶는 과정은 다음과 같다.
Cluster 02 | Cluster 09 | Cluster 10 | Cluster 17 |
---|---|---|---|
00 00 00 09 | 00 00 00 0A | 00 00 00 11 | 0F FF FF FF |
2번 Cluster -> 9번 Cluster -> 10번 Cluster -> 17번 Cluster
(17번이 마지막 Cluster니까, 0xFFFFFF8보다 큰 값으로 마지막임을 나타낸다.)
다시 Root Directory로 돌아가자
2-2. Root Directory
Root Directory는 Directory Entry들의 집합이다. Data 영역에 저장되어 있는 File들의 정보들의 위치와 시간 등의 정보 (Directory의 경우, 자신의 정보와 하위 Directory, File들의 정보)를 가지고 있다.
기본적으로는, 위 그림과 같은 구조를 가지고 있다. (SFN)
첫번째 바이트에 따른 뜻
0xE5 : 삭제되었음을 의미
0x00 : 비어있음
Attribution의 값에 따른 의미
0x01 : Read only
0x02 : Hidden
0x04 : System
0x08 : Value Label
0x10 : Directory
0x20 : File
0x0F : LFN
사진은 Directory Entry의 일부다. 생성 시간의 값은 C8 6E, 생성 날짜는 30 48, 마지막 접근 날짜는 30 48, 마지막 수정 시간은 95 95, 마지막 수정 날짜는 26 48이다.
생성 시간 : C8 6E는 Big endian 표기이니, Little Endian으로 변경하여 bit 단위의 값을 확인하면 다음과 같다. (6E C8) = 01101/110110/01000 = 13시 / 54분 / 16초 (8*2)
생성 날짜 : (48 30) = 0100100/0001/10000 = 36 + (1980)년 / 1월 / 16일
실제와 동일하게 찾아냈음을 알 수 있다.
다시 본론으로 돌아와서 SFN과 LFN에 대해 알아보자. FAT32는 이름이 8자 이하라면 SFN(Short File name)으로 저장하지만, 그 이상이라면 LFN으로 저장한다.
LFN의 구조는 다음과 같다.
명칭 | 의미 |
---|---|
Order | 순서, 마지막인 경우, 0x40과 xor한 값이 들어감. |
Name1 | 1-5번째 이름 |
Attribute | 속성, LFN이기에 0x0F |
Type | 일반적으로 0x00 |
Checksum | |
Name2 | 6-11번째 문자열 |
First Cluster Low | 반드시 0 |
Name3 | 12-14번째 문자열 |
실제 파일의 Hex 값들이다. 한글 파일이기에 명칭을 바로 확인할 수는 없지만, 그림에서 확인한 형식들을 볼 수 있다.
일부러 아무 표시 없는 그림을 준비했다. 구조가 눈에 보이는가?
기본적으로 32바이트씩 잘라서 보면된다.
상단의 2개의 덩어리는 Directory, 하단의 큰 두개의 덩어리는 각각 LFN 구조인 File 2개이다.
하단의 파일을 우선 복구해보자
이름의 1번째 바이트가 E5가 아니니, 삭제된 파일은 아니다. 또한 Attribute가 0x20인 것으로 보아 File이다. File의 Low cluster의 정보는 0x0382(litte endian)이고, 크기는 0x40DFCA (byte)이다.
Root Directory : 8255 sector
Low Cluster : 0x0382 : 898
Size : 0x40DFCA
값은 다 준비되었으니 계산해보자.
File의 시작 주소 : Root Directory + (Low Cluster - 2) 8
File의 끝 주소 : Root Directory + (Low Cluster - 2) 8 + Size
2를 빼는 이유는, 앞 서 FAT#1 영역을 살펴보았듯 2개의 클러스터가 시스템 영역으로 예약되어 사용 중이기 때문이다.
값을 대입해본다면, File의 시작 주소는 15423 Sector가 나옴을 확인할 수 있다.
PDF의 Signature도 확인할 수 있으니 잘 찾아 온 것 같다. 그렇다면 시그니처를 시작점으로, File의 Size만큼을 복사해서 새로 파일을 만들면, 복구는 끝이 난다.
PDF 파일이 잘 열렸다. 복구 끝.
(Winhex 구간 지정 단축 키 : Alt + 1, Alt + 2 )
NTFS
(작성중)