4-2.1) FAT32 분석(BR, Directory Entry - 데이터의 접근)
FAT32의 부트레코드, 데이터 영역의 접근, 디렉토리 엔트리에 대해 알아봅시다.
Last updated
FAT32의 부트레코드, 데이터 영역의 접근, 디렉토리 엔트리에 대해 알아봅시다.
Last updated
[디스크 관리] 에서 새로운 가상디스크를 만들어 봅시다. (가상 디스크 사용법 : 2-1) 가상 디스크 설정)
디스크 초기화에서 MBR에서 초기화 후 설정 해보도록 합시다.
이번에는 드라이브 문자를 할당 하고 이 볼륨을 다음 설정을 포맷에서 [FAT 32] , 볼륨 레이블을 FAT32로 지정해봅시다.
FAT32가 인식된 드라이브를 선택하고 텍스트를 하나 생성해 봅시다.
간단한 텍스트를 저장하고, 대신 영문의 인코딩 방식을 "ANSI"로 저장 해보도록 합시다.
FTK Imager를 이용하여 분석하여 봅시다. Add evidence item 을 선택 - Physical Drive를 선택 후 연결한 가상디스크를 선택하여 봅시다.
최상위 저장매체의 가장 첫부분을 확인하여 봅시다. 우리는 MBR 파티션 엔트리 구조를 알기 때문에 첫번째 파티션 엔트리를 간단히 분석해서 파티션 1번의 위치를 확인하여 봅시다. 파티션 1번의 시작위치 : 80 00 00 00 -> 00 00 00 80 (16진수) => 128 (10진수) 섹터 전체 섹터 수 : 00 90 01 00 -> 00 01 90 00 (16진수) => 102,400 섹터 이제 1번 파티션은 128 - 102,400 섹터에 해당합니다.
FTK Imager에서도 파티션 1번을 확인하면 파티션 Properties 에서 파티션 1번을 분석한 부분을 확인할 수 있습니다. 자 이제 여기에 FAT32 파일시스템이 시작하는 것을 확인하였습니다. FAT에서는 이곳을 FAT 파일시스템의 부트 레코드(BR) 이라고 하며, 이곳에 파일시스템 관련의 주요 정보가 포함되어 있습니다.
FAT32 부트 레코드 구조 중 이번에는 포렌식과 친해지기에서는 중요하다고 생각되는 부분 위주로 살펴 보도록 하겠습니다.
위에 것을 한번 다시 한번 분석을 해보도록 합시다.
- Bytes Per Sector : 512 (1 섹터의 크기 512 bytes) - Sector per Cluster : 1 (클러스터 당 섹터 수) / 클러스터 번호로 섹터를 이동할 때 항상 주의 ex) 클러스터 당 섹터수가 8 이라면 1클러스터 이동 X 8 섹터로 계산해야 함 - Reserved Sector Counter : 6,718 섹터 (예약된 영역으로 사용하지 않는 영역) - Total Sector 32 : 102,400 섹터 (전체 섹터 수) - FAT32 : 737 섹터 (FAT 영역 크기) - Num FATs : 2 (FAT 영역 개 수) - Root Directory Cluster : 2 (2번 클러스터) - Volume ID : 18 75-8B 02 - Back Boot Sector : 6 (백업 부트 레코드 섹터 위치)
위 정보로 알 수 있는 추가 정보를 알아봅시다. - 파일시스템의 전체 용량 : 102,400(전체 섹터 수) X 512 = 52,428,800 bytes = 50 Mbytes - 클러스터의 크기 : 1 섹터 (512 bytes) - Volume ID : 18 75-8B 02 - 부트레코드 백업본 위치 : 6번 섹터(파티션 시작 기준)
먼저 Volume ID 의 경우 바로 확인이 가능합니다. cmd 창을 연 다음 FAT32 드라이브로 이동 한 다음 아래 명령어를 입력하면 확인할 수 있습니다.
> dir
부트 레코드의 경우 훼손이 되면 파일시스템 전체에 대해 파악이 어렵기 때문에 백업본이 위치합니다. Back Boot Sector 가 6이니 6번째 섹터에 가보도록 합시다. 물리섹터 기준으로는 파티션 시작 위치 + 6에 위치 (파티션 1 시작 위치 128 + 6 = 134번 섹터)
파티션 내에서 이동할 때는 해당 파티션을 선택 후 Logical Sector 로 이동할 수 있습니다. 6번 섹터에 백업이 있는지 확인할 수 있습니다.
6번 섹터에 복사본이 위치하며 복사본을 BR 있어야 하는 섹터에 덮어 쓴다면, 파일시스템의 정보가 복원되어 파일시스템 구조 접근이 가능해 집니다. (디지털포렌식 2급 자격증 시험에 많이 출제된 문제 유형 중 하나 입니다.)
그렇다면 루트 디렉토리로 이동해서 우리가 저장한 파일은 어떻게 접근 하는 것일까? 일단 FAT 파일시스템 구조를 파악 해보고 시작 위치를 알아봅시다.
먼저 DATA 영역에 접근을 먼저 해보도록 합시다. DATA 영역 접근을 위해서 섹터번호를 계산해보면 - Reserved Sector Counter : 6,718 섹터 (예약된 영역으로 사용하지 않는 영역) - FAT32 : 737 섹터 (FAT 영역 크기) - Num FATs : 2 (FAT 2개) [물리 섹터 기준]
파티션 시작 위치 섹터 + Reserved Sector + FAT1 크기 + FAT2 크기(FAT1과 동일) = DATA 시작 -> 128 + 6,718 + 737 + 737 = 8,320섹터 [파티션 기준] Reserved Sector + FAT1 크기 + FAT2 크기(FAT1과 동일) = DATA 시작 -> 6,718 + 737 + 737 = 8,192 섹터 FTK Imager 에서 해당섹터로 이동하면 아직은 잘 모르지만 어떤 데이터가 보이면 잘 접근한 것입니다.
FTK Imager에서 보면 FAT32 영역을 클릭하면 우리가 계산한 영역으로 한방에 이동합니다. 또한 Properties 에서 우리가 분석한 내용도 확인할 수 있습니다.
그런데 이상한게 하나 있습니다. FAT 부트레코드에서 루트 디렉토리 클러스터 번호가 2번을 가리키고 있습니다. - Root Directory Cluster : 2 (2번 클러스터) 그런데 도구 하단에 보면 Clus 번호가 2로 되어 있으며, FAT32 내에서는 클러스터 단위로 이제 이동이 가능한 Data 영역이기 때문에 우클릭 하였을 때, Go to Cluster가 가능합니다. 그런데 Range를 보면 2번부터 가능합니다.
클러스터 0번과 1번은 어디 갔을까요? FAT 영역과 관련이 있기 때문에 아래 FAT 영역 분석에서 한번 알아보도록 합시다. 지금은, 0번, 1번 클러스터를 데이터 저장에 사용하지 않는다 정도만 알고 있도록 합시다.
FTK Imager에서 [root] 영역을 누르면 위에서 접근한 루트 디렉토리 데이터 영역 시작 위치를 확인할 수 있으며 Start Cluster, Start Sector가 어떤 의미인지도 이제는 알 수 있습니다.
자 이제 데이터 영역을 확인해보도록 해봅시다. 초반에 생성했던 "test.txt"도 발견할 수 있습니다.
우선 다른 파일들은 윈도우에서 자동으로 생성하거나 test.txt 파일을 생성하는 과정에서 생긴 파일 정보 엔트리가 있으나 우선은 확실히 잘 보이는 "test.txt" 파일에 대한 정보가 담긴 영역을 분석해봅시다.이 부분을 디렉토리 엔트리 라고 합니다.
FAT32의 디렉토리 엔트리를 분석해보면 아래와 같다.
Active Disk Editor 로 분석 할 경우 아래와 같이 확인이 가능합니다. Active Disk Editor 에서 해당 저장매체를 Edit 한 후 8,320 섹터로 간 뒤 우리가 보려는 디렉토리 엔트리 영역의 시작 점에서 우클릭 - Set Template Position 을 선택한 뒤 Templates를 FAT Directory Entry로 선택하면 확인이 가능합니다. 꼭 봐야할 필요는 없으니 참고만 하도록 합시다.
위 구조를 살펴보도록 하자 먼저 파일명 부분을 살펴보면 - Name : "TEST" - Extender(확장자) : TXT - Attribute (속성) : 20 > 01 : 읽기전용, 02 : 숨김, 04 : 운영체제 파일, 08: 볼륨레이블, 10: 디렉토리, 20: 일반파일 F0 : Long File Entry (파일명이 길 경우 긴 파일명 엔트리) - NT reserved : 18 > 00: 파일 이름과 확장자가 모두 대문자 / 08: 파일 이름이 소문자, 확장자는 대문자| 10: 파일 이름은 대문자, 확장자가 소문자 / 18: 파일 이름과 확장자가 모두 소문자
시간 관련 정보를 알아보면 약간은 복잡해 보이지만, 한만 집중해서 해보면 무슨 의미인지 파악이 될 것입니다. 시간 정보의 경우 각자 다를테니 각자가 같은 방식으로 한번 계산해보길 . *우선 시간 정보는 16진수값을 2진수로 변환 후 계산해야 합니다. [생성시간] - Creation Time Tenth : C7(16진수) -> 199(10진수) / 파일이 생성된 시간의 10밀리초 단위 값, > 즉 1990 밀리초(1.99초)로 Creation Time 필드와 함께 파일이 생성된 정확한 시각을 나타냄 - Create Time : AF A3 (리틀엔디안) -> A3AF -> bit (2진수)로 변환 1010(A)0011(3)1010(A)1111(F) 1010001110101111 -> 10100 (20) 5비트 Hours(20시) 1010001110101111 -> 011101 (29) 6비트 Minutes(29분) 1010001110101111 -> 01111 (15) 5비트 X 2 Seconds(30초) 초의 경우 X2를 함. > 20시 29분 30초 - Create Date : B3 58(리틀엔디안) -> 58B3-> bit (2진수)로 변환 0101(5) 1000(8) 1011 (B) 0011(3) 0101100010110011 -> 0101100(44) 7비트 Year(1980+44 =2024) 기준년도(1980) 추가 0101100010110011 -> 0101 (5) 4비트 Month (5월) 0101100010110011 -> 10011(19) 5비트 (19일) > 2024년 5월 19일 >> 정리하면 Create Date + Create Time + Creation Time Tenth : 2024년 5월 19일 20:29:31.990 [최근 접근 날짜 - 날짜는 있으나 시간 정가 없다.] - Last Access Date : B3 58(리틀엔디안) -> 58B3-> bit 로 변환 0101(5) 1000(8) 1011 (B) 0011(3) 0101100010110011 -> 0101100(44) 7비트 Year(1980+44 =2024) 기준년도(1980) 추가 0101100010110011 -> 0101 (5) 4비트 Month (5월) 0101100010110011 -> 10011(19) 5비트 (19일) > 2024년 5월 19일 [수정시간] - Write Time : EA A3(리틀엔디안) -> A3 EA-> bit (2진수)로 변환 1010(A) 0011(3) 1110(E) 1010(A) 1010001111101010 -> 10100 (20) 5비트 Hours(20시) 1010001111101010 -> 011111 (31) 4비트 Minutes(31분) 1010001111101010 -> 01010 (10) 4비트 X 2 Seconds(20초) 초의 경우 X 2를 함. > 20시 31분 20초 - Write Date : B3 58(리틀엔디안) -> 58B3-> bit 로 변환 0101(5) 1000(8) 1011 (B) 0011(3) 0101100010110011 -> 0101100(44) 7비트 Year(1980+44 =2024) 기준년도(1980) 추가 0101100010110011 -> 0101 (5) 4비트 Month (5월) 0101100010110011 -> 10011(19) 5비트 (19일) > 2024년 5월 19일 >> 정리하면 Write Date + Write Time : 2024년 5월 19일 20:31:20 *생성시간 처럼 세밀하지 못하고, 초 단위가 무조건 짝수인 것을 알 수 있습니다.
중간에 클러스터를 나타내는 부분이 high, low 로 나눠져 있는데 사실 이전 버전인 FAT16에서는 Cluster High를 사용하지 않고 Cluster low만 사용했습니다.
FAT32로 더 많은 것을 나타내기 위해 나중에 Cluster High를 사용하게 된 것입니다. [클러스터 부분] Cluster Low (07 00) + Cluster High (00 00) = 07 00 00 00 (리틀엔디안) -> 00 00 00 07 (7) 로 클러스터 7번을 가리키고 있다.
파일 크기를 알아봅시다. [파일 크기] File Size : 04 00 00 00 (리틀엔디안) -> 00 00 00 04 (4) = 4 bytes
우선 궁금하니 7번 클러스터(파일의 시작 위치)에 가봅시다. [클러스터 이동] root 디렉토리 시작 위치(2번 클러스터) + (클러스터 번호 - 2) X 클러스터 당 섹터 수 (2를 빼는 이유는 2번 클러스터 부터 시작이기 때문이다.) 즉, 8,320 + (7 - 2) X 1 = 8,325 섹터 입니다. FTK Imager에서 이동하여 봅시다. FAT32 영역에서 Go to Cluster로도 쉽게 이동 가능합니다.
우리가 저장했던 "test.txt" 로 접근하게 되었습니다! 클러스터 번호, 물리섹터 번호도 우리가 계산한대로 보일 것입니다.
추가로 루트 디렉토리의 가장 처음 있는 디렉토리 엔트리는 볼륨레이블이 저장되어 있습니다. 사실 볼륨레이블을 변경하는 일은 잘 없기 때문에 여기에저장된시간값은 파일시스템 포맷시간으로 볼여지가 있습니다. 다만 언제든 수정이 가능하기에 무조건 파일시스템 생성시간으로 보는 것은 적절하지 않습니다.
우리가 생성한 파일 이외의 다른 파일이 보일 수 있는데 이는, 윈도우 또는 보안 프로그램이 자동으로 생성한 파일도 포함됩니다.
우선은 용량이 매우 작은 파일을 저장하였는데 만약 용량이 매우 커서 여러 섹터를 쓴다면, 몇 번, 몇 번 섹터를 쓴다는 것을 어떻게 알 수 있을까? 다음, FAT 영역을 통해 알아보도록 합시다.