File System

qwq·2025년 12월 30일

Forensics

목록 보기
1/5
post-thumbnail

1. FAT32

FAT는 File Allocation Table이라고 하며, 파일이 저장되는 위치를 기록한다. 먼저 크게 3가지로 나눌 수 있는데,

  • Reserved Area : 메타데이터가 저장되어 있다.
  • FAT Area : 파일이 저장되는 위치를 기록한다.
  • Data Area : FAT로부터 연결되어, 실제 파일이나 폴더가 위치한다.

Reserved Area

주로 예약된 섹터는

  • 0번 - Boot Sector
  • 1번 - FSInfo
  • 2번 - Boot Strap
  • 6, 7, 8번 - 각각 Boot Sector, FSInfo, Boot Strap의 Backup

이다.

섹터의 크기는 대부분 512(0x200)바이트이다.

Boot Sector

  • Jump Code - Boot Code로 점프시킨다. EB ** 90 3바이트이며, **에 들어갈 바이트만큼 0x02로부터 이동한 위치의 바로 다음 바이트부터가 Boot Code 이다. 위의 그림에서는 **은 58이며, 0x02+0x58의 바로 다음 바이트인 0x5A부터 Boot Code 임을 확인할 수 있다.
  • BPB(Bios Parameter Block) - 볼륨의 전반적인 설정이 들어있다.
  • Boot Code - 볼륨의 Boot Code이다.
  • Signature - 55 AA의 2바이트 고정값을 가진다.

BPB에 대한 상세한 내용은 아래와 같다.

  • OEM ID - FAT32의 경우 MSDOS5.0으로 고정된다.
  • Reserved Sector - FAT Area 이전에 존재하는 섹터의 수를 나타낸다. 이 값에 섹터의 크기를 곱하면 FAT Area의 오프셋을 알 수 있다.
  • Total Sector 32 - 볼륨의 총 섹터 수이다.
  • FAT Size 32 - FAT Area의 섹터 수이다.
  • Volume Serial Number - 볼륨을 식별하는 4바이트 정수이다.
  • Volume Label - 사용자가 볼륨에 붙이는 이름이다.
  • File System Type - FAT32 로 고정된다.

FSInfo

  • Signature(0x00~0x03) - 52 52 61 41로 고정된다.
  • Signature(0x1E4~0x1E7) - 72 72 41 61로 고정된다.
  • Free Clusters 32 - 사용 가능한 클러스터의 수를 나타낸다.
  • Next Free Cluster - 사용 가능한 클러스터의 시작 위치를 나타낸다.
  • Signature(0x1FE~0x1FF) - 55 AA로 고정된다.

Boot Strap

Boot Sector의 Boot Code 영역이 부족할 경우 이곳에 저장되어 추가적으로 사용할 수 있도록 한다.

FAT Area

FAT Area는 FAT Table 2개(원본 1, 백업 1)로 이루어져 있으며, 4바이트 단위의 데이터로 Data Area의 클러스터의 상태를 나타낸다.

  • 0x?000 0000 - 미할당 상태이다.
  • 0x?000 0002 ~ 0x?FFF FFEF - 클러스터가 점유하고 있는 파일의 다음 데이터가 있는 클러스터를 가리킨다.
  • 0x?FFF FFF7 - 불량 클러스터를 가리킨다.
  • 0x?FFF FFF8 ~ 0x?FFF FFFF - 파일에 할당된 마지막 클러스터를 가리킨다. 파일이 하나의 클러스터만 사용한다면 위의 0x?000 0002 ~ 0x?FFF FFEF에 해당하는 바이트열은 없고 이 바이트열만 있다.

Data Area

Data Area의 위치는 2개의 FAT Table 바로 다음이며, 여기는 루트 디렉토리(2번 클러스터)에 대한 정보부터 시작한다. FAT Table의 엔트리 번호와 Data Area의 클러스터 번호는 동일하고 아래의 Directory Entry 구조에 의해 파일의 클러스터 번호와 메타데이터를 나타낸다.

  • File Name - 파일의 이름이다.
  • Extension - 파일의 확장자이다.
  • Attr - Directory Entry의 속성을 나타낸다.
    • 0x01 - Read Only
    • 0x02 - Hidden File
    • 0x04 - System File
    • 0x08 - Volume label
    • 0x0F - Long File Name
    • 0x10 - Directory
    • 0x20 - Archive
  • Created Time - 파일이 생성된 시간
  • Created Date - 파일이 생성된 날짜
  • Last Accessed Date - 파일에 마지막으로 접근한 날짜
  • Starting Cluster High 2 bytes - 시작 클러스터 번호의 상위 2바이트. FAT16과의 호환을 위해 2바이트(16비트)로 나눠 저장한다.
  • Last Modified Time - 파일을 마지막으로 수정한 시간
  • Last Modified Date - 파일을 마지막으로 수정한 날짜
  • Starting Cluster Low 2 bytes - 시작 클러스터 번호의 하위 2바이트
  • File Size - 파일의 크기

2. NTFS

NTFS(New Technology FIle System)는 Windows 운영체제에서 사용되는 파일 시스템으로, 파일 및 폴더 암호화, 손상된 파일 복구 등의 기능을 지원한다.

VBR

