초기 설정
USB에 FAT32 볼륨을 생성하였다.
이후 해당 볼륨에 "Hello FAT32"라는 내용을 담은 test1.txt 파일과, "Go to trash"라는 내용을 담은 test2.txt 파일을 각각 저장하였다.
이 중 test2.txt는 삭제하였다.
이제 해당 볼륨을 FTK Imager를 통해 이미징 하자.
위 이미지들을 하나로 합치기 위해 아래의 명령어를 입력한다.
copy /b USB_FAT.001 + USB_FAT.002 + USB_FAT.003 USB_FAT_combined.img
제대로 이미징이 되었는지 확인하기 위해 FTK Imager에 넣어서 파일들을 보자.
생성한 파일들이 보이는 것으로 보아 이미징은 제대로 되었다.
이제 이 이미지를 HxD로 분석하자.
FAT32의 구조는 아래와 같다.
Reserved Area
먼저 FAT의 Reserved Area부터 분석해 보자.
FAT32는 32개의 Reserved Area를 가지고 있다. 이 중 0번 섹터를 "Boot Sector"라고 부른다.
다른 말로 VBR(Volume Boot Record)라고도 불리는데, 이 섹터는 Boot Code, 볼륨 크기, FAT 위치 등 볼륨에 관한 다양한 정보를 가지고 있다.
Reserved Area - Boot Sector
아래는 0번 섹터인 Boot Sector의 구조이다.
Boot Sector는 Jump command를 통해 Boot Code를 실행하고, 이때 BPB를 참조하여 File System이 부팅된다.
위 구조를 바탕으로 각 값들의 의미를 해석해 보자.
- Jump command to Boot Code: 0x9058EB (FAT32)
- Bytes Per Sector: 0x200 (512 bytes)
- Sector Per Cluster:0x08
- Reserved Sector Count: 0x202E
- 예약된 섹터의 개수
- VBR의 크기가 8238 섹터 -> FAT Area의 시작 위치
- Total Size 32: 0x80000
- 파티션이 차지하는 총 섹터 수: 524,288개
- 데이터 영역 크기 = 총 섹터 수 * 섹터 크기 - (VBR + FAT#1 + FAT#2가 차지하는 섹터 수) * 섹터 크기
- FAT Size 32: 0x1FE9
- FAT#1, FAT#2 영역의 크기는 각각 8,169 섹터
- -> 데이터 영역 크기 = 0x80000 * 0x200 - (0x202E + 0x1FE9 + 0x1FE9) * 0x200
- Root Directory Cluster Offset: 0x02
- 파일시스템의 가장 최상위 root 폴더를 2번 클러스터로 정의한다.
- FSINFO Offset: 0x01
- FSINFO 구조체는 OS에게 미할당된 클러스터의 위치와 전체 미할당 클러스터의 수를 알려주어, 새로 저장할 데이터의 할당을 빠르게 할 수 있도록 한다.
- FSINFO 구조체는 기본적으로 1번 섹터에 저장되어 있다.
- FSINFO의 백업도 존재하는데, 이는 7번 섹터에 저장되어 있다.
- Backup Boot Sector Offset: 0x06
- 0번 섹터인 부트 섹터의 백업용 섹터
- 기본적으로 6번 섹터
- Signature: "55 AA"
Reserved Area - FSINFO
다음으로 Reserved Area의 1번 섹터에 위치한 FSINFO에 대해 분석해 보자. 이 섹터는 미할당 클러스터에 관련한 정보를 OS에게 알려주어 빠른 데이터 할당을 돕는다.
위 구조를 바탕으로 각 값들의 의미를 해석해 보자.
- Signature 1: "RRaA"
- Signature 2: "rrAa"
- Number of Free Cluster: 0xFF3FC (1,045,500개)
- 사용 가능한 클러스터 수를 나타낸다.
- 1,045,500 * 8 * 512 = 4,282,368,000
- Next Free Cluster: 0x06
- 사용 가능한 클러스터의 시작 위치
- Signature 3: "55 AA"
FAT Area
FAT 영역은 존재하는 클러스터에 데이터가 할당되었는지 여부 즉 클러스터 할당 상태 및 연결 클러스터를 표시해 주는 파일 할당 테이블이다. FAT 영역은 FAT #1과 FAT #2로 2개가 존재하며 FAT #1과 FAT #2 안의 내용은 동일하다. FAT #2는 FAT #1이 손상된 경우 복구 용도의 백업이다. FAT32는 4 bytes로 데이터 영역의 시작 클러스터부터 마지막 클러스터까지의 할당 상태를 표시한다.
Reserved Area에서 찾았던 FAT Area의 시작 위치는 0x202E(8,238) 섹터였다.
따라서 해당 섹터의 위치로 가보자.
또한 FAT #1, FAT #2 영역의 크기는 각각 0x1FE9 ( 8,169 )이다. 따라서 FAT #2의 시작 위치는 FAT #1으 시작 위치인 8,238 섹터에 8,169을 더한 16,407이 된다.
해당 위치로도 가보자.
FAT #2가 FAT #1의 백업본이기 때문에 동일한 데이터가 들어있는 것을 알 수 있다.
이제 각 값의 의미를 해석해 보자.
FAT32는 4 bytes 단위로 클러스터의 할당 유무를 표시한다. 이 4 bytes를 "FAT Entry"라고 하며, 한 섹터 당 128개의 FAT Entry를 표현할 수 있다.
이때, 0번 Entry와 1번 Entry는 예약된 영역이다.
0번 Entry는 Media Type, 1번 Entry는 Partition Status를 나타낸다.
2번 Entry부터는 대응되는 Data Area의 클러스터가 할당 클러스터인지, 미할당 클러스터인지, 배드 섹터가 포함된 클러스터인지에 따라 다른 값을 갖게 된다.
- 2번 Entry: 0x0FFFFFFF
- 하나의 클러스터만 사용
- 3번 Entry: 0x0FFFFFFF
- 하나의 클러스터만 사용
- 4번 Entry: 0x0FFFFFFF
- 하나의 클러스터만 사용
- 5번 Entry: 0x0FFFFFFF
- 파일에 할당된 마지막 클러스터
Data Area
데이터 영역에 존재하는 데이터는 디렉터리 엔트리와 실제 파일이 있다. 디렉터리 엔트리에는 파일의 이름, 확장자, 속성, 파일 저장 시작 클러스터 위치, 파일 크기, 파일 시간 정보가 있다.
디렉터리 엔트리의 크기는 32byte이며 아래 그림은 디렉터리 엔트리의 구조이다.
Root Directory는 FAT 파일 시스템에서 최상위 디렉터리를 의미한다.
이 위치는 기본적으로 FAT Area가 끝난 바로 다음에 위치한다. 또한 Reserved Area에서도 구할 수 있다. 이전에 구한 값에 따르면 2번 FAT Entry에 위치한다.
따라서 FAT #1의 시작 위치에 각 #1과 #2의 크기를 더하여 계산할 수 있다.
8,238 + 8,169 + 8,169 = 24576
해당 위치로 이동하자.
각 파일별로 값들을 해석해 보자.
- File Name: TEST1
- Extension: TXT
- Attributes: 0x20
- 0x01: Read Only
- 0x02 : Hidden File
- 0x04: System File
- 0x08: Volume label
- 0x0F: Long File Name
- 0x10: Directory
- 0x20: Archive
- File Status: 0xE5
- 0xE5: 삭제된 Entry
- 0x00: 사용되지 않는 Entry
- File Name: EST2
- ★ 파일 이름의 첫 바이트가 0xE5로 변경되었기 때문에 파일 이름은 ?EST2로 보일 것이다.
- Extension: TXT
- Attributes: 0x20
'Project > FAT Parser' 카테고리의 다른 글
FAT32 분석 - 2 (0) | 2025.05.20 |
---|