FAT16에 대해 알아봤으니, 이제 마지막으로 FAT32 파일시스템에 대해 알아보고 NTFS로 넘어가야겠다.
(exFAT도 있지만.. 이건 추후에 다룰게요.)
FAT32은 FAT12, FAT16 과 구조가 좀 다르다. (뭐 사실 달라봐야 거기서 거기이긴 함;;) FAT32 내용을 작성하면서 FAT16과 동일한 부분은 간단하게 언급하고.. 그 외 부분에 대해 상세히 기술하겠습니당~ 아 그리고 FAT16 구조분석 포스팅 2개를 다 보고 왔다는 가정하에 작성할 것이니 안보셨음 보고 오셈
먼저 전체적인 구조를 그림으로 살펴보자.
1. FAT32 전체 구조
FAT16과 비교하면, 비슷한 듯 다른 구조를 지니고 있다. 가장 두드러진 차이를 보이는 영역은 예약된 영역인데, 기존에 CPU Jump ~ Signature 까지가 예약된 영역이었다면, FAT32는 추가로 FSINFO, 추가적인 예약된 영역이 존재한다. 그리고 BPB도 구조가 좀 다르다.
글로만 설명하는 것보다 직접 그림을 보며 확인하는 것이 더 이해가 잘 될 것 같다. 바로 디테일하게 들어가자.
2. Reserved Area (예약된 영역 = VBR) - 1 Sector
FAT12, FAT16은 예약된 영역의 크기가 1 sector 였다. (물론, 예약된 영역이 끝난 후 FAT영역이 나올 때 까지 더 많은 영역이 할당되어 있지만)
FAT32는 파일시스템에 필요한 플래그 값들이 좀 더 추가되어 32 Sector만큼의 크기를 사용한다. 추가된 영역에는 FSINFO(FileSystem Information)과 추가적인 예약된 영역이 있다.
예약된 영역(= 부트섹터)은 보통 6번째 Sector에 백업본이 있다.
2.1. CPU Jump Command (0x0000 - 0x0002, 3 byte)
CPU명령 실횅 분기를 부트코드로 옮기는 명령이다. FAT12/16은 [EB 3C 90], FAT32는 [EB 58 90], NTFS는 [EB 52 90] 등 형태가 다양하다.
중간에 위치한 값이 Jump할 부트코드의 Offset 주소이다. FAT16 포스트에서는 [EB 3C 90]으로 확인되었지만 아래 캡쳐그림을 보면 [EB 58 90]이 세팅돼 있음
2.2. BPB = BIOS Parameter Block (0x0003 - 0x0059, 87 byte)
FAT16에서는 BPB 크기가 59 byte 였는데, FAT32에서는 87 byte로 늘어났다. 늘어난 만큼 Boot code & Error message 영역이 줄어들었음
첫 부분부터 'Total sector 32'가 위치한 0x0023 offset 까지는 동일한 구조이지만, 그 이후부터 FAT32는 추가적으로 속성 필드를 갖고 있다.
아래 표들을 보고 BPB의 구성이 어떻게 돼있는지 알아본다.
Address range | size | Field Name | Description |
0x0003 – 0x000A | 8 byte | OEM ID | OEM(Original Equipment Manufacturer) 식별자. 이 영역을 참조하는 작업은 없음, 단지 OEM을 나타내는 부분 |
0x000B – 0x000C | 2 byte | Bytes per sector | 한 섹터 당 할당되는 byte 크기 |
0x000D – 0x000D | 1 byte | Sectors per cluster | 한 클러스터 당 할당되는 섹터 수 |
0x000E – 0x000F | 2 byte | Reserved sector count | FAT Area가 나오기 전에 예약된 영역의 섹터 수 |
0x0010 – 0x0010 | 1 byte | Number of FAT | FAT Area의 개수, 통상 #1, #2로 두개 있음 |
0x0011 – 0x0012 | 2 byte | Root directory entry count | FAT12 / FAT16의 할당된 루트 디렉토리 엔트리 개수 (FAT32는 0으로 세팅) |
0x0013 – 0x0014 | 2 byte | Total sector 16 | 볼륨 상에 있는 총 섹터수 |
0x0015 – 0x0015 | 1 byte | Media Type | 볼륨에 어떤 미디어가 저장되어 있는지 나타냄. (플로피디스크를 제외하고 모두 0xF8) |
0x0016 – 0x0017 | 2 byte | FAT size 16 | FAT Area의 섹터 수를 나타냄.(FAT32에는 쓰이지 않음) |
0x0018 – 0x0019 | 2 byte | Sector per track | 트랙 당 섹터 수 |
0x001A – 0x001B | 2 byte | Number of heads | 헤더 수 |
0x001C – 0x001F | 4 byte | Hidden sectors | 볼륨 앞에 숨겨진 섹터 수 |
0x0020 – 0x0023 | 4 byte | Total sector32 | 볼륨 상에 있는 총 섹터수 (Total sector 16에서 표현이 불가능하면 이 필드를 쓰는듯..) |
이 부분까지는 FAT16과 동일한 구조이다. 아래 0x0024 부터 나오는 BPB 필드들은 FAT32에만 존재하는 것들이다.
Address range | Size | Field Name | Description |
0x0024 – 0x0027 | 4 byte | FAT Size 32 | FAT영역 하나의 할당된 크기 |
0x0028 - 0x0029 | 2 byte | Ext flags | FAT영역을 여러 개 사용할 경우를 위한 설정값 |
0x002A - 0x002B | 2 byte | FileSystem Version | 파일시스템의 버전 |
0x002C - 0x002F | 4 byte | Root Directory Cluster | 루트디렉토리가 위치한 클러스터 값 |
0x0030 - 0x0031 | 2 byte | FileSystem Information | FSINOF 구조체가 저장된 섹터 위치값 |
0x0032 - 0x0033 | 2 byte | Backup Boot Record | 백업된 부트섹터의 섹터 위치값 (보통 0x06) |
0x0034 - 0x003F | 12 byte | Reserved | 사용안함 |
0x0040 - 0x0040 | 1 byte | Drive Number | x86 계열에서 사용하는 INT 0x13 사용시 필요한 필드 (Floppy=0x00, Hard Drvie=0x80) |
0x0041 - 0x0041 | 1 byte | Reserved | 사용안함 |
0x0042 - 0x0042 | 1 byte | Boot signature | 확장부트 서명 |
0x0043 - 0x0046 | 4 byte | Volume Serial Number | 해당 볼륨의 고유 시리얼 번호가 기록됨 |
0x0047 - 0x0051 | 11 byte | Volume Label | 해당 볼륨 레이블 |
0x0052 - 0x0059 | 8 byte | FileSystem Type | 파일시스템 형식 |
여기까지가 FAT32의 BPB 필드 내용이다. 그 이후에는 FAT16과 마찬가지로 부트코드 및 에러메세지, 시그니쳐가 포함된다.
2.3. Boot code & Error messages / Signature (0x005A - 0x01FF, 422 byte)
Address range | size | Field Name | Description |
0x005A – 0x01FD | 420 byte | Boot code Error massage | 부트코드 에러 메세지 |
0x01FE – 0x01FF | 2 byte | Signature | 서명 0x55 0xAA |
3. FSINFO = File System Information (1 Sector)
FSINFO 구조체는 보통 맨 처음 나오는 부트섹터 바로 다음에 위치한다. FAT32에서 처음 등장하는 구조체로, 전체적인 클러스터의 여유 공간 관리에 대한 내용이 담겨있다. FAT16에서는 사용 가능한 클러스터 공간을 FAT Entry를 통해 하나씩 탐색해야 했다면, FAT32는 이 FSINFO 구조체의 필드들을 확인하여 빠르게 탐색이 가능하다는 장점이 있다.
FSINFO 영역은 7번째 Sector에 백업본이 있다.
FSINFO 구조체를 보면 좀 특이하다. 1 Sector를 쓰면서 대부분이 사용되지 않는 영역이다. 아래 표를 참고하여 세부내용을 알아보자.
Address range | Size | Field Name | Description |
0x0000 – 0x0003 | 4 byte | Signature | 고정된 시그니쳐값 (0x41615252) |
0x0004 - 0x01E3 | 480 byte | not used | not used |
0x01E4 - 0x01E7 | 4 byte | Signature | 고정된 시그니쳐값 (0x61417272) |
0x01E8 - 0x01EB | 4 byte | Number of free Clusters | 사용 가능한 클러스터 수 |
0x01EC - 0x01EF | 4 byte | Next free Cluster | 사용 가능한 클러스터 시작 위치 |
0x01F0 - 0x01FD | 14 byte | not used | not used |
0x01FE - 0x01FF | 2 byte | Signature | 고정된 시그니쳐값 (0x55 0xAA) |
위 표를 토대로 예제 캡쳐 화면을 확인하면, 여유 클러스터는 0x0001ECE0 = 126,176개이다. 클러스터 당 할당 용량이 4096 byte 니까, 계산하면 총 492MB가 사용가능한 상태가 된다. 실제로 확인해봐도 동일한 결과가 나온다.
그 다음, 사용가능한 첫 클러스터의 주소가 0x00000022 로 나타난다. 이 것은 클러스터 넘버를 의미한다. 22번째 클러스터부터 사용가능하다는 의미,
해당 테스트용 디스크에 txt파일을 1byte 기록 후 저장하고 다시 Next free Cluster를 확인하니 0x00000023으로 확인됨
4. More Reserved Area(추가적인 예약된 영역) - 크기 유동적
추가적인 예약된 영역은 이름 그대로 예약된 영역이 모자라는 경우에 쓰라고 할당해 놓은 것이다. 이 추가적인 예약된 영역의 맨 처음 1 Sector는 부트섹터의 부트코드 영역이 부족할 경우를 대비하여 할당(부트코드 추가 할당 <- 이라고 쓰겠음) 된 것인데, 8번째 Sector에 백업본이 있다.
그 뒤에는 만약을 대비하여 할당된 영역들이다. 예제 디스크 캡쳐를 보면 "Reserved Sector count"가 0x184A(=6218) 인데, 할당된 영역이 무려 6218 Sectors나 된다. 기본적으로 사용하는 "예약된 영역 + FSINFO + 부트코드 추가할당" *2(각각의 백업본) 총 6 Sectors를 제외하면 모두 만약을 대비하여 할당된 영역이라는 뜻이다.
5. FAT(File Allocation Table) Area - 크기 유동적
FAT32에서도 마찬가지로 FAT영역을 찾기 위해선 "Reserved Sector count" 필드를 확인한다. 금방 추가적인 예약된 영역에서 보았듯이, 0x184A(=6218)로 세팅 돼있으므로 시작지점에서 6218섹터 만큼 이동하면 FAT영역이 등장한다. (FAT16에서 FAT 영역 위치가 6 Sector 였던 것에 비해 엄청 멀리 있음;)
FAT16에서는 FAT영역의 크기를 "FAT Size 16"이라는 BPB 필드에서 확인했지만, FAT32에서는 새롭게 추가된 "FAT Size 32"의 값을 보고 확인한다.
FAT32에선 "FAT Size 16" 필드가 쓰이지 않으므로 '0x0000' 으로 세팅돼 있다. 해당 필드로 표현할 수 있는 주소가 16 bit 뿐이라서 새로 필드를 추가한듯..
파일시스템 숫자가 16 -> 32 로 늘어난 만큼, FAT Entry(클러스터 할당정보를 나타내는 테이블)의 크기도 2배로 늘어났다.
FAT12는 12 bit, FAT16는 16 bit, FAT32는 32 bit이다.
FAT32 에서도 이전 버전과 마찬가지로 FAT Entry 첫번째, 두번째는 특별한 내용이 포함된다. 최초 4 byte에는 Media type, 그 다음 4 byte에는 Partition state 값이 설정돼있다. 실제 데이터 영역의 클러스터들에 대한 FAT Entry는 3번째 Entry부터 시작한다고 보면 된다. 각 엔트리들에 할당된 값들이 뜻하는 내용은 아래 표를 참고하면 될 것 같다.
6. Data Area (데이터 영역)
내용이 FAT16과 동일하여.. 똑같은 내용을 굳이 복붙할 필요가 없다고 느껴 설명은 넘어간다. (http://s2kiess.blog.me/221158543853 참고)
차이점 한 가지만 설명하겠다. 먼저, FAT16에서의 루트 디렉토리는 위치가 반드시 FAT 영역 바로 뒤에 와야했다. 하지만 FAT32에서는 루트 디렉토리의 위치를 바꿀 수도 있다. (바꿀 수 있긴하지만 보통 FAT영역 바로 뒤에 온다.) 그 위치는 BPB 필드 중 "Root Directory Cluster"를 확인하면 된다.
참고 URL
http://forensic-proof.com/archives/372
https://m.blog.naver.com/PostView.nhn?blogId=bitnang&logNo=70184195032&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F
https://en.wikipedia.org/wiki/Design_of_the_FAT_file_system
http://hyd3.tistory.com/125
http://forensic.korea.ac.kr/DFWIKI/index.php/%EA%B5%AC%EC%A1%B0%EB%B6%84%EC%84%9D/FAT
http://www.tavi.co.uk/phobos/fat.html
참고 자료
(FP) FAT12,16,32 FileSystem.pdf - 제작자 : JK Kim
참고 도서
<START UP 디스크 포렌식> - 저자 : 이별
<파일시스템 포렌식 분석> - 저자 : 브라이언 캐리어
'IT 그리고 정보보안 > Knowledge base' 카테고리의 다른 글
윈도우 UserAssist를 통한 파일실행 흔적 분석 (0) | 2021.04.10 |
---|---|
NTFS (New Technology File System) (0) | 2021.04.10 |
FAT (File Allocation Table) 16 (0) | 2021.04.10 |
파일시스템(File System) 이란 무엇인가 (0) | 2021.04.10 |
VBR (Volume Boot Record) (0) | 2021.04.10 |