Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

Piki's Play

Chapter 9. FAT 개념과 분석 본문

포렌식/파일시스템 (파일시스템 포렌식분석)

Chapter 9. FAT 개념과 분석

Pikigod 2020. 2. 17. 15:46

-> FAT(File Allocation Table) 파일시스템은 일반 운영체제에서 볼 수 있는 가장 간단한 파일시스템 중 하나이다. FAT는 모든 윈도우와 대부분 유닉스 운영체제에서 지원한다. 여기서는 앞에서의 5가지 범주를 이룡해서 FAT 전체 개념과 분석기술을 알아보자. 

 

 

9.1 소개 

-> FAT는 데이터 구조체 타입수가 적기 때문에 간단한 파일시스템이다. FAT에는 다양한 기능을 제공하는 두 개의 중요한 데이터 구조체가 있는데 (FAT와 디렉토리 엔트리), 이 두가지 분류모델에서 여러 범주에 속한다. 이러한 데이터 구조체를 한 절에서 설명하고 나머지는 다른 절에서 설명한다. 

- 분류모델을 이용해 FAT 파일시스템을 설명하는 것은 더 개선된 파일시스템, 그리고 분류모델로 확실히 구분되는 파일 시스템들과 비교하기 쉽기 때문에 중요하다. FAT 파일시스템은 응용프로그램 범주로 구분되는 어떠한 데이터도 포함하지 않는다. 

- FAT 파일시스템의 기본 개념은 파일과 디렉토리를 데이터 구조체에 할당하는 것이고 이를 '디렉토리 엔트리'라고 부른다. -> 얘는 '파일명', '크기', '파일 내용 시작주소', '다른 메타데이터'를 포함한다. 

- 파일과 디렉토리 내용을 '클러스터(Cluster)'라고 부르는 데이터 유닛에 저장한다. 

- 한개의 파일이나 디렉토리에 한 개 이상의 클러스터를 할당했다면 FAT라고 부르는 구조체를 이용해서 다른 클러스터들을 찾을 수 있다. 따라서 FAT 구조체는 파일 다음 클러스터의 위치와 클러스터의 할당 상태를 식별하기 위해 사용된다. 그래서 내용과 메타데이터 범주 모두가 해당 구조체에 포함될 수 있다. 

- FAT는 FAT12, FAT16, FAT32 등 3개의 다른 버전이 있다. 주요 차이점은 FAT 구조체의 엔트리 크기이다.

 

<파일시스템의 동작 과정>

-> 각각의 파일이나 디렉토리가 구조체에 할당되고 이것들은 또 클러스터에 저장된다. 그러면 FAT구조체를 이용해서 클러스트를 찾을 수 있다.

 

 

<FAT 시스템의 물리적인 레이아웃>

-> FAT 파일시스템은 3개의 물리적인 구역을 갖는다. 

첫 번째 영역은 '예약된 영역'으로서 파일시스템의 범주데이터를 포함한다. FAT12와 FAT16에서 이 영역의 크기는 전형적으로 1섹터이지만, 부트섹터에서 그 크기를 정한다.

두 번째 영역은 'FAT 영역'이고 이는 주 FAT영역, 부 FAT영역, 백업 FAT영역을 포함한다. 

세 번째 영역은 '데이터 영역'으로서 파일과 디렉토리 내용을 저장하는 클러스터를 포함한다.

 


9.2 파일시스템 범주

- 파일시스템 범주 데이터는 파일 시스템을 전체적으로 설명하고 이 데이터들은 다른 데이터 구조체를 찾는데 사용한다. 이 절에서는 FAT가 데이터를 어디에 저장하는지, 그 데이터를 어떻게 분석하는지 전체적인 개념을 설명한다.

 

▷ 전체적인 개념

- FAT 파일 시스템에서 파일 시스템 범주를 부트섹터 데이터 구조체에서 볼 수 있다. 부트섹터볼륨의 첫 번째 섹터(예약된 영역)에 위치하고 파일시스템에서 예약된 영역이다. 마이크로소프트에서는 BPB(BIOS Parameter Block)에 속한 첫 번째 섹터에서 데이터 일부를 참조하지만 이 책에서는 '부트 섹터'라는 용어를 사용한다. 

