[FAT] FAT FILE SYSTEM

zeo·2021년 11월 1일
1

FAT FILE SYSTEM

  • FAT는 File allocation Table의 약자로, 이름 그대로 파일의 할당 정보를 표현한 테이블
  • FAT라는 용어는, MS-DOS때부터 쓰여 왔는데, Windows로 넘어가면서 파일시스템 자체를 가리키는 용어가 됨
  • FAT 파일 시스템은 구조가 간단하다는 장점 때문에 일반 시스템 외에도 메모리카드, USB 등 널리 사용됨
  • 주로 작은 용량의 스토리지에 사용되는 파일시스템
  • FAT 파일 시스템은 FAT12, FAT16, FAT32로 나눌 수 있는데, FAT 뒤의 숫자는 비트 수로 최대 표현 가능한 클러스터의 수를 의미
  • FAT 파일시스템은 예약영역, FAT 영역, 데이터 영역으로 나눌 수 있음

1. 예약영역 (Reserved Area)

예약 영역은 FAT 파일 시스템에서 가장 앞에 위치하는 구조로 여러 개의 섹터를 포함
예약 영역의 크기는 FAT 12/16는 1개의 sector를 FAT 32는 32개의 sector를 사용
FAT32에서는, 예약 영역을 다시 부트 sector/ FSINFO sector/ 추가적인 sector로 구분

  • 부트 sector
    부트 sector는 1 sector 크기(512byte)로 예약 영역 중에서도 1번째 sector에 위치하여 FAT 파일시스템에서 가장 처음에 위치한다.
    1 sector로 이루어진 FAT12/16의 예약영역은 곧 부트 sector로 사용됨
    부트 sector의 데이터를 참조하여 파일 시스템 종류를 결정
    부트 sector는 부트 코드로 점프하기 위한 명령어가 위치되어 있으며, 부트 코드는 파일 시스템의 여러 설정 정보를 나타내는 BPB(BISO Parameter Block) 참조하여 시스템 부팅
    부팅 과정이 실패하면 미리 설정된 오류메시지를 출력

FAT32 부트 sector에서는 부트 sector 백업본의 sector 주소, 주/부 버전 번호 같은 추가 데이터가 포함되어 있음
부트 sector가 손상될 것을 대비하여 6번째 sector에 내용을 백업해두기 때문에 파티션 복구 도구들의 경우 부트 sector가 정상적이지 않을 경우 백업되어 있는 부트 sector를 복사하여 사용하여 복구함

  • FSINFO (FAT32)
    FSINFO(File System INFOrmation)는 일반적으로 1번째 sector(부트 sector 다음)에 저장되는 구조로 7번째 sector에 내용을 백업해둠
    FSINFO에는 다음 할당 가능한 클러스터 위치, 전체 크기에 대한 정보를 포함하고 있으며 해당 데이터는 운영체제에게 안내하기 위한 목적으로 존재하기 때문에 정확성을 보장하지는 않음
    FSINFO 구조의 용도는 운영체제에게 첫 비할당 클러스터의 위치와 전체 비할당 클러스터의 수를 알려줘 저장할 데이터를 빠르게 할당할 수 있도록 도와주는 것

  • 추가 예약 영역 (FAT32)
    부트 섹터는 0, 6번 sector를 FSINFO는 1, 7번째 sector를 사용
    이 외, 2번 sector는 부트 sector의 부트 코드 영역이 부족할 경우 추가적으로 사용할 수 있는 sector이고, 해당 내용을 8번 sector에 백업해둠
    이처럼 FAT 32는 0, 1, 2, 6, 7, 8번의 sector를 사용
    결과적으로 총 32 sector 중 6개 sector만 사용하고 나머지 sector는 만약을 대비해 예약되어 있음

2. FAT 영역 (FAT Area)

FAT 영역은 데이터 영역에 저장된 파일의 클러스터 할당 관계를 표시해주는 테이블
또다른 FAT 영역은 첫번째 테이블 영역이 손실되었을 경우, 사용하기 위한 백업본
두 테이블 영역은 동일한 값이 저장됨
또한, 해당 영역은 FAT 구조체 수와 크기에 따라 달라짐

