FAT 개념과 분석 - 내용범주
9.3 내용 범주
- 내용범주는 파일이나 디렉토리 내용을 구성하는 데이터를 포함한다. '클러스터'는 FAT에서 사용하는 데이터유닛이고 연속적인 섹터의 그룹이다. 그리고 섹터의 개수는 2^n꼴이다.
마이크로소프트 명세를 보면 클러스터의 최대크기는 32KB이다. 각 클러스터는 주소를 가지고 있고 첫 클러스터의 주소는 2이다. -> 클러스터는 0과 1을 가지는 주소는 없다.
- 앞에서 배운 3개의 영역중에 클러스터는 모두 마지막 영역인 '데이터 영역'에 할당한다.
▷ 첫 번째 클러스터 찾기
- 첫 클러스터의 위치가 2이기 때문에 찾기가 어렵다. 클러스터는 데이터영역에만 존재하고 예약된 영역과 FAT영역은 클러스터 주소를 사용하지 않는다. -> 논리적 볼륨 주소 사용
- FAT12/16과 FAT32는 클러스터2의 섹터주소를 찾는 절차가 다르다.
FAT32에서는 데이터영역의 첫 섹터가 클러스터2이다.
FAT12/16의 데이터 영역의 첫 섹터는 고정된 크기의 루트디렉토리이다. 따라서 이 루트 디렉토리 엔트리 수는 부트섹터에서 정하고 클러스터2는 이 루트디렉토리 뒤에서 시작한다.
(뒤에서 직접 하나하나 찾는 과정을 해보자)
▷ 클러스터와 섹터주소
- 클러스터 주소는 '데이터 영역'에서 사용한다. 따라서 '예약된 영역'과 'FAT영역'에서는 다른 주소 체계를 사용하거나 일반적인 가장 낮은 수준의 섹터 주소체계(논리적 볼륨주소)를 사용한다.
- TSK를 포함한 많은 도구에서 보통 한가지의 주소체계를 이용해서 사용자에게 보여준다. 그렇기 때문에 데이터영역에서만 사용하는 클러스터주소로 통일할 수는 없다. 따라서 한가지로 관통하는 주소체계로 바꿔주어야 한다. 따라서 클러스터주소를 논리적 볼륨주소와 같은 주소로 변환해줘야 한다. 이때 우리는 클러스터의 섹터주소와 클러스터 당 몇개의 섹터로 이루어져 있는지 알아야한다.
클러스터 C의 섹터주소를 계산하는 기본 알고리즘은 다음과 같다.
(C - 2) * (size of sector per cluster) + (sector of cluster 2)
이를 역으로 섹터 S를 클러스터로 변환해보자
((S - sector of cluster 2) / (Number of sectors per cluster)) + 2
▷ 클러스터 할당상태
- 클러스터 할당상태는 FAT 구조체를 통해 확인할 수 있다. 보통 2개의 FAT 복사본이있고 하나는 파일시스템의 예약된 영역이후에 시작한다.
- FAT는 클러스터마다 하나의 엔트리를 갖는다.
예를 들어 엔트리 481은 클러스터 481에 대응된다. 각 테이블 엔트리는 유일한 번호이고 최댓값이 FAT 버전마다 다르다. FAT12 - 12비트, FAT16 - 16비트, FAT32 - 32비트의 엔트리 크기를 갖는다.
- 테이블 엔트리가 0이면 클러스터가 할당되지 않은 것이고, 엔트리가 FAT12/16에서 0xff7, FAT32에서 0x0fff fff7 이면 클러스터가 손상되었다는 의미이다. 따라서 할당하지 않는다. 이 값들의 의미는 뒤에 '메타데이터 범주' 절에서 설명한다.
▶ 할당 알고리즘
- 윈도우 98, XP에서는 클러스터 할당 알고리즘으로 '다음 적용'을 사용했다. (윈10은 직접 해봐야겠다.)
- 할당 가능한 비 할당 클러스트를 찾기위해서 운영체제는 0값을 가지는 엔트리를 확인한다. FAT32 파일시스템은 예약된 영역의 FSINFO 구조체를 이용해서 다음에 이용가능한 클러스터를 구분한다.
따라서 클러스터를 비할당하고 싶으면 엔트리 값을 0으로 바꾸면 된다.
▶ 분석 기술
- 특정 유닛을 찾고 그 할당상태를 결정해서 그 내용으로 어떤 것을 수행하는 것이다. 데이터영역 전에있는 영역 위치는 섹터주소를 가지고 찾고, 데이터 영역 내의 위치는 클러스터주소와 섹터주소 중 하나를 이용할 수 있다.
- 만약 모든 비할당 클러스터의 내용들을 추출하기를 원한다면 FAT를 읽어서 테이블 값에 0을 가지는 각 클러스터를 추출하면된다.
▶ 분석 고려사항들
- FAT 파일시스템을 사용하는 많은 디스크들이 하드웨어 수준에서 불량섹터를 처리하고 운영체제는 그것들을 확인하지 않는다. 따라서 불량클러스트를 따로 조사해줘야한다.
- 데이터영역 끝에 클러스터 일부가 아닌 남는 섹터들이 있을 수 있기 때문에 클러스터 크기의 배수가 아니며 이런 곳에 데이터를 숨기거나, 이전 파일 시스템의 데이터를 포함할 수 있다.
- 앞에서 설명한 비사용 섹터가 있는지 확인하는 방법은 전체 섹터수에서 클러스터2의 섹터 주소를 빼고 클러스터들을 섹터수로 나눈다. 만약 나머지수가 있다면 그 크기만큼 비사용 섹터가 있다는 것이다.
(전체 섹터수 - 클러스터2의 섹터주소) / (클러스터의 섹터수)
- 또 데이터를 숨길 수 있는 곳은 주 FAT 구조체 마지막 엔트리와 백업본 시작 사이, 그리고 백업 FAT 마지막 엔트리와 데이터 영역시작 사이가 있다. 이러한 데이터를 숨길 수 있는 비사용 공간 크기를 계산하기 위해서는, 부트섹터에서 주어지는 각 FAT 크기와 파일 클러스터 수에 필요한 크기를 비교할 필요가 있다.
- ★ FAT32의 엔트리는 4바이트(위에서 32비트)여서 1섹터에 128개의 엔트리가 있다. 따라서 섹터수 * 128 = 엔트리의 개수가 된다. 예를들어 797개의 할당된 섹터를 사용하는 FAT가 있다고 하자. 797*128=102,016 개의 엔트리가 된고 이는 64바이트중에 14개의 엔트리를 뺀 값과 같다. 즉 64바이트를 할당하고 사용하지 않은 14개의 엔트리가 있다는 의미이다. 이곳에 데이터를 숨길 수 있다.
- 볼륨의 모든 섹터를 클러스터 주소로 할당하지 않는다. 따라서 논리적 볼륨검사와 논리적 파일시스템 검사의 결과는 다르다. 이는 사용하는 도구가 부트섹터와 FAT영역을 검사하는지 테스트를 해야한다. -> 'FAT' 구문을 검사해서 부트섹터를 찾을 수 있는지를 확인해야 한다. (오호 부트섹터에 'FAT'구문이 있나보다)
▶ 분석 시나리오
- 예를 들어 조사관이 FAT16 파일시스템을 조사해야하고 클러스터 812의 첫 섹터를 확인해야한다고 하자. 그러나 수사관이 갖춘것은 헥사편집기 뿐이다.
- 여기서 처음으로는 섹터0 즉, 부트섹터를 찾아야 한다. 이후 6개의 예약된 영역을 지나 2개의 FAT를 확인할 수 있다. 각 FAT에는 249 섹터가 있고, 각 클러스터는 32섹터이고 루트 디렉토리에는 512개의 엔트리가 있다.
- 계산을 해보면
0 ~ 5 : 예약된 영역
6 ~ 254 : FAT 1
255 ~ 503 : FAT 2
504 ~ 535 : 루트디렉토리 -> 512바이트가 1섹터인데 각 엔트리는 32바이트 이므로 총 32개의 섹터가 된다.
그래서 클러스터 812의 위치를 찾을 수 있다.
(루트 디렉토리도 데이터 영역에 있다. 따라서 엔트리 하나는 클러스터 하나의 크기로 봐야한다.)
p.s 오늘은 적었지만 내일은 할 것들이 많다.