파일시스템에 대해서는 여기를 참고
💡 파일시스템과 디지털 포렌식
1. 파일시스템에 대한 정보 없이는 데이터의 저장 위치 알아내기 어려움
2. 데이터의 위치를 알아냈더라도, 메타데이터는 파일의 데이터와 따로 저장됨
→ 메타데이터를 알아내기 위해 파일시스템 구조에 대한 이해가 필요
3. 파일의 변경 이력을 가져오거나 삭제된 파일 복구하는 일이 가능해짐
→ 대부분의 파일시스템은 저널링 기능을 지원. 저널링 과정에서 생성된 로그는 디지털 포렌식의 주요분석대상
💡 파일시스템 공부의 필요성
1. 새 공격기법에 대한 심츠적 분석 가능
2. 도구를 온전히 신뢰할 수 없음. 파일시스템 분석을 통해 도구에서 찾아내지 못한 흔적을 발견할지도
3. 다른 아티팩트를 분석할 때에도 큰 도움이 될 수 있음
| 운영체제 | 파일시스템 | 특징 |
|---|---|---|
| Windows | NTFS | Windows NT 3.1 이후부터 현재까지 사용중 |
| ReFS | NTFS 대체 위한 차세대 파일시스템 | |
| Linux | EXT4 | Linux에서 2006부터 사용중 |
| Unix | UFS | Unix계열 운영체제에서 사용 |
| macOS | HFS+ / APFS | Apple 구형 / 신형 파일시스템 |
| 공통 | FAT / FAT32 | 초기 Windows가 사용. 현재는 USB에 주로 씀 |
| exFAT | FAT32의 크기 단점 개선 |
NTFS (New Technology File System)
ReFS (Resilient File System)
EXT4 (Extended File System4)
UFS (Unix File System)
HFS+ (Hierarchical File System Extended)
APFS (Apple File System)
FAT32 (File Allocation Table)
exFAT (Extended File Allocation Table)
Master Boot Record. 디스크의 가장 첫 섹터(512바이트)에 저장되는 데이터
💡 섹터 : 디스크 최소 기억 단위. 전통적 HDD에서 512바이트
저장장치 파티션 정보, 각 파티션에 설치된 볼륨 정보 가지고있음
↑ → → → → → → → → ↓
BIOS - POST → MBR | MBR Slack | VBR | Volume Data 💡Slack 슬랙
: 파일시스템/데이터 구조의 빈 공간을 의미. 파일슬랙, RAM슬랙 등 다양한 슬랙 존재
*HxD를 관리자 권한으로 실행 후 도구 > 디스크 열기 로 확인가능 
부트코드 0x0 - 0x1BD : 부팅과정에서 이용되는 코드
파티션 테이블 엔트리 #1 ~ #4 0x1BE - 0x1CD, 0x1CE - 0x1DD, 0x1DE - 0x1ED, 0x1EE - 0x1FD : 각 파티션 정보(16바이트)
0x0 - 0x0 (1) : 부팅불가0x00, 부팅가능0x800x1 - 0x3 (3) : CHS방식 기반 시작 주소(섹터)0x4 - 0x4 (1) : NTFS0x07, FAT320x0C...0x5 - 0x7 (3) : CHS방식 기반 끝 주소(섹터)0x8 - 0xB (4) : LBA방식 기반 시작 주소(섹터)0xC - 0xF (4) : 섹터개수 * 512 = 전체 섹터 크기 
시그니처 0xFE - 0x1FF : 0x55 0xAA
💡 CHS(Cylinder-Head-Sector)와 LBA(Logical Block Addressing)
HDD 안에서 주소 표현 방식.
- CHS : HDD의 실린더, 헤드, 섹터라는 물리적 특성 이용해 표기 (현재는 거의 사용X)
- LBA : 저장장치 내의 모든 섹터들을 일차원적으로 배열해 순서대로 숫자 지정해 주소 계산
File Allocation Table : 파일이 저장되는 위치를 기록한 테이블 