VBR은 FAT32에서의 Boot Sector의 내용과 유사하나 BPB의 내용이 다르다.

  • OEM ID - NTFS 로 고정된다.
  • Total Sectors - 볼륨의 총 섹터 수이다.
  • Start Cluster for $MFT - MFT에 접근하기 위한 MFT의 첫 번째 클러스터의 위치이다.
  • Volume Serial Number - 볼륨을 식별하는 8바이트 정수이다.

NTFS의 최후방에 VBR에 대한 백업을 포함한다.

MFT(Master File Table)

MFT 영역은 0x200크기의 MFT 엔트리가 계속해서 반복되는 구조로 되어있으며, 여러 메타데이터와 사용 불가한 엔트리 번호를 제외하고 24번 엔트리부터 사용할 수 있다.

엔트리 번호이름설명
0$MFTMFT를 담고 있는 파일
1$MFTMirrMFT의 백업
2$LogFileTransaction 저널 기록
3$Volume볼륨의 레이블, 버전 등 볼륨에 대한 정보 저장
4$AttrDef인자 값, 이름, 크기 등 여러 속성 값 저장
5.파일 시스템의 root
6$Bitmap파일 시스템의 클러스터 할당 관리 정보 저장
7$Boot부트 레코드 영역의 정보 저장
8$BadClus불량 클러스터 정보 저장
9$Secure파일의 보안과 접근 권한에 대한 정보 저장
10$Upcase모든 유니코드 문자의 대문자
11$Extend추가적인 확장을 담고 있는 디렉토리
12~15-사용하지 않음
16~23-사용하지 않음
-$ObjID파일 고유의 ID정보 저장
-$Quota사용량 정보 저장(Win 2000부터)
-$Reparse RReparse Point에 대한 정보 저장(Win 2000부터)
-$UsnJrnl저널링 기록 저장
24~사용 가능일반 파일 또는 디렉토리

MFT 엔트리의 구조는 다음과 같다.

  • MFT Entry Header - MFT 엔트리의 헤더 부분이다. 현재 MFT 엔트리에 대한 메타데이터를 포함한다. 아래는 주요 정보다.
    • Signature(0x00~0x03) - 46 49 4C 45(FILE), 42 41 41 44(BAAD) 둘 중 하나로, 파일/폴더인지, 손상되었는지 나타낸다.
    • Attribute(0x14~0x15) - Attribute Area의 시작 위치를 나타낸다. 위 그림의 경우 38 00일 것이다.
    • MFT Entry Flag(0x16~0x17) - IN_USE, IS_DIRECTORY등의 flag가 OR 연산되어 저장된다.
    • Number of this MFT Entry(0x2C~0x2F) - 현재 MFT 엔트리의 번호이다.
  • Fix-up Array - 엔트리의 무결성 검사를 위한 부분이다.
  • Attribute Area - 가변 길이일 수 있다. Attribute ID를 의미하는 바이트가 각 Attribute 앞에 명시되어, 뒤의 내용에 해당 ID에 맞는 방식으로 해석된다.
Attribute Type ID의미설명
0x10$STANDARD_INFORMATION생성/수정 시간, 파일 속성(Read-only, Hidden 등) 들어 있음
0x20$ATTRIBUTE_LIST엔트리가 여러 개로 분산될 때 속성 목록을 모아둔 것
0x30$FILE_NAME파일 이름(짧은/긴 이름), 부모 디렉터리 정보
0x40$OBJECT_ID분산 시스템용 객체 ID
0x50$SECURITY_DESCRIPTORACL, 권한, 보안 정보
0x60$VOLUME_NAME볼륨 이름
0x70$VOLUME_INFORMATIONNTFS 버전, 플래그 등 볼륨 정보
0x80$DATA파일 내용 저장
0x90$INDEX_ROOTB+Tree 루트, 디렉터리 구조를 관리
0xA0$INDEX_ALLOCATION큰 디렉터리에서 추가 인덱스 블록
0xB0$BITMAP인덱스 배열 사용 여부 비트맵
0xC0$REPARSE_POINT링크, 심볼릭 링크, 마운트 포인트 등
0xD0$EA_INFORMATION확장 속성(EA) 관련 정보
0xE0$EA실제 확장 속성 데이터
0xF0$PROPERTY_SETWindows Property 저장
0x100$LOGGED_UTILITY_STREAM트랜잭션 로그
  • End Marker - FF FF FF FF의 4바이트 고정값을 가진다. MFT 엔트리의 끝을 나타낸다.

Data Area

파일의 크기가 약 700바이트 이하라면 MFT에 파일 데이터를 넣어 저장하는 것으로 충분하지만, 그보다 큰 경우에 Data Area에 파일 데이터가 저장된다.

Data Area에 있는 파일의 클러스터의 위치는 MFT 엔트리의 Attribute Area에 저장되어 있는데, Attribute ID 0x80, 즉 $DATA의 끝 부분에 있는 Cluster Run에 저장된다.

Cluster Run이 위와 같이 있다고 할 때, 첫 번째 바이트의 상위 4비트는 클러스터의 시작점인 Run Offset을, 하위 4비트는 클러스터의 수인 Run Length를 나타낸다. 예를 들어 첫 번째 바이트(0x00)가 32라면, 그 다음 바이트부터 2개(0x01, 0x02)를 가져와 클러스터의 개수로 인식하고, 그 다음 바이트부터 3개(0x03~0x05)를 가져와 클러스터의 시작 오프셋으로 인식한다.

profile
QwQ

0개의 댓글