#3 FAT - File Deletion
Table of Contents
Abstract
본 글에서는 FAT 볼륨에서 파일 삭제 시 어떤 변화가 일어나는 지 관찰하여 정리한 글이다. 파일을 삭제할 경우 디렉토리 엔트리는 삭제 플래그인 0xE5 값을 파일 이름의 첫 바이트에 넣고, 파일이 점유하고 있던 클러스터를 모두 Free 상태로 만들기 위해 File Allocate Table 영역에서 파일이 점유하고 있던 클러스터의 체인을 따라가며 모두 0으로 변경한다. 마지막으로 파일 삭제 후 새 파일을 생성할 때 삭제된 파일 데이터가 어떻게 되는지도 알아본다.
FAT에 대한 상세 내용은 아래 링크들을 참고하길 바란다.
- #1 FAT - File Allocate Table
https://geun-yeong.tistory.com/75
- #2 FAT - Directory Entry
https://geun-yeong.tistory.com/76
File Deletion in FAT
File Deletion
본 테스트에서는 FAT32로 포맷된 볼륨에 113,322 바이트 크기의 image.jpg를 루트 디렉토리 위치에 생성하고 이를 삭제한 후 변화를 비교한다.
Before Deletion
먼저 파일을 삭제하기 전을 보자.
디렉토리 엔트리를 보면 파일 이름의 첫 문자가 0x49('I')다. 즉 아직 삭제된 엔트리로 취급되고 있지 않다. 파일 데이터가 위치한 클러스터는 6이며, 파일 크기는 0x1BAAA(113,322) 바이트다.
image.jpg가 차지하고 있는 클러스터 목록을 보자. FAT 영역에서 체인을 따라가보면 image.jpg의 Starting Cluster인 6부터 33까지 총 28개 클러스터를 차지하고 있음을 알 수 있다.
본 테스트 환경이 FAT32이기 때문에 FAT32에만 존재하는 FS Information 내용도 관찰했다. Free Count 값은 256,480 개이고 Next Free 값은 34다. image.jpg가 6-33 클러스터를 사용하고 있기 때문에 바로 다음이면서 Free 상태인 클러스터 34를 가리키고 있는 걸 볼 수 있다.
After Deletion
이번엔 image.jpg를 삭제하고 그 변화를 관찰해보자.
먼저 Directory Entry를 보면 파일 이름의 첫 글자가 삭제 플래그인 0xE5로 변한 것을 제외하면 나머지 필드는 모두 그대로다.
클러스터 할당 정보를 담는 FAT 영역을 보면 image.jpg가 차지하고 있던 클러스터 6부터 33이 모두 0으로 채워졌다. 즉 해당 공간이 모두 언제든지 사용 가능한 Free 상태로 변환되었다는 걸 의미한다.
FS Info 내용도 변화가 생겼다. Free 상태의 클러스터 개수를 나타내는 Free Count 값이 image.jpg가 차지하던 클러스터 개수만큼 증가했고, 마지막 사용 가능한 클러스터 번호를 나타내는 Next Free도 6으로 변했다.
Result
FAT32에서 파일 삭제 시 변화되는 내용들은 아래와 같다.
- Directory Entry의 파일 이름 첫 바이트가 삭제 플래그인 0xE5로 변한다.
- 삭제된 파일이 점유하던 클러스터 체인을 따라 FAT 영역의 클러스터 체인들이 모두 0으로 변한다.
- (FAT32 한정) FS Info 구조의 Free Count 값이 증가하고, Next Free 값이 적절하게 변경된다.
달리 말하면 이 값들을 원상복구 할 경우 굳이 파일 데이터가 저장된 클러스터를 찾아가 파일 크기만큼 데이터를 복사해 별도 파일로 추출할 필요가 없다는 의미기도 하다.
Recovering a deleted file
앞서 "File Deletion"에서 보았듯 파일을 삭제해도 Directory Entry에는 삭제 플래그를 제외하곤 아무런 변화가 없다. 즉 Directory Entry가 살아있다면 Directory Entry에 남아있는 Starting Cluster 값을 이용해 원본 파일을 복원할 수 있다. image.jpg의 파일 데이터가 저장된 클러스터 6으로 가보면 아직 JPEG 이미지 데이터가 남아 있는 걸 볼 수 있다.
파일 데이터가 단편화되지 않고 연속적으로 존재한다면 Directory Entry에 적힌 파일 크기 만큼을 복사해 저장하면 된다. 그럼 삭제된 image.jpg를 복구할 수 있다. 하지만 단편화되어 연속되지 않은 클러스터에 파일이 저장된다면 이를 100% 복원하기란 쉽지 않다.
Reusing a deleted area
image.jpg를 삭제한 직후 73,559 바이트 크기의 scapy.pdf라는 파일을 FAT32 볼륨의 루트 디렉토리에 생성했다. 삭제된 image.jpg의 Directory Entry를 곧바로 덮어쓰진 않았지만 Starting Cluster 값이 6으로 동일한 것을 볼 수 있다. 즉 scapy.pdf 파일 데이터가 image.jpg 파일 데이터가 있던 영역에 덮어 쓰여졌다는 걸 의미한다.
실제로 클러스터 6으로 가보면 PDF 파일 데이터가 나타나는 걸 볼 수 있다. 클러스터 6은 FS Info에서 Next Free 값으로 지정되었던 공간이기도 하다.
하지만 scapy.pdf의 파일 크기가 image.jpg보다 작은 탓에 image.jpg의 모든 영역을 덮어쓰진 않았다. image.jpg의 마지막 클러스터인 클러스터 33으로 가보면 JPEG의 트레일러가 남아있는 걸 볼 수 있다.
물론 이 역시 Free 상태인 클러스터이기 때문에 언제든지 JPEG 데이터가 사라질 수 있다. 하지만 이처럼 Free 상태의 영역에 남겨진 데이터를 통해 어떤 데이터가 존재했었는지를 알 수 있다.
Close
FAT 파일 시스템에서 파일 삭제시 일어나는 변화를 관찰해봤다. 이러한 변화는 달리 말하면 파일이 생성될 때 일어나는 변화이기도 하다. 특히 FAT32에서 성능 향상을 위해 도입된 FS Info 내용이 변하는 모습은 매우 흥미로웠다. 이를 통해 FS Info가 어떤 방식으로 FAT32의 성능을 향상시키는 지 알 수 있었다.