0x0 - 0x2 : 부트코드로 점프
- FAT32 파일시스템을 가진 것이 USB밖에 없어서, 저장용도로 사용하던 USB를 사용했다.
0x00-0x03값이EB 00 90인데, 이는 굳이 점프해서 부트코드를 실행하지 않아도 된다는 뜻이다. 운영체제 부팅을 위한 용도는EB 58 90으로 시작할텐데, 이는 현재위치에서 0x58만큼 즉 88바이트만큼 점프하라는 소리이다.
0x3 - 0x5A : 볼륨 전반적인 설정 저장. 디스크의 신분증 
- OEM ID : 포맷을 수행한 운영체제나 도구의 이름 적는 옵션 영역. FAT32의 경우
MSDOS5.0으로 고정(윈도우 탐색기로 포맷)
*공장 출고시 자체툴로 초기화하거나, 서드파티 둘, 리눅스, AOS에서 포맷 시 다른 값이나 공백일 수도 있다.- Reserved Sector :
0x12. FAT영역 이전에 존재하는 섹터 수. FAT영역은 0x12 * 0x200 =0x2400에 위치- Total Sector 32 :
0x394DFE0. 볼륨 총 섹터 수- FAT Size 32 :
0x3947. FAT Area 1개의 크기. 0x3947 * 0x200 =0x728E00- Volume Serial Number :
0xEED5492B. 볼륨 식별하는 4바이트로 구성된 숫자- Voulme Label :
NO NAME. 사용자가 볼륨에 붙인 이름- File System Type :
FAT32
0x5B - 0x1FD : 볼륨 부트 코드 0x1FE - 0x1FF : 0x55 0xAAFAT Table 2개(FAT#1, FAT#2)가 연속으로 존재하는 영역. FAT Table은 파일시스템에 존재하는 파일 및 폴더에 대한 메타데이터를 저장하는 공간이다.
*2개인 이유는 원본과, 백업
FAT Area 오프셋 = VBR 오프셋 + Reserved Sector * 섹터크기(FAT#1)
(FAT#2는 FAT#1섹터 + FAT Size로 이동해 접근할 수 있음)
여러개의 엔트리로 구성되며, 각각의 엔트리는 Data Area 클러스터의 할당상태를 나타냄
💡 엔트리 Entry
- '항목'이나 '기록' (사전적 정의)
- 디스크의 각 방(클러스터)이 현재 어떤 상태인지 적어놓은 장부의 한 칸
4바이트마다 1개의 엔트리를 구성. 0, 1번 엔트리는 사용하지 않는다(시스템에 의해 사용되는 특별한 엔트리).
Data Area의 클러스터는 0x1000바이트 크기를 가지고, FAT Area의 하나의 엔트리가 하나의 클러스터와7 1:1대응 (FAT에서는 엔트리번호 == 클러스터 번호)
0x00 00 00 00 : Unassigned
0x(Entry Number) : Allocated (다음에 읽을 엔트리 넘버)
0xFF FF FF 0F : End of Marker
0xFF FF FF F7 : Bad Cluster

Data Area Offset
= VBR Offset + Reserved Sector * Sector size + FAT size * Sector size * 2
→ FAT32의 루트 디렉토리가 위치. 2번 클러스터이며, FAT 테이블의 2번 엔트리에 대응
0 + 0x12 * 0x200 + 0x3947 * 0x200 * 2 = 0xE54000
Root Directory에는 Directory Entry라는 구조가 반복되어 저장된다. 이미지는 Directory Entry의 구조이다.

*LFN의 경우 0, 1, 2, 3번 비트를 모두 켜 0x0F 고정이다. LFN조각이라는 신호가 된다.

디렉토리 엔트리는 이름을 표현할 수 있는 필드가 8바이트이다. 첫번째 바이트는 파일이 파일시스템 상에 존재할 경우 이름을 표현하기 위해 사용되고, 삭제되었을 경우 0xE5로 파일이 삭제되었음을 나타낸다.
💡 체크섬 생성은 SFN의 11바이트(이름8+확장자3)을 이용한다.
- sum = 0
- sum의 비트를 오른쪽으로 비트 회전하여 한 문자의 아스키값을 더한다.
- 2번을 반복하며 11개를 다 돌리고 남은 최종 1바이트가 체크섬이 된다.
Data Area 찾아가기
원본 데이터 주소 : Root Directory + 클러스터 크기 * (클러스터 번호 - 2)
💡
Ctrl + G: 오프셋 이동
CAN0226 폴더 - First Cluster High&Low가 각각 0x001B, 0x1863이므로 원본은 0x1B1863번째 클러스터에 있다. (상위2바이트가 0x0000인 경우 클러스터 번호가 작아 하위2바이트만으로 충분히 표현 가능한 것이다.)
0xE54000 + 0x4000 * (0x1B1863 - 2) = 0xE54000 + 0x6C6184000 = 0x6C6FD8000
forensic-LFNname.txt 파일 - 0x50006번 클러스터에 위치.
0xE54000 + 0x4000 * (0x50006 - 2) = 0xE54000 + 0x140010000 = 0x140E64000 
❓
1. 왜 SFN엔 무조건 대문자로 저장이되는가?
-> SFN은 옛날방식, LFN은 최근방식을 따른다. 옛날 방식에서는 대소문자를 굳이 구별해서 저장할 여유가 없었기에 시스템적으로 파일 이름은 무조건 대문자로 처리했다. (대소문자를 구분하려면 'a'인지 'A'인지 매번 검사해야함)
2. 0x00이 왜 사이사이에 존재하는가?
-> 유니코드를 이용하기 때문에 U+0066을 저장해 둔 것이다. 반면 SFN은 아스키를 사용하기에 빈틈없이 붙어서 보인다.
3. 왜 SFN위에 LFN이 위치하지?
-> OS가 디렉토리를 읽을 때 SFN바로 위에 있는 LFN들을 역순으로 수집하여 이름을 완성하기 때문이다.
4. 두번째 LFN의 값이 0x42인 이유?
-> 두번째라는 0x02에 마지막 조각이라는 신호인 0x40이 합쳐진 것이다.
❓ 한글 이름의 파일명일 경우
파일 추가해줬다.
0xE543C0이 추가한 한국어 파일인듯 하다... (확장자:TXT, 두줄위에 01, 두줄위에 42)
디렉토리 엔트리에서는 완성형 한글코드 값을 사용한다。
안 0xBEC8, 녕 0xB3E7, 하 0xC7CF, 세 0xBCBC, 요 0xBFE4, 반 0xB9DD, 갑 0xB0A9, 습 0xBDC0, 니 0xB4CF, 다 0xB4D9 완성형 한글코드안녕하~TXT 로 저장되는 것 같다.(리틀엔디언 아님. 기본적으로 1바이트씩 순서대로읽음)
LFN은 유니코드다. (리틀엔디언 적용된다.
48 C5는 U+C548로 해석) 유니코드 디코더
이미지 분석 도구들은 파일시스템 구조를 하나하나 분석해 사용자에게 보여줌.
FTK Imager로 파일을 추출하면 데이터 뿐만 아니라 메타데이터까지 싯템에서 추출하여, 추출된 파일에 삽입해줌
❗ 시간 값이 차이날 수 있는데, FTK Imager의 시간은 UTC+0시간이고, Windows탐색기는 사용자의 설정에 따른 시간을 보여주므로, 한국의 유저인 경우 UTC+9로 보여주어 FTK Imager의 값보다 9시간 더 빠르다.