FAT32
파일 시스템
: 디지털 데이터 효과적으로 기록하기 위해 파일 체계적으로 기록하는 방식
- 저장매체의 종류, 운영체제 목적에따라 고유한 파일 시스템 사용함
파일시스템 구조
메타영역 : 파일 저장 관리하기 위해 필요한 것. 파일이름, 위치, 크기, 시간, 정보 등이 기록됨. 시스템 중심으로 자동 생성됨.
데이터 영역 : 사용자가 작성한 내용이 저장됨.
주소지정 방식(Addressing)
CHS(Cylinder-Head-Sector) 방식
- 실린더(Cylinder), 헤드(Head), 섹터(Sector)
- 디스크의 물리적인 구조에 기반한 주소지정 방식
- 8.1GB까지만 주소 지정 가능. 대용량 디스크 지원X
LBA(Logical Block Address) 방식
- 디스크 0번 실린더, 0번 헤드, 1번 섹터를 0번으로 해 디스크의 마지막 섹터까지 순차적으로 주소 저장
- 물리적 구조에 대한 정보 없이도 접근하고자 하는 섹터 번호만으로 접근 가능
클러스터(Cluster)
섹터
- 하드 디스크의 물리적인 최소 단위(512 바이트)
- 하드 디스크의 읽기 쓰기 작업 단위
클러스터
- 1섹터 크기로 입, 출력 한 경우 큰 파일은 많은 시간이 요구됨
- 여러 개의 섹터를 묶어 한꺼번에 데이터를 입, 출력 함 = 클러스터(단위)
- 하나의 파일을 입, 출력할 때 할당되는 크기는 클러스터의 배수
ex) 4MB 파일 저장하는 경우
- 클러스터 크기 4KB => 1,024번 입출력 명령 수행
- 클러스터 크기 512Byte => 8,192번 입출력 명령 수행
클러스터 크기
: 임의로 지정 가능, 볼륨 크기에 따라 미리 정의된 크기 선택
볼륨 크기 | 클러스터 크기 |
32MB - 8GB | 4KB |
8GB - 16GB | 8KB |
16GB - 32GB | 16KB |
32GB | 32KB |
슬랙 공간
: 물리적인 구조와 논리적인 구조 차이로 발생하는 낭비 공간. 디지털 포렌식 관점에서 중요한 부분(정보 은닉에 사용될 수 있고 삭제된 파일 파편이 있을 수도 있기 때문에)
- 파일 슬랙 : 한 파일 사이즈가 클러스터 크기보다 크거나 작으면 남는 공간(슬랙)이 발생함.
- 램 슬랙 : CPU의 주기억장치 RAM이 보조기억 장치에 들어오는데 RAM과 파일 사이즈의 단위가 일치하지 않아 생기는 비어있는 공간
Mater Boot Record
BR(Boot Record)
- 파티션의 크기, 위치, 설치된 운영체제 등의 정보를 담고 있는 영역
- 윈도우즈 운영체제의 경우 파티션의 첫 번째 섹터에 BR이 위치함
MBR(Master Boot Record)
- BR 영역을 관리하는 영역으로 부팅에서 BR 영역을 찾아갈 수 있는 정보 저장
MBR 데이터 구조
바이트 Offset | 설명 | |
10진수 | 16진수 | |
0 - 445 | 0x0000 - 0x01BD | Boot Code |
446 - 461 | 0x01BE - 0x01CD | Partition table entry #1 |
462 - 477 | 0x01CE - 0x01DD | Partition table entry #2 |
478 - 493 | 0x01DE - 0x01ED | Partition table entry #3 |
494 - 509 | 0x01EE - 0x01FD | Partition table entry #4 |
510 - 511 | 0x01FE - 0x01FF | Signature (0x55AA) |
파티션 테이블
64 바이트로 각각 16바이트씩 총 4개의 파티션 정보를 저장함
파티션 테이블 구조
바이트 Offset | 설명 | 비고 | |
10진수 | 16진수 | ||
0 - 0 | 0x0000 - 0x0000 | Boot Flag | 부팅가능 - 0x80, 부팅X - 0x00 |
1 - 3 | 0x0001 - 0x0003 | CHS 주소 방식의 시작 위치 | |
4 - 4 | 0x0004 - 0x0004 | 파티션 유형 | NTFS - 0x07, FAT16 - 0x06, FAT32 - 0x0C Solaris - 0x85 |
5 - 7 | 0x0005 - 0x0007 | CHS 주소 방식의 끝 위치 | |
8 - 11 | 0x0008 - 0x000B | LBA 주소 방식의 시작 위치 | 파일 시스템의 BR 위치의 섹터 |
12 - 15 | 0x000C - 0x000F | 총 섹터 개수 |
MBR 영역의 일반 구조
Boot Code
- 파티션 테이블에서 부팅 가능한 파티션 찾아 해당 파티션 부트 섹터를 호출하는 코드
Partition Table #1
00 03 39 00 0B 1F FF DF F5 00 00 00 0B 83 1E 00 |
00 | 부팅 불가능한 파티션 |
F5 00 00 00 | BR 위치 섹터 번호, little endian으로 저장된 형식이므로 0x00 00 00 F5(245) 로 계산되어야 함 |
0B 83 1E 00 | 총 섹터 개수, little endian으로 저장된 형식이므로 0x00 1E 83 0B(1,999,627) 로 계산되어야 함 |
확장 파티션(Extended Partition)
- 파티션 4개를 초과하는 경우 기존 MBR에서 관리되지 않아 나온 개념
- MBR 파티션 테이블 마지막 4번째 파티션 테이블이 가리키는 위치가 또 다른 MBR 영역 가리켜 추가적으로 4개의 파티션 담을 수 있도록 하는 구조
- 확장 파티션은 파티션 개수에 제한이 없음
FAT 영역
: 파일 시스템에서 파일의 위치 정보를 기록하는 테이블
FAT 파일 시스템
- 파일 시스템 가리키는 용어
- FAT12 / 16 / 32
- FAT 뒤의 숫자는 파일 시스템에서 관리하는 클러스터의 개수를 의미함
FAT 파일 시스템의 클러스터 최대 개수
파일 시스템 | 클러스터 최대 개수 |
FAT12 | 4,084 |
FAT16 | 65,524 |
FAT32 | 67,092,481 |
FAT 파일 시스템 구조
예약 영역
: FAT 파일 시스템에서 가장 앞에 위치하는 구조
- FAT 12/16 : 1개의 섹터
- FAT 32
- BIOS Parameter Block의 오프셋 14~15의 Reserved Sector Counter에 표시됨
- 일반적으로 32개의 섹터
예약된 섹터 : 0, 1, 2, 6, 7, 8번
예약된 섹터 | 내용 |
0 | 부트 섹터 |
1 | FSINFO(File System Information) |
2 | 부트 섹터와 부트 코드 영역이 부족할 경우 추가적으로 사용 |
6 | 0번 섹터 백업용 |
7 | 1번 섹터 백업용 |
8 | 2번 섹터 백업용 |
FAT12 / 16 / 32 부트 섹터 - 공통된 데이터 구조
바이트 Offset | 설명 | |
10진수 | 16진수 | |
0 - 2 | 0x0000 - 0x0002 | Jump Command To Boot Code |
3 - 10 | 0x0003 - 0x000A | OEM ID |
11 - 12 | 0x000B - 0x000C | Byte Per Sector |
13 - 13 | 0x000D - 0x000D | Sectors Per Cluster |
14 - 15 | 0x000E - 0x000F | Reserved Sector Count(FAT12/15 = 1) |
16 - 16 | 0x0010 - 0x0010 | Number of FAT Tables |
17 - 18 | 0x0011 - 0x0012 | Root Directory Entry Count (FAT12/16 = variable, FAT32 = 0) |
19 - 20 | 0x0013 - 0x0014 | Total Sector 16 |
21 - 21 | 0x0015 - 0x0015 | Media Type |
22 - 23 | 0x0016 - 0x0017 | FAT Size 16 |
24 - 25 | 0x0018 - 0x0019 | Sector Per Track(Typically 32 for Hard Disks) |
26 - 27 | 0x001A - 0x001B | Number of Heads (Typically 255 for Hard Disks) |
28 - 31 | 0x001C - 0x001F | Hidden Sectors |
32 - 35 | 0x0020 - 0x0023 | Total Sectors 32 |
FAT32 부트 섹터의 추가적인 데이터 구조 |
||
36 - 39 | 0x0024 - 0x0027 | FAT Size 32 |
44 - 47 | 0x002C - 0x002F | Root Directory Cluster Offset (FAT12/16과는 다르게 시작 위치가 데이터 영역 0번섹터가 아니어도 되므로) |
50 - 51 | 0x0032 - 0x0033 | Backup Boot Sector Offset |
FAT 영역
- 두 개의 FAT
- File Allocation Table, FAT1, FAT2 - 복사본
- FAT16/32
- FAT16은 16비트, FAT32는 32비트를 사용해 데이터 영역의 시작 클러스터부터 마지막 클러스터까지 할당 상태를 표시함
FAT Entry
: 데이터 영역의 각 클러스터 사용 여부 및 특정 파일이 점유하고 있는 클러스터 위치 나타냄
상태 | 상태값 |
미할당 상태 | 0x00 |
할당 상태 | 다음 데이터가 있는 클러스터 |
할당 상태 - 마지막 데이터가 있는 경우 | FAT12 - 0xFF8보다 큰 값 FAT16 - 0xFFF8보다 큰 값 FAT32 - 0x0FFF FFF8보다 큰 값 |
배드 섹터 | FAT12 - 0xFF7 FAT16 - 0xFF7 FAT32 - 0x0FFF FFF7 |
루트 디렉터리
FAT12/16 | - FAT 영역 바로 뒤, 데이터 영역의 제일 앞부분에 위치(FAT Entry 2번) - 최대 32개의 섹터를 사용할 수 있음(16,384바이트, 최대 512개의 Entry를 나타낼 수 있음) |
FAT32 | - 데이터 영역 어느 곳에나 올 수 있음(기본값은 FAT Entry 2번) - 부트 섹터의 오프셋 44~47 값 통해 표시 - 루트 디렉터리의 생성할 수 있는 파일 및 디렉터리 개수 제한 없음 |
Directory Entry 구조
파일이 삭제됨 > 첫번째 바이트 값이 0xE5 > 해당 FAT Entry를 0x00으로 초기화 > 미할당된 Directory Entry > 0x00으로 초기화
LFN(Long File Name) Entry 구조
- 8바이트보다 긴 파일이름 표현
- 유니코드로 표현
- FAT32의 경우 파일이름 255자까지 지원
- 여러 개의 LFN Entry로 표현