안 쓰던 블로그

[포렌식] NTFS 파일 시스템 구조 (NTFS에서 파일 복구 방법) 본문

CTF/Forensic

[포렌식] NTFS 파일 시스템 구조 (NTFS에서 파일 복구 방법)

proqk 2020. 8. 28. 20:41
반응형

FAT 파일 시스템 구조: https://foxtrotin.tistory.com/258

 

NTFS는 현재 윈도우즈에서 가장 많이 사용되는 파일 시스템

Spec이 완전히 공개되지 않음. 마이크로소프트에서 서버용 파일시스템으로 사용하기 위해 만들었다

 

Boot Record: FAT File System보다 간단한 구조

MFT: NTFS 파일 시스템의 구조를 가지고 있음. 실제 Data영역에 넘어갈 수 있는 정보를 가짐

Data: 데이터가 저장되는 영역, 클러스터 Cluster단위로 읽고 쓴다


NTFS Layout

1) Boot Record: BR

NTFS의 내용 중 유일하게 고정되어 있는 구조체

BR로 MFT에 접근

 

섹터 당 바이트 수, 클러스터 당 섹터 수, 볼륨 크기, MFT 등등의 정보를 가진다

 

BR 구조를 한 번 봅시다

NTFS 디스크 이미지 파일을 열면 맨 처음 보이는 섹터에 저만큼이 MBR이다

 

첫 번째 파티션을 보면 08 00 00 00이라는 곳에 있다는 것을 할 수 있다

두 번째 파티션도 있다. 세, 네번째는 없다

 

첫 번째 파티션 위치 HEX 00 00 00 08 = DEC 2048 번째 섹터로 바로 점프한다

더 자세한 분석을 위해 2048번째 섹터의 512바이트 정보를 엑셀로 불러온다

 

(여기서는 칸만 나눴음 자세한 설명은 이쪽 참고: https://foxtrotin.tistory.com/258 )

3바이트: Jump boot code

그 뒤에 OEM Name

Bytes Per Sector: 섹터 당 바이트 수. 02 00=512바이트

Sector Per Cluster: 사진에서는 08이므로 8섹터 당 1클러스터

Start of MFT: MFT로 넘어갈 수 있게 해 주는 부분. 제일 중요함

 

이제 Start of MFT를 분석해서 파일 복구를 해 볼건데, 일단 MFT에 대해 봐야 한다


MFT와 MFT Entry

아까 Start of MFT가 중요하다는 얘기를 했는데 저게 왜 중요한지를 알아봅시다

 

일단 MFT에 대해 알아보면, MFT는 이런 구조로 되어 있고 0번부터 16번까지 있다

MFT 하나를 떼서 보면 각각이 오른쪽 File record로 되어 있다

그리고 이 파일 레코드에는

이정도에 준하는 정보가 들어 있다

 

정리하자면 MFT는 모든 파일과 디렉토리에 대한 정보를 담고 있는 테이블이고

위치는 상관 없으나 주로 Boot Record 뒤에 위치하는 편인 테이블이다

그리고 그 MFT는 아래처럼 트리 구조로 되어 있다

MFT Entry는 Attrubute들로 이루어져있다->Attribute들은 3가지 정보를 가진다->3가지 정보

 

여기서 MFT Entry와 Attribute에 대해서 좀만 더 봅시다

 

MFT Entry

MFT는 여러 개의 Entry를 구성한다

파일이나 디렉토리는 최소 하나의 MFT Entry를 가져야 한다

Entry 0~15까지는 파일 시스템 관리를 위해 예약

Entry 24이후부터 일반 파일 해당

일반적으로 1KB크기를 가진다

 

Entry는 아래처럼 구성된다

그리고 이게 위치가 가변적이라 분석을 할 때 정리를 하지 않으면 찾아갈 수가 없다

 

Attribute

MFT EntryMFT Entry Header + Attribute구성된다

파일이나 디렉토리의 모든 정보는 Attribute의 형태로 저장된다

그리고 Attribute는 또 두 가지 종류로 나눠진다

1) Resident Attribute: Attribute안에다가 모든 데이터를 넣을 수 있다. Attribute Header 뒤에 바로 내용이 온다

2) Non-Resident Attribute: Attribute안에다가 모두 넣을 수 없어서 외부 다른 공간에 넣는다. Cluster Runs를 이용해서 하드 디스크 어딘가에 다른 클러스터에 저장되게 하고 여기엔 주소만 저장한다

 


Start of MFT 계산하기

뭐든 일단 MFT 주소를 알아야지 BR에서 넘어갈 수 있다

 

아까 위에 사진에서 해당 부분을 DEC로 변환

00 00 04 00 00 00 00 00 = DEC 2621144

값에다가 섹터 당 단위인 8을 곱한다 2621144 * 8 = 2097152

지금 위치한 파티션 위치 값을 더한다. 아까 첫 파티션 위치는 2048이었으니까 +2048

2097152 + 2048 = 2099200

 

2099200번째 섹터가 MFT 첫 번째 위치이다

 

공식으로 쓰면

(Start MFT * Sector per Cluster)+BR Sector

위에 예시로 보면,

Start MFT=262144

Sectir oer Cluster=8

BR Sector=2048

 

0 $MFT = 2099200 Sector

