모두의 dream

FAT32 삭제된 파일 복구 본문

분야/Digital Forensics

FAT32 삭제된 파일 복구

오리꽥이로 2024. 3. 11. 20:55
Contents 접기

*공부를 위해 정리한 내용으로 틀린 부분이 있을 수 있습니다. *

 

FAT32  파일 시스템, 디렉토리 엔트리 구조에 대한 내용은 아래 링크 참고.
https://roklcw.tistory.com/80

 

FAT32 File System

모두의 dream FAT32 File System 본문

roklcw.tistory.com

I. 파일 복구가 가능한 이유

파일을 삭제하면 파일의 메타데이터만 변경 되고 실제 데이터는 남아있다.
Data Area의 Directory Entry를 보면 SFN, LFN의 0번째 바이트 값만 0xE5로 변경하여 파일의 상태를 변경한다.
추후 시스템 복원 등에 사용되기 위해서는 데이터 자체를 삭제하지는 않게 된다.
 
실습파일: FAT32 파일시스템으로 포맷한 USB.

II. Data Area

구조

Data Area에 있는 정보를 통해 삭제된 파일을 복구할 수 있다.

Data Area 구조

Data Area에는 Directory Entry가 존재한다.

Directory Entry

가장 아래 있는 디렉토리 엔트리를 보면 SFN, LFN 모든 엔트리 0번째 바이트에 0xE5 값이 존재한다. 
이를 통해 삭제된 파일임을 확인할 수 있다.
 
이 엔트리의 세부사항을 분석해보자.
우선 Directory Entry의 구조는 다음과 같다.

LFN 구조 예시

기본적으로 가장 바닥에 SFN 구조가 존재한다.
그리고 파일명의 길이에 따라 가운데 파란색 부분이 더 추가되고, 초록색 부분은 LFN의 가장 마지막 구조이다.
가장 앞에 있는 sequence Number는 LFN이 증가하면 01부터 계속 숫자가 증가하며 마지막 LFN의 Sequence Number 값은 0x40과 OR 연산된 값이 들어간다.
 
아래 과정을 이용하면 LFN의 마지막을 파악할 수 있다.
1. 가장 앞에 있는 sequence Number를 통해 LFN의 마지막을 파악할 수 있다. (OR 이용)
2. LFN의 Attribute는 0xF, SFN의 Attribute는 0xF를 제외한 나머지이므로 만약 코딩을 한다면 0xF가 아닌 값이 나오기 전까지 같은 파일로 판단하면 될 것 같다.
 
초록색 부분은 LFN 기본 구조와 동일하지만 파일명의 끝을 나타내는 구조이다 보니 파일명 뒤에 남는 공백 자리에 0xFFFFFFFF가 들어간다.
 
마지막 엔트리 분석 시작!

- SFN

SFN

 

start offset 내용 해석
0x00 Name (파일명이 길면 요약되어 나옴) E5 4F 52 4D 41 4C 7E 31 
N O R M A L ~ 1 
0x08 Extension (파일 확장자)
없으면 0x202020으로 채워짐.
4D 50 34
M P 4
0x0B Atrribute 0x20 (일반 파일)
0x0C Reserved (예약된 영역) 00 BF
0x0E Create time 0x8EC8
0x10 Create Date 0x5862
0x12 Last Accessed Date 0x5862
0x14 Starting Cluster Hi 00 00 = 0x0000
0x16 Last Written Time 0x73B9
0x18 Last Written Date 0x563A
0x1A Starting Cluster Low 2D 3D =  0x3D2D
0x1C File Size 0x35D894B = 56461643 bytes

 
SFN에서 표현할 수 있는 파일명 길이는 8 bytes, 이 길이를 초과하게 되면 SFN의 Name에는 이름이 "~"가 포함되어 요약된다.
 
- LFN 1

LFN 1

start offset 내용 해석
0x00 Sequence Number
(삭제 파일은 0xE5로 변경)
0xE5 (삭제된 파일)
0x01 File Name n_1 6E 00 6F 00 72 00 6D 00 61 00
n o r m a   
0x0B Attribute 0x0F (LFN은 0xF 고정)
0x0C Reserved 00
0x0D Check sum 0xBA
0x0E File Name n_2 6C 00 5F 00 74 00 65 00 73 00 74 00
l _ t e s t 
0x1A First cluster Low 00 00
0x0C File Name n_3 2E 00 6D 00
. m 

 
- LFN 2

LFN 2

start offset 내용 해석
0x00 Sequence Number
(삭제 파일은 0xE5로 변경)
0xE5 (삭제된 파일)
0x01 File Name n_1 (파일명이 끝나서 0xFF 로 채워짐) 70 00 34 00 00 00 FF FF FF FF
p 4 
0x0B Attribute 0x0F (LFN은 0xF 고정)
0x0C Reserved 00
0x0D Check sum 0xBA
0x0E File Name n_2 FF FF FF FF FF FF FF FF FF FF FF FF

0x1A First cluster Low 00 00
0x1C File Name n_3 FF FF FF FF

파일 복구

다음은 SFN 구조의 Starting Cluster High, Low 값이다.

start offset 내용 해석
0x14 ~ 0x15 Starting Cluster Hi 00 00 = 0x0000
0x1A ~ 0x1B Starting Cluster Low 2D 3D = 0x3D2D

 
현재 실습파일은 한 클러스터당 16섹터로 이루어져있다.
모두 리틀엔디안이며 High값과 Low 값을 이어주면 데이터가 있는 클러스터 위치가 나온다.
클러스터 주소: 0x00003D2D = 15661, 15661번째 클러스터에 데이터가 있다. (data 영역의 시작 주소부터 15661 번째 클러스터)
 
그리고 현재 Root dir은 2번 섹터로 34816 섹터에 존재한다.
따라서 data 영역의 시작 섹터는 34816 - 32 = 34784
34784에 SFN에 있는 클러스터 주소를 더해준다.
15661 * 16 = 250576
250576 + 34784 = 285360
 
정리하면 다음과 같다.
1. data 영역 시작 주소 = Root dir 섹터 - (한 클러스터 당 섹터 * 2)
2. SFN에 있는 클러스터 주소 = (High_Low) * 16
3. data 영역 시작 주소 + SFN에 있는 클러스터 주소
 
위치로 이동해보면 파일이 존재하는 것을 확인할 수 있다.

삭제했던 mp4 파일

File Size 값 또한 SFN에서 확인할 수 있으니 파일을 온전하게 복구할 수 있다.
물론 엔트리의 가장 첫 바이트가 0xE5로 변환되므로 완벽하게 이름을 복구할 수는 없는 것 같다.

III. Reference

http://forensic-proof.com/archives/251
https://blog.forensicresearch.kr/2
https://hyd3.tistory.com/125
https://jihwan4862.tistory.com/55

Comments