파일 시스템 개념 정리

2018. 7. 5. 14:51악성코드 분석

[1] NTFS

NTFS New Technology File System

파일 시스템이란 디지털 데이터를 효과적으로 관리하기 위해 파일을 체계적으로 기록하는 방식

파일이 어디에 저장되어 있는지 조직화하고 사용자의 데이터를 구조적으로 정의하도록 한다

파일을 빠르게 읽기, 쓰기, 삭제 등의 기본적인 기능을 원할히 수행하도록 도와주며, 커널영역에서 동작한다


디스크 - 논리디스크와 물리디스크로 나뉜다


논리디스크( C:\ ) - NTFS

물리디스크 - 하드디스크 


cluster - 여러개의 sector를 모아서 만든 논리적인 저장 단위

윈도우는 클러스터 단위로 파일을 저장한다

클러스터는 디스크의 용량에 따라서 크기가 다르다

디스크의 용량과 클러스터의 단위의 차이로 인해서 슬랙공간이 생성된다


대부분의 NTFS에서는 4KB(4096byte)가 하나의 클러스터의 크기이다

이 때, 한 섹터는 512byte이고, 하나의 클러스터는 8개의 섹터로 구성된다


[2] MBR

하드디스크를 용도에 다라 여러개의 파티션으로 나누어서 사용할 수 있다

각 파티션은 하나의 물리 디스크로부터 관리가 필요하고 MBR구조로 관리한다



PC의 Boot

POST -> BIOS -> <1>디스크의 MBR의 부트코드와 파티션정보를 통해서 부팅 가능한 파티션을 찾고 VBR에 제어권을 넘긴다 -> <2>VBR

-> KERNEL > MEMORY -> OS -> Application



MBR은 물리디스크(저장매체)의 첫 번째 섹터에 위치하며 512Byte의 크기를 가진다


MBR(512) = BootCode(446) + Signature(2) + PartitionTable(64)


BootCode - 파티션 테이블에서 부팅 가능한 파티션을 찾아 해당 파티션의 부트섹터(VBR)를 호출한다

PartitionTable

- BootFlag : 부팅의 가능여부 0x80(가능) or 0x00(불가능)

- PartitionType : 파티션의 종류 0x07: exFAT, UNIX, NTFS / 0x81 : Linux / 0x86 : FAT16

- Starting LBA Address : 해당 파티션이 시작되는 섹터의 위치

- Size in Sector : 파티션의 크기, 즉 섹터의 개수


섹터의 크기가 512byte일 때, LBA addr의 값을 곱하면 파티션의 시작위치를 얻을 수 있다



VBR (Volume Boot Record) / NTFS = VBR + MFT + DataArea

VBR의 크기는 클러스터의 크기에 의존한다

대부분의 NTFS에서 클러스터의 크기는 4096byte이고 섹터의 크기는 512byte이다

이 때, VBR의 크기는 4096byte (8sector)이다


VBR

- Jump instruction : jmp [byte] - byte만큼 뒤에 BootCode가 시작되는 것을 알려준다

- OEM ID : NTFS를 나타낸다

- BIOS Parameter Block (BPB) : 클러스터의 크기, 루트 디렉터리의 위치, 총 섹터 등 파일시스템의 정보들이 위치

- Boot Code : 해당 볼륨의 운영체제를 로드하기 위한 명령어가 위치

- Signature : 


* BPB에 MFT가 시작하는 클러스트의 논리 번호가 존재하여 MFT의 위치로 찾아갈 수 있다

= BPB의 0x30의 값이 0x00c00000 이라면,

MFT Offset = 클러스터값(0xc00000) * 클러스터당 섹터개수(8) * 섹터크기(0x200) + 현재 VBR의 offset

( = $MFT ) - 모든 파일의 메타 정보를 가지고 있다 




MFT (Master File Table)

NTFS는 파일이나 디렉터리, 메타 정보를 모두 파일의 형태로 관리한다

각 파일의 위치, 속성, 이름, 크기 등의 메타정보는 MFT Entry라는 특별한 구조로 저장된다

MFT는 NTFS상에 존재하는 모든 파일의 MFT Entry의 모음이다


MFT Entry = MFT Entry Header + FixupArray + Attributes + EndMarker + Unused Space


MFT Entry Header : 시퀀스번호, 하드링크 수, 사용중 or 할당된 Entry크기, NextAttributeID 등등..


MFT Attributes

가장 중요한 3속성

- $STANDARD_INFORMATION : 파일의 생성,접근,수정 시간, 소유자 등의 일반적인 정보

- $FILE_NAME : 파일이름, 파일의 생성,접근,수정 시간

- $DATA : 파일 내용


속성은 속성헤더와 속성내용으로 구성되는데 크기에 따라서 Resident와 Non-resident로 나뉜다


Non-resident는 속성 내용이 외부 클러스터에 저장되어 있어서 해당 클러스터에 대한 정보를 담고있는 런리스트 정보가 필요하다

속성 내용에 클러스터는 비연속적으로 할당된다

이를 효과적으로 관리하기 위해서 Cluster Run을 사용한다 - offset,할당한 크기를 활용