지난 번 $MFT의 구조에 관한 포스팅을 올렸다.
$MFT 파일의 헤더 구조 설명 중 'Fixup Array'에 관한 4 bytes의 오프셋이 존재한다고 했다. 이번 포스팅에서는 이 'Fixup Array'에 대해 알아보도록 하자.
NTFS에서의 Fixup Array는 데이터의 신뢰성을 높이고 무결성을 증명하기 위한 구조이다. 위에서 설명한 것처럼 MFT Entry를 기준으로 설명하자면, 모든 MFT Entry는 1,024 bytes의 고정된 크기를 가진다. 세부 구조는 아래와 같다.
NTFS에서 이렇게 MFT Entry처럼 저장하려는 데이터가 1개 이상의 섹터를 사용할 경우, 각 섹터의 마지막 2 bytes를 따로 떼어 저장하는데, 이를 Fixup 구조라고 한다. Fixup 구조를 사용함으로써 섹터 값의 변경 여부를 알 수 있는 것이다. MFT Entry를 포함해서 Fixup 구조를 사용하는 데이터들은 다음과 같다.
- MFT Entries
- INDEX Records
- RCRD Records
- RSTR Records
먼저 이론적으로 Fixup Array를 이해해보자.
MFT Entry처럼 어떤 데이터가 저장되는 데에 2개의 섹터가 필요한다고 가정해보자. 각 섹터의 마지막 2 bytes를 별도로 저장하는 Fixup 배열 구조를 사용하지 않을 때와 사용할 때를 비교해보면, Fixup 구조를 위한 별도의 시그니처를 만들어 원래의 각 섹터 내 2 bytes 데이터와 값을 바꾼다. 동시에 Fixup 배열에 해당 2 bytes의 값들을 저장함으로써 2개의 섹터에 변조 등 이상이 있는지를 점검할 수 있다.
직접 디스크에서 fixup array를 찾아보자. 현재 쓰고 있는 디스크의 $MFT 파일을 추출해보았다.
Offset to fixup array값(핑크색 박스)은 0x30이고, Number of entries in fixup array의 값(보라색 박스)은 0x03으로 총 6바이트가 fixup 구조에 의해 대신하는 값을 저장하는 배열 크기가 된다. 즉, 초록색 박스가 fixup array의 영역이다. 시그니처와 배열을 포함해 8 bytes 크기를 갖는다.
fixup array의 시그니처 값은 0x4001로 설정되어 있다 그러면 각 섹터의 마지막 2 bytes는 이 시그니처 값을 가져야 할 것이다.
섹터 0과 섹터1의 마지막 2 bytes값이 0x4001로 동일한 것을 확인했다.
fixup 구조로 대체된 값을 다시 원래대로 되돌리면 아래와 같다. 먼저 fixup 영역은 2 bytes 값인 0x4001을 3번 반복되게 가질 것이다. 총 크기가 8 bytes값이지만 MFT Entry는 2 섹터의 크기를 가지므로 Signature(2 bytes) + 0번 섹터의 마지막 2 bytes + 1번 섹터의 마지막 2 bytes = 0x4001 4001 4001의 값이 대체되기 전 값일 것이다.
동시에 0번 섹터의 마지막 2 bytes와 1번 섹터의 마지막 2 bytes가 원래 가졌던 값은 0x0000일 것이다.
이렇게 fixup 구조로 인해 값이 대체되기 전을 보았을 때 같은 시그니처 값이 3번 반복됨으로써 2개 섹터의 신뢰성을 보장할 수 있는 것이다.
'Forensics' 카테고리의 다른 글
[MITRE ATT&CK] Event Triggered Execution: Screensaver (0) | 2021.04.04 |
---|---|
$MFT로 파일의 절대 경로 찾기 (0) | 2021.03.28 |
$MFT Structure Analysis (0) | 2021.02.28 |
FAT32 File System Structure (0) | 2021.02.20 |
FAT32 포맷 VOL32 파티션 세팅 (0) | 2021.02.20 |