이 사진에서 0번째 $MFT가 2099200가 된다

그리고 MFT는 1KB 크기라고 했으니까 1024 바이트

 

이만큼이 실제로 1개의 MFT 엔트리를 의미한다

맨 아래를 가 보면 $MFTMirr가 있다

아까 사진에서 1번째 그거임

이렇게 순차적으로 들어가는 구조인 것

 

근데 이렇게 찾기는 쉽지 않으니까.. 여기서는 nftswalker라는 툴로 찾아본다

 

만약에 내가 39번에 있는 파일을 찾으려면 0번부터 39번까지 계속 내려가야 하지만..

계산으로 주소를 알고 넘어가면 된다

 

아까 MFT 당 1KB가 있다고 했으니까 512+512=1024만큼이라

0번 MFT에서 39번까지 가려면 39 * 2 = 78 떨어진 섹터에 39번 파일이 존재한다는 의미

+78해서 가 보면 실제로 존재한다

이게 무슨 의미냐면, 이제 여기서부터 2섹터를 내보내면 이 파일을 복구할 수 있다는 말

근데 이 2섹터 중에 어디가 실제 데이터인지는 확인해 보아야 한다

 

근데 일단 보기 위해 블록 잡고 .txt로 엑셀 불러오기


NTFS에서 파일을 복구하는 과정_1

중요하게 볼 부분은 Offset to First Attr값으로, 첫 번째 속성이 시작되는 공간이고 뒤에 속성값인 Attr Type ID를 가리킨다

 

초록 부분이 이제 Attr Type ID고 아까 본

이 정보가 하나씩 담겨 있는 것이다

중간 파란색은 $FILE_NAME 영역

노란색이 $DATA 영역

 

실제 파일 위치와 사이즈를 찾기 위해서 $DATA영역을 봐야 한다

노란 영역 중에 40 00부분이 Offset runlist 라는 부분이다

Offset runlist값이 40이니까 거기서부터 HEX 40 떨어진 곳을 가리킨다

 

runlist가 뭐냐면 runlist가 나오면 이 속성 안에다가 데이터를 다 담을 수 없으니 다른 공간에 저장하기 위한 목적으로 Non-resident를 썼다는 의미고,

아래부터 나오는 계산이 runlist 계산하는 방법이다

 

runlist 계산 방법

[3|1] 40 [41 FE 03]

31 중에 1이 40을 가리키며 runlist의 길이를 측정

31 중에 3이 뒤에 3개를 가리킨다

 

뒤에 3개를 리틀 엔디안으로 바꾸면 03 FE 41

03 FE 41 = 261697 에다가 8곱하면 2093576

2093576에다가 BR의 현재 주소값 2048을 더하면 2095624

2095624가 아아까 본 39번 png파일의 위치가 된다

 

이제 사이즈를 알아야 하는데, 31 40 41 FE 03 앞에 있는 8바이트짜리 Initalized Size of Attr Content부분이 사이즈이다

37 F2 03 00 00 00 00 00이니까, 03 F2 37 = DEC 258615

 

해당 섹터로 가서 파일 사이즈만큼 블록 잡고 png였으니까 png로 저장

복구 완료

 

NTFS에서 파일을 복구하는 과정_2

다른 파일을 한 번 더 복구해 본다

44번 파일을 복구한다

 

0에서 44*2만큼 떨어져 있기 때문에 0 $MFT값인 2099200 섹터에서 +88로 넘어간다

해당 파일 이름 보인다

 

그 아래 40 00으로 가리키는 부분 보이고

31도 보인다 1은 53가리키고 3이 가리키는 8B FE 03

03 FE 8B = DEC 261771

261771 * 8 = 2094168

2094168 + 2048 = 2096216 가 위치

 

그 앞에 5E 27 55가 사이즈니까 55 27 5E = DEC 337758 이 사이즈

 

위치 이동 후 잡고 저장

아까 zip이라고 했는데 사실 PNG였다

 

파일이 복구되었다


정리

runlist Offset을 찾고 기리키는 곳을 간다

Initalized Size of Attr Content가 사이즈

31이면 뒤에 한자리가 1이고 그 다음 3자리가 3인데 바이트 3개를 본다

runlist에 나오는 값(3개 HEX값)을 10진수로 바꾸고 * 클러스터값 8 + BR값 2048 = 데이터가 있는 위치

 


NTFS의 백업본 찾기

FAT에서는 FAT#2라고 백업본이 있었다

NTFS는 어디 있을까? MBR에 나와 있다

 

MBR을 보면 저 부분에 00 00 08 00이 시작 LBA고 00 40 00 00이 끝 LBA

00 00 08 00 = 2048

00 40 00 00 = 4194304

 

두 개 값을 더한다

4194304 + 2048 = 4196352

 

-1한다. 0부터 시작하기 때문에

4196352 - 1 = 4196351

 

이제 이동만 하면 된다

 

아래 2048섹터의 모습

 

이게 4196351의 모습

똑같다

 

근데 이미지 보면 아래에 파티션이 하나 더 있는데 이게 뭐냐면

이 디스크 이미지 파일에는 운이 좋게 두 번째 파티션이 그 아래 붙어 있다는 말이다

 

아무튼 NTFS시스템에서 MBR 백업본은 이렇게 찾을 수 있다

 

 

반응형
Comments