모두의 dream

FAT32 File System 본문

분야/Digital Forensics

FAT32 File System

오리꽥이로 2024. 3. 4. 00:10

*공부를 위해 정리한 내용으로 틀린 부분이 있을 수 있습니다. *

I. FAT32 파일시스템

File Allocation Table

파일의 할당 정보를 표현한 테이블.

* 클러스터는 여러개의 섹터로 이루어져 있다.

II. FAT32 파일시스템 구조

FAT32 구조

  • 첫 번째 섹터는 MBR이 존재한다.
  • 만약 파티션이 여러개 없다면(단일 파티션) MBR 대신 VBR 부터 시작된다고 한다.
  • 실습파일: FAT32 파일시스템으로 포맷한 USB.

MBR

파일시스템의 종류와 상관없이 MBR과 GPT는 디스크의 첫 번째 섹터에 위치하는 데이터로, 운영체제에 대한 정보가 담겨있는 영역이다. 따라서 이 영역이 손상될 경우 운영체제가 정상적으로 부팅되지 않는다.

 

LBA(Logical Block Addressing)는 논리적인 주소로 섹터에 접근하는 방법이다. 섹터 1개를 LBA n 으로 부르게 된다.

(참고: https://velog.io/@markyang92/partition)

MBR 영역 구분 (Boot code, Partition table entry, signature)

MBR은 Boot code, Partition table entry, signature로 구성되어 있다.

Partition table entry는 위 사진처럼 16bytes 씩 4개로 구성되어 있다.

 

Partition table은 부팅이 가능한 파티션의 정보가 있는 곳이다. (멀티 부팅을 하게 되면 총 4개의 파티션 까지 가능)

 

Partition table entry의 데이터 구조는 다음과 같다.

Partition table entry

Partition table entry 에서 유심히 본 곳은 부트 식별자(Boot indicator) 와 파티션 타입, 파티션의 시작위치를 가리키는 LBA 주소값과 파티션 전체의 섹터 개수였다.

Partition table entry

offset (bytes) 내용 해석
0x04 (1 bytes) Partition Type 0x0C, Windows95 with 32-bit FAT (using LBA-mode INT 13 extensions)
0x08 (4 bytes) LBA 주소값 0x800(리틀엔디안) → 2048번 섹터(주소: 2048 * 512 = 0x200)
0x0C (4 bytes) 섹터 개수 0x1E0B800
(디스크 크기가 너무 커서 이 필드에 표시할 수 없는 경우 0xFFFFFFFF로 설정)

Reserved Area

Reserved Area 구조

Reserved Area (예약된 영역)은 Boot Sector, FSINFO, 추가적인 섹터로 구성되어 있다.

 

* 위에 사진이 잘못됐다. MBR 하위가 아닌 Reserved Area 하위로 들어가야 된다.

1. 부트섹터 (Boot sector)

Boot Sector 구조

부트섹터는 1섹터(512 byte)의 크기를 가지고 있다.

Reserved Area 이후 0번 섹터와 6번 섹터(백업본)를 사용하고 있다.

Reserved Area 이후 2번 섹터와 8번 섹터(백업본)는 부트 코드 영역이 부족할 경우 추가적으로 사용할 수 있는 섹터.

Boot Sector

부트섹터에서 유심히 본 곳은 다음과 같다.

Bytes per sector: 섹터의 bytes 수

sector per cluster: 클러스터의 섹터 수

Reserved sector count: Reserved Area 섹터 개수

FAT size 32: FAT 영역의 섹터 수 (FAT #1, FAT #2 별도)

Root dir cluster offset: Root directory 위치

offset 내용 해석
0x0B (2 bytes) Bytes per sector 0x200 -> 512 bytes
0x0D (1 bytes) Sector per cluster 0x10 -> 16 sectors = 8,192 bytes = 8KB
0x0E (2 bytes) Reserved sector count 0x7F0 -> 2032
0x24 (4 bytes) FAT size 32 0x3C08 -> 15,368
0x2C (4 bytes) Root dir cluster 0x02 -> 2 cluster

 

FAT Area로 이동하기 위해선 Reserved Area의 시작 섹터에 Reserved sector count 값을 더해주면 된다.

2048 (Reserved Area Start LBA) + 2032 (Reserved sector count) = 4080 (FAT Area start LBA)

FAT Area

4080 섹터로 이동해보면 FAT Area를 확인할 수 있다.

2. FSINFO

FSINFO 구조

첫 비할당 클러스터의 위치와 전체 비할당 클러스터의 수를 알려준다.

Reserved Area 이후 1번 섹터와 7번 섹터(백업본)를 사용하고 있다.

offset 내용 해석
0x1E8 (4 bytes) Number of free cluster 0x1DC655 -> 1,951,317
0x1EC (4 bytes) Next free cluster 0x3D2D -> 15,661

 

Sector per cluster가 16, Bytes per sector가 512이므로 현재 Number of free cluster는 (1,951,317 * 16) * 512를 해주면 구할 수 있다. 

3. 추가적인 섹터 (optional)

고정적으로 사용되고 있는 0,1,2,6,7,8 섹터를 제외하면 나머지는 만약을 대비해 사용할 수 있도록 예약되어 있는 영역이다.

FAT Area

FAT Area 구조

File Allocation Table, 파일 할당 테이블로 데이터 영역에 저장된 파일들의 할당 관계를 표시해주는 테이블.

FAT#1과 FAT#2는 동일한 데이터로, FAT#2는 첫 번째 테이블 영역이 손실되었을 경우 사용하기 위한 백업본이다.

FAT Area 구조

FAT32 의 FAT Area 에서는 4byte 씩 클러스터를 표현하고 있다.

실제 구조를 통해 확인해보자.

0x0FFFFFFF는 클러스터의 끝을 나타낸다.

만약 여러개의 클러스터를 사용할 경우 0x0FFFFFFF가 나올때 까지 값을 가지게 된다.

또한 FAT entry를 보면 07, 08 이런식으로 값이 올라가고 있는데 이건 다음 클러스터의 값을 가지고있다.

(3번째 엔트리 -> 0x4 값을 가르키기 때문에 0x4 값을 가짐)

 

현재 예제의 Bytes per sector는 512bytes, Sector per cluster는 16 sectors = 16 * 512 = 8,192 bytes = 8KB

한 클러스터의 크기는 8KB이다.

FAT Area 파일 접근 방법

아래는 FAT Area에 있는 한 파일의 클러스터 영역이다.

크기가 좀 커서 시작과 끝 주소가 차이가 좀 난다.

 

현재 실습파일은 한 클러스터당 16섹터로 이루어져있다.

0x0FFFFFF를 이용하여 클러스터의 끝을 알린다. (End of Cluster, EOC)

시작 엔트리는 07로 기록되어 있으니, 06번째 엔트리가 07을 가리키고 있는 것으로 해석할 수 있다.

따라서 시작 클러스터는 0x06 번째.

마지막 엔트리는 0x0FFFFFF 이 있는 엔트리이며 그 전 엔트리가 0x2805를 가리키고 있으니 0x0528 까지라고 볼 수 있다.

이 파일의 클러스터의 범위는 0x06 ~ 0x2805 (0x2800 개)

 

2 클러스터를 빼주는건 root dir이 2부터 시작이기 때문이다.

시작: 0x06 = (6 - 2) * 16 = 64 + 34816(Root dir) = 34880

마지막: 0x2805 = (10245 - 2) * 16 = 163888 + 34816(Root dir) = 198704

마지막 주소에서 + 16(한 클러스터의 섹터 수)을 해주고 1을 빼준다.

198704 + 15 = 198719

198719 섹터가 이 파일의 마지막 섹터다.

 

15을 더해주는 이유는 0x2805 엔트리 "이전" 까지가 아닌 0x2805 엔트리 "까지"의 값을 가지므로 16 섹터를 더해서 본인을 포함시켜 준다. (16을 더해주지 않고 15를 더해주는 이유는 16섹터를 더한 198720 이전 섹터까지의 값을 가져야 하기 때문에 1을 빼준 15를 더해줬다. 16을 더하고 그냥 198720 "이전"까지가 이 파일의 섹터라고 표현해도 된다.)

 

그래서 사실 애초에 계산할때 마지막 엔트리의 값을 0x2805에서 1클러스터를 더해 0x2806 상태로 계산한뒤 마지막에 1을 빼줘도 된다.

 

설명하기 겁나 어렵다;;;

나중에 내가보고 이해할 수 있을지도 의문이다;;

 

시작 섹터인 34880 섹터로 가보면 파일을 확인할 수 있다.

 

파일이 삭제된 경우는 어떻게 표현될까?

파일이 삭제된 후 엔트리

엔트리의 값이 모두 0으로 채워진다.

FAT#2

FAT#2 섹터로 가는 방법은 현재 FAT#1의 섹터에서 FAT size 32 값을 더해주면 된다.

4080 (FAT Area start LBA) + 15,368 (FAT size 32) = 19,448 (FAT#2)

 

Data Area로 이동하기 위해서는 root directory의 위치를 찾으면 된다.

부트섹터에서 확인했던 Root dir cluster의 위치는 2, FAT size 32 값은 15368, 현재 FAT#2의 섹터는 19448.

FAT#2 LBA + (FAT size 32  * (Root dir cluster - 1))

19,448 + (15,368 * (2 - 1)) = 34,816 (root dir)

 

1을 빼준 이유는 아래와 같다.

 

FAT Area에서 본 것 처럼 0, 1번째 섹터는 각각 Media type과 Partition status로 사용되고 있다.

따라서 root directory의 시작 클러스터는 2번이 되고, 시작 클러스터이기 때문에 1의 값을 가지도록 해야 정상적으로 위치를 찾아낼 수 있다. 

그래서 1을 뺴줬다.

34816 섹터로 이동하면 Data Area를 확인할 수 있다.

Data Area

Data Area 구조

실제 데이터들이 저장되는 영역.

파일의 메타 정보를 저장하고 있는 디렉터리 엔트리와 실제 파일 데이터가 저장되어 있다.

1. 디렉터리 엔트리

SFN (Short File Name)

SFN (Directory Entry)

Directory Entry는 32 bytes의 고정된 값을 가지고 있다. 

 

0x0B에 있는 Attribute의 세부 옵션은 다음과 같다.

value 내용
0x01 읽기 전용 파일 (Read only)
0x02 숨김 파일 (Hidden file)
0x04 운영체제 시스템 파일 (System file)
0x08 볼륨의 이름 (Volume label)
0x0F LFN 엔트리
0x10  디렉토리 (Directory)
0x20 일반 파일 (Archive)

 

Directory Entry

삭제된 파일의 경우 엔트리 가장 앞 바이트가 0xE5로 바뀐다.

 

Data Area 디렉터리 엔트리를 보면 가장 상위 1개를 제외한 나머지 엔트리가 32 bytes 보다 큰 값을 가지고 있는 것을 확인할 수 있다. 왜 그럴까??

 

위에서 말한 것 처럼 Directory Entry는 32 bytes의 고정된 값을 가지고 있다.

또한 Name이 8bytes 값을 가지고 있는 것을 확인할 수 있다.

영어는 1 bytes, 한글은 2bytes의 크기를 갖고 있는데 8 bytes로는 부족할 수 있다.

그래서 8 bytes를 초과하는 파일명을 위해 LFN(Long File Name)이라는 엔트리가 있다.

 

LFN (Long File Name)

LFN (Directory Entry)

LFN의 구조는 기본적으로 이렇게 구성되어 있다.

파일명의 길이에 따라 위 구조가 스택처럼 아래에서 위로 쌓이게 된다.

LFN의 Attribute는 모두 고정값 0xF를 가지게 된다.

 

예시를 통해 자세히 알아보자.

LFN 구조 예시

기본적으로 가장 바닥에 SFN 구조가 존재한다.

그리고 파일명의 길이에 따라 가운데 파란색 부분이 더 추가되고, 초록색 부분은 LFN의 가장 마지막 구조이다.

가장 앞에 있는 sequence Number는 LFN이 증가하면 01부터 계속 숫자가 증가하며 마지막 LFN의 Sequence Number 값은 0x40과 OR 연산된 값이 들어간다.

 

아래 과정을 이용하면 LFN의 마지막을 파악할 수 있다.

1. 가장 앞에 있는 sequence Number를 통해 LFN의 마지막을 파악할 수 있다. (OR를 이용)

2. LFN의 Attribute는 0xF, SFN의 Attribute는 0xF를 제외한 나머지이므로 만약 코딩을 한다면 0xF가 아닌 값이 나오기 전까지 같은 파일로 판단하면 될 것 같다.

 

초록색 부분은 LFN 기본 구조와 동일하지만 파일명의 끝을 나타내는 구조이다 보니 파일명 뒤에 남는 공백 자리에 0xFFFFFFFF가 들어간다.

 

삭제된 파일을 복구하는 방법에 대해서는 다음 포스팅 참고.

https://roklcw.tistory.com/81

 

FAT32 삭제된 파일 복원

모두의 dream FAT32 삭제된 파일 복원 본문 분야/Digital Forensics FAT32 삭제된 파일 복원 오리꽥이로 2024. 3. 11. 20:55

roklcw.tistory.com

III. Reference

http://forensic-proof.com

https://blog.forensicresearch.kr/2

https://hyd3.tistory.com/125

https://hec-ker.tistory.com/268