- 부트섹터는 모든 범주에 속하는 데이터를 포함한다. 부트섹터에는 FAT12, FAT16, FAT32를 구분하는 식별자가 없다. 하지만 연산을 통해 구분은 가능하다. 

- FAT32 파일시스템에 추가 데이터가 있다. (백업본 섹터주소, 주*부 버전번호), 원본손상시 섹터0에 백업본을 이용하자. 또한 기본 부트섹터에서 손상을 자동으로 검사하기 위해서는 섹터6에 있는 백업본을 이용한다. (여기서 알수 있듯이 FAT32 파일시스템은 1섹터크기의 예약된 영역을 사용하지 않는다)

- FAT32에는 다음에 이용가능한 클러스터와 할당가능한 클러스터의 총량에 대한 정보를 FSINFO 데이터 구조체에 저장한다.  (상대적 위치로 섹터 1, 백업본은 섹터 7에 존재. 얘는 정보만 알려줄 뿐 검증하는 과정은 없다.)

 

 

▷ 필수 부트섹터 데이터

- FAT 파일시스템 분석시 3개의 물리적인 레이아웃 영역위치를 알아야한다. 예약된 영역은 섹터 0에서 시작하고 그 크기는 부트섹터가 정한다. FAT12,16에서 예약된 영역은 1섹터 크기지만 FAT32에서는 더 많은 섹터를 가진다. 

- FAT영역은 1개 또는 그 이상의 FAT 구조체를 포함하고 예약된 영역 바로 뒤부터 시작한다. 이 영역은 'FAT개수xFAT크기'로 계산하고 이 두 값은 부트섹터가 제공한다. 

- 데이터 영역의 레이아웃은 FAT12,16과 FAT32가 다르다. FAT12,16의 데이터 영역은 루트 디렉토리 다음에 존재한다. 또한 고정된 크기의 루트디렉토리를 가지고있다. 

반면에 FAT32는 루트디렉토리가 어디든지 위치할 수 있고 동적 크기를 가진다. 

두 버전의 차이점

 

▷ 부가 부트 섹터 데이터

- 레이아웃 정보 이외에 부트섹터는 많은 부가 데이터를 가지고있다. 단지 편리함을 위해 존재하는 데이터도 있기 때문에 부정확 할 수도 있다. 

- FAT 파일시스템들은 마이크로소프트 명세에 다라 현재시간을 이용해서 파일시스템 생성시간을 결정하는 4바이트 볼륨 일렬번호를 가지고 있다. -> 10장에서 설명한다.

- 마지막 식별레이블은 파일시스템을 언제 생성했는지 구분하도록하는 7개 문자로 구성된 볼륨 레이블 스트링이다. 그 볼륨레이블은 루트디렉토리에 저장한다. 

 

 

▷ 부트코드

- FAT 파일시스템 부트코드는 파일시스템 데이터 구조체와 밀접한 관련이 있다. -> 이것은 부트코드를 완전하게 분리하는 유닉스 파일시스템과 다르다.

- 부트 섹터의 첫 3바이트는 CPU에게 부트코드의 나머지 설정데이터로 이동하라는 기계어 코드 점프 명령어이다.

- 부트 섹터는 512바이트인데 FAT12,16은 62에서 509바이트, FAT32는 90에서 509바이트를 사용하지 않는다. -> 여기에 부트코드가 들어있기 때문이다. FAT32는 부트섹터 뒤 섹터를 추가 부트코드를 위해 사용할 수 있다. 

- 여기서 부트코드는 부팅을 담당하지 않아도 존재한다. 부팅을 담당하지 않는 부트코드는 시스템 부팅을 위해 다른 디스크가 필요하다고 알려주는 역할을 한다. 

부트코드의 기능

 

▷ 예제이미지

- 여기서는 FAT32 예제 이미지를 사용하는데 TSK에는 fsstat도구를 이용해 파일시스템 범주의 데이터를 분석한다. 

 

예제)

=> 위의 그림들을 보자. 우선 예약된 영역은 0~37 즉 38섹터를 할당하고 있다. 부트섹터는 0에서 시작하고, FSINFO 데이터 구조체는 1번 섹터에 존재한다. 백업섹터는 6에 존재한다.

여기에는 두개의 FAT 구조체가 존재하는데 그 위치와 크기는 위에서 확인할 수 있다.

 

 

▶ 분석 기술

