Digital Forensic - FAT 파일 시스템 분석 (2)

 

FAT 파일 시스템


(9) 데이터 구조

 

부트 섹터

  • 파일 시스템 첫 섹터에 존재하며 FAT 파일 시스템 종류에 따라 조금씩 다름

  • 하지만 첫 36byte는 동일

 

다음은 부트 섹터의 36byte 오프셋 구조이다.

범위(Byte)

설명

범위(Byte)

설명

0 ~ 2

부트 코드 점프 명령

19 ~ 20

파일 시스템 섹터 개수

3 ~ 10

OEM 이름 (ASCII)

21 ~ 21

장치 타입

11 ~ 12

섹터 별 바이트(512, 1024, 2048, 4096)

22 ~ 23

FAT 영역 섹터 수

13 ~ 13

클러스터 별 섹터 수

24 ~ 25

저장 장치 트랙별 섹터 수

14 ~ 15

예약 영역의 섹터 크기

26 ~ 27

저장 장치 헤드 수

16 ~ 16

FAT 영역 개수

28 ~ 31

파티션 시작 전 섹터 수

17 ~ 18

루트 디렉토리가 포함하는 최대 파일 개수

32 ~ 35

파일 시스템 섹터 수

 

1) 부트 코드 점프 명령

  • 해당 부분은 부팅 파일 시스템이 아니면 설정되지 않아도 되는 부분

 

2) 섹터 별 바이트

  • 주로 512, 1024, 2048, 4096 바이트로 할당

 

3) 클러스터 별 섹터 수

  • 클러스터 당 섹터 수는 2제곱의 숫자만이 할당

 

4) FAT 영역 개수

  • 보통 2로 할당되지만 일부 작은 저장 장치에서는 1로 할당 되기도 함

 

5) 루트 디렉토리 최대 파일 개수

  • FAT 12 : 224

  • FAT 16 : 512

  • FAT 32 : 0

 

6) 파일 시스템 섹터 수

  • 2바이트로 표현되는 값보다 섹터 수가 많다면 0으로 설정 됨

 

7) 장치 타입

  • 디스크 유형에 따라 다른 값이 할당되는 부분

  • 고정식 디스크 경우 '0xF8', 이동식 디스크 경우 '0xF0'이 할당

 

8) FAT 영역 섹터 수

  • FAT 12 / 16의 FAT 영역 섹터 수를 나타내는 부분

  • FAT 32의 경우는 0이 할당

 

9) 파일 시스템 섹터 수

  • 위 2바이트로 표현되는 부분과 동일하나 차이점이 있다면 4바이트로 표현된다는 것

  • 2바이트로 표현이 안될 시 2바이트 부분은 0으로 설정되고 이 부분에 섹터 수가 설정 됨

  • 두 부분 중 한 부분은 무조건 0이 되어야 함

 

위에서 설명한 부트 섹터 영역 다음부터는 FAT 12 / 16과 FAT 32가 다르다.

 

 

다음 표는 FAT 12 / 16의 부트 섹터 구조를 정리한 것이다.

범위(Byte)

설명

범위(Byte)

설명

0 ~ 35

부트 섹터

43 ~ 53

볼륨 레이블

36 ~ 36

BIOS INT13h 드라이브 번호

54 ~ 61

파일 시스템 타입 레이블

37 ~ 37

사용 x

62 ~ 509

사용 x

38 ~ 38

확장 부트 시그니처

510 ~ 511

시그니처 (0xAA55)

39 ~ 42

볼륨 시리얼 번호

   

 

1) 확장 부트 시그니처

  • 고정 값으로 0x29를 가짐

 

2) 볼륨 레이블

  • 파일 시스템 생성 날짜 등을 확인할 수 있는 값

 

다음 표는 FAT 32의 부트 섹터 구조를 정리한 것이다.

범위(Byte)

설명

범위(Byte)

설명

0 ~ 35

부트 섹터

64 ~ 64

BIOS INT13h 드라이브 번호

36 ~ 39

FAT 영역 섹터 수

65 ~ 65

사용 x

40 ~ 41

FAT 구조체 저장 결정 비트

66 ~ 66

확장 부트 시그니처

42 ~ 43

주 / 부 버전 번호

67 ~ 70

볼륨 시리얼 번호

44 ~ 47

루트 디렉토리 클러스터 위치

71 ~ 81

볼륨 레이블

48 ~ 49

FSINFO 구조체 섹터 위치

82 ~ 89

파일 시스템 타입 레이블

50 ~ 51

부트 섹터 복사본 섹터 위치

90 ~ 509

사용 x

52 ~ 63

예약 영역

510 ~ 511

시그니처 (0xAA55)

 

