3. FAT 파일 시스템


  • FAT 파일 시스템 소개

  FAT(File Allocation Table)는 MS-DOS 파일 시스템에서 파일의 위치정보를 기록한 테이블을 지칭하였다. 이후 윈도우 시스템으로 운영체제가 바뀌면서 MS-DOS 파일 시스템 자체를 가리키는 용어가 되었다. 파일 시스템과 테이블을 구분하기 위해 파일 시스템은 "FAT12/16/32" 또는 "FAT 파일 시스템"이라고 표기하고, 테이블은 "FAT 영역"이라고 표기한다. FAT 파일 시스템은 크게 FAT12, FAT16, FAT32로 나눌 수 있는데 숫자는 파일시스템에서 관리하는 클러스터의 개수를 의미한다.


FAT12는 12비트를 사용하여 클러스터 위치를 표현하므로 최대 4,096개의 클러스터를 표현할 수 있다. 하지만 미리 예약된 12개의 클러스터가 존재하기 때문에 최대 4,084개의 클러스터를 표현할 수 있다. FAT16의 경우에도 예약된 클러스터를 제외하면 65,524개의 클러스터를 표현할 수 있다. FAT32는 상위 4비트가 예약된 영역이기 때문에 총 28비트를 사용해 클러스터를 표현할 수 있다.

 클러스터의 크기를 16KB로 한다면 이론상으로 4TB까지 표현 가능하지만 MBR이 제한에 의해 2TB까지만 표현이 가능하다. 이후 Windows Embedded CE 6.0부터 FAT32를 확장한 exFAT가 사용되었다. 현재는 Windows Vista Service Pack 1부터는 기본으로 지원하며, Windows XP에서틑 패치를 통해 사용 가능하다.

 exFAT는 기존의 클러스터 표현 비트수를 64비트로 확장해 거의 용량 제한이 없고 비트맵을 사용하여 ㅡㄹ러스터를 관리한다. 이외에도 FAT32에서 제한되었던 많은 기능들이 확장되었다.


  • Reserved Area(예약 영역)

 FAT 파일 시스템에서 가장 앞에 위치하는 구조로 여러 개의 섹터로 구성된다. 예약된 영역의 크기는 기본적으로 FAT12/16에서는 1개의 섹터, FAT32에서는 32섹터를 사용한다.

 부트 섹터의 처음 3 byte는 0x003E 또는 0x005A의 부트 코드로 점프하기 위한 점프 명령어가 위치한다. 이후 클러스터 크기, FAT 크기, 루트 디렉터리 위치, 총 섹터 수 등의 파일시스템 정보를 기록한 BPB(BIOS Parameter Block)영역이온다. 부트 코드는 파일 시스템의 여러 설정 정보를 나타내는 BPB를 참조하여 시스템을 부팅한다. (NTLDR : NT Loader 실행) 부트 코드 실행과정에서 정상적이지 않은 동작이 발생할 경우 저장된 에러 메시지를 출력하게 된다.


 FAT32의 예약 영역 크기는 포맷 소프트웨어에 따라 조금 차이가 난다. 그리고 최근에는 윈도우 시스템의 기본적인 포맷 방법을 사용해 포맷한 경우에도 예약 영역이 기본값을 가지지 않는 경우가 있다. FAT 파일 시스템을 분석할 경우 반드시 부트 섹터 BPB의 오프셋(Offset) 14-15(Reserved Sector Count) 값을 확인해야 한다.

 섹터 0번은 부트 섹터로 사용하며 만약을 대비해 섹터 6번이 이것의 백업이다. 백업 위치도 부트 섹터의 오프셋 50 -51 항목을 사용해 임의로 지정할 수 있다. 섹터 1번은 FSINFO(File System Information) 구조체를 저장하고 섹터 7번은 이것의 백업이다. 이 구조체의 위치도 부트 섹터의 오프셋 48 - 49 항목을 사용해 임의로 지정할 수 있다. FSINFO 구조체는 운영체제에게 미할당 클러스터의 첫 위치와 전체 미할당 클러스터의 수를 알려줌으로써 저장할 데이터를 빠르게 할당할 수 있도록 도와주는 역할을 한다.


 [각주:1]

 FAT32로 포맷한 후 덤프한 결과이다. 부트 섹터는 볼륨의 0번째 섹터이다. FAT32의 경우에는 부트 섹터가 손상될 것을 대비하여 6번째 섹터에 내용을 백업해 둔다.


 FSINFO는 일반적으로 섹터 1번에 저장된다. 7번째 섹터에 내용을 백업해 둔다. 이러한 위치는 BPB에 정의되어 있기 때문에 임의로 지정이 가능하다. FSINFO 구조의 용도는 운영체제에게 첫비할당 클러스터의 위치와 전체 비할당 클러스터의 수를 알려준다. 

섹터 2번은 부트 섹터의 부트 코드 영역이 부족할 경우 추가적으로 사용할 수 있는 영역이며 섹터 8번은 이것의 백업이다. 부팅 과정에서 추가적인 작업이 필요할 경우 이 영역을 사용하게 되는데 보통은 비어있다.


  • FAT Area(FAT 영역)

 FAT 영역은 예약 영역 다음에 바로 위치하며, 일반적으로 두 개의 FAT 영역(FAT1, FAT2)이 존재한다. FAT2는 FAT1의 복사본으로 만약의 경우를 대비해 백업한 것이다.  FAT 영역은 데이터 영역으 클러스터 할당 상태를 표시한다 FAT16은 16비트, FAT32는 32비트를 사용해 데이터 영역의 시작 클러스터부터 마지막 클러스터까지 할당 상태를 표시한다.

 FAT32에서 FAT 영역의 첫 번째 섹터 내용을 간략히 나타낸 것이다. 각 4 byte는 "FAT Entry"라고 불리는데 FAT Entry 0, 1번은 저장매체 종류와 파티션 상태를 표현하기 위해 미리 예약되어 있다. FAT Entry의 값은 파일 시스템에서 데이터 영역의 각 클러스터가 사용되고 있는지를 나타낸다. 또한 특정 파일이 점유하고 있는 클러스터의 위치를 나타낸다.