- 파일시스템 범주 분석의 목적은 더 상세한 분석을 위해 파일시스템 레이아웃과 세부적인 설정들을 결정하는 것이다. 이 과정에서 디스크 포맷 운영체제라던지, 숨겨진 데이터 증거를 발견할 수 있다.

- FAT파일시스템 설정을 파악하기 위해 부트섹터 위치를 파악하고 처리해야 한다. 부트섹터는 파일시스템 첫 섹터에 위치하고 기본 엔트리를 갖기 때문에 다른 구조체들에 비해 간단한 편이다. 

- 부트섹터 정보를 이용해서 예약된 영역, FAT 영역, 데이터 영역 위치를 계산하고, FAT32 FSINFO 데이터 구조체는 최근 활동에 대한 실마리를 제공하고 그 위치는 부트섹터에서 제공한다. (FAT FSINFO 데이터 구조체는 섹터 1에 위치한다.)

 

 

▶ 분석 고려사항들

- 이 범주데이터들은 파일시스템에 구조적인 데이터를 제공하고, 사용자가 제어할 수 있는 약간의 데이터가 있다. 부가데이터인 OEM 레이블과 볼륨 레이블은 파일시스템이 언제 어디서 생성되었는지 실마리를 제공한다. 

- 여기에는 파일시스템에서 사용하지 않는 공간들이 있고 그곳에는 데이터를 숨길 수 있다.

예) 부트섹터 데이터와 마지막 시그니처 사이에 450바이트가 있는데 윈도우는 일반적으로 이 공간에 부트코드를 저장하는데 부팅 파일시스템이 아니면 필요하지 않다. 이곳에 데이터 숨기기 가능

- FAT32 파일시스템은 예약된 공간에 많은 섹터를 할당하는데 실제 백업부트섹터, FSINFO 구조체, 주 부트섹터 등에서 사용하는 공간은 작다. 따라서 이곳에도 데이터를 숨길 수 있다. 운영체제는 일반적으로 파일시스템을 생성할 때 예약된 영역에 섹터들을 영구히 삭제할 수 있다. 

- 파일시스템의 마지막과 볼륨의 마지막 사이의 공간인 볼륨슬랙에도 데이터를 숨길 수 있다.

- FAT32는 섹터6에 백업부트섹터가 있고 주 부트섹터와 비교해서 주 부트 섹터가 손상되었는지 검사한다. 백업본은 원본 데이터를 포함하고 있다.

 

 

▶ 분석 시나리오

- 만약 수사관이 수집하는 동안 디스크 시작 32섹터가 손상되어 디스크를 읽을 수 없었다고 하자. 이때 파티션 테이블이 없는 상황에서 어떻게 파일시스템을 찾아야 할까?

- 이 경우 FAT 파일시스템을 찾기 위해 부트섹터의 마지막 두 바이트 0x55m 0xAA 시그니처를 이용할 수 있다. 어느정도 오탐이 존재하긴 한다. 만약 디스크가 난수를 포함하면 평균 65,546(216) 섹터마다 이 시그니처를 발견 할 수 있을 것이다. 더큰 시그니처나 다른 데이터로 오탐을 줄일 수 있다.

 

- TSK sigfind 도구를 이용해 16진수 값으로 시그니처를 알아낸다. 발견한 시그니처와 이전에 일치한 내용과의 거리섹터를 출력한다.

 

-> 첫 파티션이 섹터 63에서 시작하고 시그니처가 처음으로 일치한 곳은 섹터 63이다. 여기서 부트섹터 구조체를 적용할 수 있다. FAT32 파일시스템이기 때문에 부트섹터의 크기는 자유롭다. 그런데 여기서 63이 부트섹터임을 확인했고 64는 FSINFO 데이터 구조체임을 알 수 있다. 또한 69는 백업 부트섹임을 알 수 있고, 70은 백업 FSINFO 임을 알 수 있다. 책에서는 안나왔지만 부트섹터를 확인하면 20,428,874 섹터까지 FAT 파일시스템임을 확인 할 수 있다. 

 

이런식으로 부트섹터 위치를 찾고 레이아웃을 수동으로 알아낼 수 있다. 

 

 


p.s 여러번 봐야 이해가 된다. 디스크에 FAT파일시스템이 한 개만 존재하는 것이 아니라 여러개가 존재할 수도 있다. 따라서 구조를 그림으로 그리면서 다시 봐야겠다!