1) FAT 구조체 저장 결정 비트

  • 만약 7번째 비트 자리가 1이라면 여러 FAT 구조체들 중 하나만 활성화된 것을 의미

  • 활성화 FAT 구조체 번호는 비트 0 ~ 3자리를 이용해 나타냄

 

2) 확장 부트 시그니처

  • 고정 값으로 0x29를 가짐

3) 볼륨 레이블

  • 파일 시스템 생성 날짜 등을 확인할 수 있는 값

 

공통적으로 시그니처 값 전에 사용하지 않는 영역이 있는데 이 부분은 특별한 목적이 없기 때문에 사용되지 않는다고 표현하였지만, 일반적으로는 부트 코드와 오류 메시지를 저장한다.

 

 

FSINFO 구조체

  • FAT 32에만 존재하는 구조체

  • 운영체제가 새로운 클러스터를 어디에 할당하는지 설명하는 역할을 담당

 

다음은 FSINFO 구조체 오프셋 구조이다.

범위(Byte)

설명

범위(Byte)

설명

0 ~ 35

시그니처 (0x41615252)

492 ~ 495

다음 할당 클러스터 번호

4 ~ 483

사용 x

496 ~ 507

사용 x

484 ~ 487

시그니처 (0x61417272)

508 ~ 511

시그니처 (0xAA550000)

488 ~ 491

비할당 클러스터 수

   

 

 

FAT 영역

  • 클러스터 할당 상태 파악

  • 어떠한 파일이나 디렉토리에 할당된 클러스터의 다음 클러스터 주소 파악

 

FAT은 보통 FAT 파일 시스템에서는 두 개가 존재하며, 정확한 번호는 부트 섹터에서 할당 한다.

 

첫 번째 FAT은 예약 영역 섹터 다음부터 시작하며, 부트 섹터에서 전체 크기를 할당 한다.

 

두 번째 FAT은 만약 존재한다면 첫 번째 FAT 마지막 섹터 다음부터 시작하며, 구성은 같은 크기의 엔트리들로 구성된다.

 

 

알아두어야 할 점은 엔트리에 Header와 Footer는 존재하지 않는다는 것이다.

 

각 엔트리 크기는 FAT 종류마다 다른데, 해당 종류 숫자 bit 크기를 갖는다. (예 FAT 12는 12bit)

 

엔트리 주소는 0부터 시작하며, 같은 주소의 클러스터와 맵핑된다.

 

클러스터가 할당되지 않은 엔트리는 다음 클러스터 항목에 0값을 가지고, 클러스터가 할당되면 0값이 아닌 파일이나 디렉토리에 할당된 클러스터의 다음 클러스터 주소를 갖게 된다.

 

마지막 클러스터 주소를 가지게 되면 엔트리에는 마지막 클러스터라는 어떠한 값을 가지게 되는데, 그 값은 FAT 종류마다 다르다.

 

  • FAT 12 : 0xFF8

  • FAT 16 : 0xFFF8

  • FAT 32 : 0x0FFF FFF8 

 

만약 위 값들 보다 작은 값을 가진다면 클러스터가 손상되었다는 의미이며, 할당되어서는 안 된다.

 

클러스터의 시작 주소는 2부터여서 FAT 영역에도 당연히 0과 1의 주소를 갖는 엔트리는 꼭 필요하지 않다.

 

보통 0의 주소를 갖는 엔트리는 미디어 유형 복사본을 저장하는 엔트리이고, 1의 주소를 갖는 엔트리는 파일 시스템의 불량 상태를 저장하는 엔트리로 사용된다.

 

부트 섹터에도 미디어 유형 종류를 저장하는 항목이 있지만, 윈도우는 부트 섹터 항목은 사용하지 않고 FAT 영역의 엔트리 0을 사용한다.

 

 

디렉토리 엔트리

  • 디렉토리 이름과 여러 데이터를 대신 설명해 주는 메타 데이터가 포함 되어 있음

  • 이런 엔트리들은 파일과 디렉토리 모두에 할당되며 엔트리 위치는 할당된 파일이나 디렉토리의 부모 디렉토리 클러스터에 위치

  • 엔트리에 저장되는 이름의 최대 길이는 확장자를 제외하고 8글자이며, 확장자는 최대 3글자

 

다음은 디렉토리 엔트리 오프셋 구조에 대한 정리이다.

범위(Byte)

설명

범위(Byte)

설명

0 ~ 0

파일 이름 첫 문자 할당 상태

18 ~ 19

접근 날짜

1 ~ 10

파일 이름 2번째 ~ 11번째 문자 (ASCII)

20 ~ 21

첫 번째 클러스터 주소의 상위 2바이트