위 그림에서, 빨간색 표시 부분은 예약 영역, 뒤에 숫자로 표시된 부분은 FAT 영역
FAT 영역을 보면, 1 또는 2로 표기되어 있는데 1은 첫번째 FAT 영역(FAT #1)이고, 2는(FAT #2) 백업본을 의미
FAT12/16은 2byte, FAT32는 4byte를 통해 데이터 영역의 시작 클러스터부터 마지막 클러스터까지 할당 관계를 표시
FAT32에서는 4byte씩 클러스터를 표현하므로 각 sector(512byte)에는 128개의 클러스터를 표현할 수 있음
만약 FAT 영역이 100개의 sector 크기를 가지고 클러스터 크기가 4kb라면 데이터 영역의 총 크기는 50mb(128 x 100 x 4096 byte)가 됨
그리고 데이터 영역에 저장된 파일은 연속적인 클러스터에 저장될 수도 있지만 조각나 저장될 수도 있는데 FAT 영역은 조각난 클러스터의 연결 상태까지도 표현해줌

  • FAT 엔트리
    클러스터에 대응되는 FAT 영역의 각 바이트는 FAT 엔트리라고 부름
    각 FAT 엔트리는 데이터 영역의 각 클러스터에 대응됨
    FAT 영역의 1, 2 FAT 엔트리는 별도 용도로 예약되어 있는데,
    첫번째 FAT 엔트리는 해당 미디어의 타입을, 두번째 FAT 엔트리는 파티션의 상태를 나타냄

각각의 FAT 엔트리의 값은 파일 시스템에서 데이터 영역의 각 클러스터가 사용되고 있는지를 나타내고, 특정 파일이 점유하고 있는 클러스터의 위치를 나타냄

1) 비할당 상태일 경우, 0x00의 값을 가짐.
따라서 운영체제는 새로운 파일 및 디렉터리를 저장하고자 할 경우 FAT 영역에서 FAT Entry 값이 0x00인 클러스터를 찾아 할당함

2) 할당 상태일 경우, FAT Entry의 값은 그 클러스터를 점유하고 있는 파일의 다음 데이터가 있는 클러스터를 가리킴

3) 파일의 마지막 데이터가 있는 클러스터이면 마지막을 나타내는 특정 값을 사용

4) 만약 bad sector가 포함된 클러스터가 발견될 경우, FAT12는 0xFF7, FAT16은 0xFFF7, FAT32는 0x0FFF FFF7값을 사용해 표시하고 표시된 클러스터는 이후에 사용되지 않음

FAT 영역은 FAT Entry를 통해 데이터 영역의 클러스터 할당 상태 및 연결 상태를 표현할 뿐이므로 파일의 정확한 크기 및 이름, 확장자, 시간정보 등을 얻고 싶으면 데이터 영역의 디렉터리 엔트리 구조를 확인해야 함

3. 데이터 영역 (Data Area)

데이터 영역에 저장되는 데이터는 크게 파일의 메타 정보(파일 이름, 크기, 타입, 시간 정보, 시작 클러스터 위치 등)을 저장하고 있는 디레터리 엔트리 구조와 실제 파일 데이터로 나눠볼 수 있음

FAT12/16의 경우, 루트 디렉터리는 FAT 영역에 바로 따라옴
FAT32는 그 위치가 고정되어 있지는 않고 예약 영역 부트 sector 내부의 BPB 값을 통해 그 위치를 나타냄
하지만 FAT32도 일반적으로 FAT 영역에 따라 나옴

루트 디렉터리가 FAT 영역 다음의 첫 클러스터에 오지만 FAT 엔트리 0, 1번이 예약되어 사용되지 않기 때문에 첫 클러스터의 번호는 FAT 영역을 기준으로 했을 때 2번이 됨
루트 디렉터리는 우리가 탐색기로 루트(C:)를 클릭했을 경우 나타나는 폴더 및 파일의 정보를 담고 있음

  • 디렉터리 엔트리
    폴더 및 파일의 정보는 디렉터리 엔트리 구조를 통해 나타남
    각각의 폴더 및 파일은 하나 이상의 디렉터리 엔트리를 통해 표현되며, 그 크기는 32byte
    디렉터리 엔트리는 이름, 확장자, 속성, 생성 날짜 및 시간, 마지막 접근 시간, 마지막 수정 날짜 및 시간, 시작 클러스터 위치, 논리적 파일 크기 정보를 가지고 있음
    폴더를 표현할 경우 확장자가 없으므로 확장자는 표현하지 않음
    디렉터리 엔트리의 할당 상태는 첫 byte를 통해 알 수 있으며, 할당된 엔트리 상태인 경우 자신이 할당된 파일명이나 디렉터리명의 첫 글자가 첫 byte가 된다

루트 디렉터리에 위치한 특정 파일이나 폴더에 접근하고자 하는 경우 루트 디렉터리의 디렉터리 엔트리를 검색하면서 해당 파일 이름을 찾음

파일 이름을 가진 디렉터리 엔트리를 찾았다면, 시작 클러스터 정보를 얻어 해당 위치부터 파일 크기만큼 파일을 획득
하지만 파일은 항상 데이터 영역의 연속된 클러스터로 표현되지 않고 조각날 수 있기 때문에 이런 조각난 파일 정보는 FAT 영역에서 시작 클러스터부터 따라가면서 원하는 클러스터만큼 획득하면 됨
파일 크기에 해당하는 클러스터를 획득한 경우 마지막 클러스터에는 파일 슬랙이 존재할 수 있으므로 정확한 파일 데이터만 얻고자 한다면 파일 크기만큼만 떼어내면 됨

하위 디렉터리를 탐색하고자 할 경우, 파일과 마찬가지로 하위 디렉터리 이름을 가진 디렉터리 엔트리를 얻어 하위 디렉터리가 위치한 클러스터로 이동
이동하게 되면 다시 그 클러스터에는 하위 디렉터리의 폴더 및 파일 정보를 담고 있는 32byte의 디렉터리 엔트리가 연속적으로 나올 것임

참고링크 http://forensic-proof.com/archives/251

0개의 댓글