콤푸타/디지털포렌식
MBR과 GPT in NTFS 파일 시스템 (2)
어둠의다크
2024. 7. 7. 08:05
지난 포스팅
이번 포스팅에서도 MBR에 대한 포스팅을 계속 해 보겠다.
지난시간에 MBR과 관련된 중요한 내용들은 거의 설명했다. 다만 아직 VBR(Volume Boot Record)이라는 녀석이 남아있기에 이번에는 이녀석을 짚고 넘어가보고자 한다.
VBR(Volume Boot Record)
지난 시간에 우리는 MBR이 무엇인지, 이것이 어디에 위치하는지, 또 MBR 데이터를 어떻게 분석하는지에 관해 얘기해보았다. MBR에 대한 내용들을 잊지 않길 바라며 이번에는 디스크 내부에 존재하는 논리적인 영역인 파티션으로 들어가보겠다.

들어가기 전에 전체적인 개요를 다시 한번 설명해보자면 위 그림과 같다. (정확하게는 조금 다르긴 하지만, 이는 나중에 설명하겠다)
우리는 Disk와 Partition을 구분하고 이해해야 한다.
Disk의 첫 번째 섹터에 있는 것은 MBR(Master Boot Record)
Partition의 첫 번째 섹터에 있는 것은 VBR(Volume Boot Record) 다.
그리고 이 부팅가능한 파티션의 첫 번째 섹터(offset)는 MBR의 Partition Table로부터 찾아갈 수 있다.
지난시간에 다루었던 내용들은 여기까지다.
자 그러면 이 VBR은 왜 필요한 것일까. 지난 시간에 분석했던 MBR 어셈블리 부트 코드의 마지막 단계는 부팅 가능한 파티션의 첫 번째 섹터를 리얼모드 메모리의 '0000:7c00'주소에 적재하는 것이다. 그것 외에는 커널을 메모리에 로드하는 기능이 아무것도 없었다. 따라서 실제 커널을 로드하는 기능은 이 VBR에 존재하는 것이다.
실제 VBR 데이터는 다음과 같다.

자 우리가 확인하려고 하는 VBR 데이터는 3,300,000 에서 시작하는 섹터 104,448에 있다. 그런데이상하게 바로 위 섹터에도 VBR같은 데이터가 기록되어 있는 것을 볼 수 있다. 저것은 도대체 무엇이란 말인가..
답은 바로 VBR 백업본이다. 즉 이 앞 파티션의 마지막섹터(=VBR 백업) 이라 생각하면 된다. NTFS 파일 시스템에서는 파티션의 마지막 섹터에 VBR 백업본을 기록해둔다. 현재 분석 중인 파티션 에서도 마지막 섹터를 찾아가면 VBR 백업본을 확인할 수있다.

VBR 첫 섹터 구조는 다음과 같다

CPU Instruction (0x00 ~ 0x02)
처음 3 Byte는 0x52 주소 뒤로 점프하라는 명령이다. 명령이 끝나는 위치 0x02에 0x52를 더하면0x54가 되고 0x54 위치부터 부트 코드가 시작된다.
OEM ID (0x03 ~ 0x10)
그 다음에는 4E 54 46 53 20 20 20 20 라는 고정값이 온다. 'NTFS 라는 파일 시스템 이름을 확인할 수 있다.
BPB(BIOS Parameter Block) or EBPB(Extended BPB) (0x11 ~ 0x53)
여기서 본격적인 파티션 정보를 확인할 수있다. 주된 정보로는 섹터 크기, 클러스터 당 섹터 수, $MFT의 위치, 전체 섹터 수 등이 있다. 상세한 데이터 테이블은 다음과 같다.

위 그림에서 BPB의 상세 구조를 확인할 수 있다. 중요하다고 생각되는 부분은 붉게 표현했다.
Boot Code(Boot Strap)
JAVA Bootstrap 과는 다른 Boot Strap이다. 여기서 부트 코드가 동작해 실제 메모리에 커널을 적재하는 역할을 한다. 오른쪽 스트링 데이터에서 에러 메세지와 BOOTMGR, Ctrl+Alt+Del 등을 확인할 수있다.
Signature
MBR과 마찬가지로 55 AA 라는 시그니쳐 값을 가진다.
VBR 응용하기
앞서 VBR에서는 여러가지 정보들을 확인할 수 있다고 언급했다. 그래서 VBR에서 확인 가능한 정보들로 백업 VBR 섹터와 $MFT를 찾아보겠다.

앞서 파티션의 마지막 섹터에는 VBR의 사본이 존재한다고 했다. 마지막 섹터를 계산하는 방법은 다음과 같다.
Last Sector = Total Sector * Sector Size + offset
= 0x4FE 5FFF * 0x200 + 0x330 0000
= 0x9 FFEF FE00

이 주소를 구할 수 있고, 위 그림과같이 VBR 사본이 존재하는 것을 확인 가능하다.
NTFS 파일 시스템에서는 파일시스템 내에 존재하는 모든 파일들의 메타데이터를 $MFT라는 데이터베이스에 기록하고있다. 이 $MFT를 찾는 방법은 다음과 같다.
$MFT Sector = Cluster Number * Sector per Cluster * Sector Size + offset
= 0xC 0000 * 0x8 * 0x200 + 0x330 0000
= 0xC330 0000

위 사진과 같이 $MFT 엔트리의 시그니쳐 'FILE'을 확인할 수 있다.
BPB 참고
VBR 참고