11 ~ 11

파일 속성

22 ~ 23

수정 시간

12 ~ 12

예약 영역

24 ~ 25

수정 날짜

13 ~ 13

생성 시간

26 ~ 27

첫 번째 클러스터 주소의 하위 2바이트

14 ~ 15

생성 시간

28 ~ 31

파일 크기

16 ~ 17

생성 날짜

   

 

1) 파일 이름 첫 문자 할당 상태

  • 해당 필드는 디렉토리나 파일 이름 첫 번째 문자가 설정되는 부분

  • 해당 디렉토리 엔트리가 비할당 상태일 시 문자 대신 '0xE5' 또는 '0x00'이 설정 됨

  • 파일명이 8글자 이하일 경우 사용되지 않는 바이트는 'space(0x20)'으로 채워짐

 

2) 파일 속성

  • 00000001 : 읽기 전용

  • 00000010 : 숨김 파일

  • 00000100 : 시스템 파일

  • 00001000 : 볼륨 레이블

  • 00001111 : 긴 파일 이름

  • 00010000 : 디렉토리

  • 00100000 : 아카이브

 

3) 첫 번째 클러스터 주소 상위 2바이트

  • FAT 12 / 16의 경우 이 값은 0으로 설정 됨

 

4) 파일 크기

  • 해당 필드는 파일 크기를 나타내는 필드

  • 디렉토리일 때 0으로 설정 됨

 

디렉토리 엔트리 필드를 보면 타임스탬프 필드들이 여럿 보인다.

 

해당 필드들의 값들을 일반적으로 사용하는 날짜 형식으로 변환하는 과정은 다음과 같다.

 

1) 날짜 변환

  • 타임스탬프 값 중 날짜 값은 다음과 같은 규칙을 가짐

년 (0 ~ 127 유효)

월 (0 ~ 127 유효)

일 (1 ~ 31 유효)

15 14 13 12 11 10 9

8 7 6 5

4 3 2 1 0

 

먼저 hex 값을 2진수로 변환한다.

 

0x3116(예시, 생성 날짜) > 0011000100010110

 

 

다음으로 위 규칙대로 2진수를 끊어 10진수로 변환한다.

  • 0011000 > 30

  • 1000 > 10

  • 10110 > 26

 

년도의 경우 1980년도를 기준으로 하기 때문에 1980 ~ 2107년도까지 표현이 가능하다.

 

계산된 년도 값에 1980을 더해주면 계산이 완료된다.

 

변환 값 : 2010. 10. 26

 

 

2) 시간 변환

  • 날짜와 마찬가지로 시간도 규칙이 있음

시 (0 ~ 127 유효)

분 (0 ~ 59 유효)

초 (0 ~ 29 유효)

15 14 13 12 11

10 9 8 7 6 5

4 3 2 1 0

 

먼저 날짜 계산 과정과 마찬가지로 hex 값을 2진수로 변환한다.

 

0x5C7A (생성 시간) > 0101110001111010

 

 

다음으로 위 규칙대로 2진수를 끊어 10진수로 변환한다.

  • 01011 > 13

  • 100011 > 43

  • 11010 > 32

 

시간은 따로 더해주는 값이 없어 이대로 계산이 끝난다.

 

변환 값 : 오후 13시 43분 32초

 

 

현재 이러한 계산을 자동적으로 수행해 주는 도구가 많이 있으며, 대표적으로 DCode 도구가 이러한 도구들에 속한다.

 

 

LFN 엔트리

  • 디렉토리 엔트리에 포함되는 엔트리

  • 긴 파일명을 사용하는 디렉토리나 파일에 디렉토리 엔트리가 할당되면 LFN 엔트리에 파일명이 저장 됨

  • LFN 엔트리는 일반 엔트리보다 우선시 되어 짧은 이름을 저장하는 기본 엔트리 전에 목록화되며, 순서는 역순

 

다음 표는 LFN 엔트리 바이트 오프셋이다.

범위(Byte)

설명

범위(Byte)

설명

0 ~ 0

일반 헤더

13 ~ 13

체크섬

1 ~ 10

파일 이름 문자

14 ~ 25

파일 이름 문자 6 ~ 11 (유니코드)

11 ~ 11

파일 속성

26 ~ 27

예약 영역

12 ~ 12

예약 영역

28 ~ 31

파일 이름 문자 12 ~ 13 (유니코드)

 

1) 순서 번호 또는 할당 상태

  • 순서 번호는 0x40과 OR 연산되어 할당 상태일 경우 설정 됨

  • 비할당 상태이면 0xE5로 설정 됨

 

파일 이름의 경우 사용되지 않는 바이트 필드들은 0xFF로 채워지며 파일 이름의 끝은 NULL (0x00)로 채워진다.

 