[각주:2]

FAT32 파일 시스템에서 FAT 영역의 첫 번째 섹터를 덤프한 결과이다. FAT32인 경우 4 byte를 FAT Entry로 사용하기 때문에 한 섹터당 128개의 FAT Entry를 표현할 수 있다. FAT Entry 0, 1번은 특별한 의미로 사용되 FAT Entry 2번부터 시작한다.  FAT Entry 2번과 3번의 값이 Ox0FFF FFFF 값을 가지므로 해당 클러스터를 사용하느 파일은 하나의 클러스터만 사용하는 것을 알 수 있다. FAT Entry 4번부터 할당된 파일은 4, 5, 6, 7 8번 클러스터까지 모두 5개의 클러스터를 사용하는 파일임을 알 수 있다. 이처럼 FAT 영역의 정보로 특정 파일이 점유하고 있는 클러스터의 위치를 알 수 있다.

 파일의 이름, 확장자, 시간 정보, 정확한 크기 등을 얻고 싶다면 이러한 정보는 다음에서 살펴볼 데이터 영역에 있는 Directory Entry를 통해 확인할 수 있다.


  • Data Area(데이터 영역)

대부분의 파일 시스템은 디렉터리 표현을 위해 트리 구조를 사용한다. FAT 파일 시스템 역시 트리 형태로 표현되는데 가장 중요한 요소가 최상위 루트 디렉터리이다.

FAT12/16은 루트 디렉터리가  FAT 영역 바로 뒤, 데이터 영역의 제일 앞부분에 온다.  FAT32에서 루트 디렉터리는  FAT 바로 뒤가 아닌 데이터 영역 어느 곳에나 나올 수 있지만, 특별히 설정하지 않는 한  FAT12/16과 같이  FAT Entry 2번에 위치한다. 특별히 설정한 경우 예약된 영역 부트 섹터 내부의 BPB의 값(44~47 ; Root Directory Cluster Offset)을 통해 루트 디렉터리의 위치를 찾을 수 있다. 

  FAT12/16은 루트 디렉터리를 위해 최대 32개 섹터인 16,384 byte 크기의 영역을 사용할 수 있다. Directory Entry 크기가 32 byte이기 때문에  FAT12/16에서는 최대 512개의 Entry를 나타낼 수 있다.  FAT32에서는 루트 디렉터리에 생성할 수 있는 파일 및 디렉터리의 개수 제한이 없어졌다.

 데이터 영역에 저장되는 데이터는 크게 디렉터리와 파일로 나눌 수 있다. 디렉터리는 디렉터리 내부에 포함되는 하위 디렉터리 및 파일의 이름, 화장자, 시간, 정보, 크기 등을 표현하기 위해 Directory Entry라는 구조를 사용한다. 파일은 해당 파일의 형식에 따라 실제 데이터가 저장된다.

 

 Directory Entry는 이름, 확장자, 속성, 생성 날짜 및 시간, 마지막 접근 시간, 마지막 수성 날짜 및 시간, 시작 클러스터 위치, 논리적 파일의 크기 정보를 가지고 있다. 폴더를 표현할 경우 확장자가 없으므로 확장자는 표현하지 않는다. 

첫 번째 byte가 0xE5이면, 해당 Entry는 삭제되었음을 의미한다. 파이이 삭제될 경우 FAT 영역에서 파일에 할당되었던 클러스터에 대응되는 FAT Entry를 0x00으로 초기화하고, 해당 파일의 정보를 담고 있는 Directory Entry의 첫 번째 byte를 0xE5로 표시한다. 단순히 첫 번째 바이트 값만 변경되고 나머지 값은 초기화하지 않기 때문에 파일의 정보 및 내용을 복구할 수 있다.

 첫 번째 byte가 0x00이면, 해당 Entry는 사용되지 않는 Entry이다. 새로운 파일을 저장할 때 파일이 위치한 디렉터리에서 삭제된 Directory Entry를 검색한 후 삭제된 Directory Entry가 없을 경우 마지막 사용되지 않는 Directory Entry에 파일의 정보를 기록한다. 따라서 Directory Entry가 0x00으로 표현되었다면, 이후에 Entry가 존재하지 않는다는 것을 의미하므로 더이상 검색할 필요가 없다.

Directory Entry구조에 의하면 파일 이름을 기록하기 위해 8byte만 사용할 수 있다. FAT 파일 시스템에서는 8byte보다 긴 파일 이름을 표현하기 위해 LFN(Long File Name) Entry 라는 추가적인 구조를 사용하는데 이때 이름은 모두 유니코드(Unicode)로 표현된다. FAT32의 경우 파일 이름을 255자까지 지원하기 때문에 파일 이름이 길면 하나의  LFN Entry로 표현하기 부족하다. 이런 경우 여러 개의 LFN Entry를 사용해 표현하게 되는데 LFN Entry 오프셋 0 항목인 순서번호가 여러 개의 LFN Entry의 관계를 나타내기 위해 사용된다.

 


  1. http://forensic-proof.com/archives/372 [본문으로]
  2. http://forensic-proof.com/archives/378 [본문으로]
Posted by dodssockii :