(10) 포렌식 측면에서의 관점

 

슬랙 공간

  • 파일 크기가 클러스터에 맞지 않아 발생하는 빈 공간

  • 파일에 할당된 클러스터가 파일보다 크더라도 클러스터 전체가 할당되며 파일이 사용하고 남은 클러스터 공간이 슬랙 공간이 되는 것

  • 일부 슬랙 공간은 한번 할당되고 다시 할당되지 않아 이전에 할당되어 쓰여진 데이터들이 남아 있을 수 있음

 

슬랙 공간 중 'RAM 슬랙 공간'이라고 부르는 공간이 있는데 이 공간은 운영체제가 파일 내용을 무엇으로 채우는지 결정하도록 한다.

 

그러나 대부분 0으로 채우게 된다.

 

RAM 슬랙 공간 말고 또 다른 공간이 있는데 이 공간은 클러스터의 비사용 섹터가 있는 공간이다.

 

앞에서 말했던 한번 할당되고 다시 할당되지 않은 슬랙 공간이 이 슬랙 공간을 말하는 것이다.

 

 

모든 파일 시스템은 슬랙 공간이 존재할 수 밖에 없다.

 

섹터 단위로 할당을 하기 때문에 슬랙 공간이 발생한다.

 

파일 시스템에서는 슬랙 공간이 할당된 데이터로 간주되기 때문에 만약 분석 시 파일 시스템에서 슬랙 공간을 분석하기 위해 비할당 데이터를 추출한다면 도구로부터 슬랙 공간을 추출받지 못한다.

 

[그림 1] 슬랙 공간

 

FAT 파일 시스템은 데이터 구조체가 다른 파일 시스템들에 비해 수가 적고 그 구조가 단순하다.

 

FAT의 부트 섹터와 FAT 엔트리는 파일 시스템 분석 도구가 자동으로 분석할 때 참조하는 아주 중요한 영역들로 필수적인 영역들이며, 디렉토리 엔트리는 응용 프로그램 도움 없이 삭제 된 파일을 복구하는데 참조되는 중요한 영역이다.

 

파일을 복구하길 원한다면 이 3가지 영역을 분석해야 하며 숨겨진 데이터가 있는지 확인하고 싶다면 각 비할당 영역이나 슬랙 공간을 분석해야 한다.

 

예를 들어, 부트 섹터 영역에는 시그니처 필드 앞 부분에 사용되지 않는 공간들이 존재한다.

 

이 부분은 부팅 파일 시스템일 경우 부트 코드를 저장하는 영역으로 사용하지만 부티 파일 시스템이 아닌 일반 저장 용도로 사용되는 파일 시스템이라면 빈 공간으로 남게 된다.

 

이렇듯 각 영역의 구조들을 살펴보면 사용되지 않는 공간들이 조금씩은 존재한다.

 

악의적 사용자는 이러한 공간들을 이용해 자신의 데이터를 숨기려고 할 것이며, 이러한 비할당 영역 말고도 슬랙 공간도 분석을 진행해야 한다.

 

FAT에서는 대표적으로 볼륨 슬랙이 존재한다.

 

파일 시스템과 볼륨 마지막 사이를 말하는 것이며, 이와 같은 볼륨 슬랙에도 악의적 데이터가 숨겨져 있을 가능성이 농후하다.

 

볼륨 슬랙을 찾기 위해서는 파일 시스템 섹터 수와 볼륨 전체 섹터 수를 비교해 얼마만큼의 슬랙 공간이 존재하는지 파악하는 방법이 있다.

 

볼륨 슬랙 공간을 파악하기 전에, 볼륨 슬랙 공간이 존재하는지, 사람에 의해 생성되었는지 확인하고 싶다면 주 부트섹터와 백업본 부트 섹터의 섹터 수를 저장하는 필드 값을 비교해 보면 된다.

 

 

FAT 영역은 시스템을 자동 분석할 때 중요하게 사용되는 영역이고, 그 안에 있는 디렉토리 엔트리는 응용 프로그램 수준의 기술 없이 삭제된 파일을 복구할 때 중요한 역할을 하는 엔트리이므로 필수적으로 알아두어야 할 부분이다.

 

대부분의 하드 디스크 등의 저장 장치들은 NTFS를 파일 시스템으로 많이 사용하지만 USB와 같은 이동형 저장 장치에서는 아직도 FAT을 사용하기 때문에 이동형 저장 장치를 분석하고 파일을 복구하려면 FAT에 대해 상세하게 알아두어야 할 필요가 있다.


# Reference

 

http://www.yes24.com/Product/Goods/8511539

+ Recent posts