티스토리 뷰


 

1. NTFS 파일 삭제 원리

NTFS에서 파일이 삭제될 때, 데이터가 즉시 제거되는 것이 아니라 파일이 위치했던 MFT($MFT, Master File Table) 엔트리가 "사용 가능" 상태로 변경되고, 해당 파일이 저장된 클러스터가 새로운 데이터로 덮어쓰기될 수 있도록 예약된다. 즉  파일의 메타정보만 삭제하고 실제 데이터는 남아있게 된다. 그렇기에 파일을 삭제하여 메타정보가 지워 지더라도 실제 데이터가 남아 있으므로 삭제된 이후 파일을 복구할 수 있게 된다.

1.1 파일 삭제 과정

  1. MFT 엔트리 수정: 파일의 MFT 엔트리가 삭제됨으로 표시되지만 데이터는 여전히 디스크에 존재한다.
  2. 디렉토리 인덱스 업데이트: 파일이 속해 있던 디렉토리의 인덱스에서 해당 파일 정보가 제거된다.
  3. 클러스터 할당 해제: 파일이 저장된 클러스터가 사용 가능하다고 표시된다.
  4. Trim(SSD의 경우): SSD에서는 Trim 기능이 활성화되어 있으면 삭제된 파일의 데이터가 곧바로 제거될 수 있다.

2. 파일 복구 방법

삭제된 파일을 복구하려면 파일의 MFT 엔트리를 확인하고, Runlist 정보를 기반으로 파일 데이터가 저장된 섹터를 찾아야 한다.

2.1. MFT 엔트리 확인

  1. NTFS Walker 사용
    • NTFS Walker를 실행하여 삭제된 파일의 MFT 엔트리 번호를 확인한다.
    • 예를 들어, "Forensic_NTFS_Study_Day1.txt" 파일이 삭제된 후, MFT 엔트리 번호가 1209로 확인되었다.
  2. FTK Imager 활용
    • $MFT 파일을 덤프하여 010 Editor로 열어 파일 이름 및 속성을 확인한다.
    • MFT 엔트리에서 파일이 실제로 존재했던 위치를 찾아낼 수 있다.

2.2. Runlist를 통한 데이터 위치 찾기

Runlist는 파일이 저장된 위치를 나타내는 중요한 정보이다.

Runlist를 분석하여 실제 파일 데이터가 저장된 섹터를 계산할 수 있다.

Runlist 분석 예제

  • Runlist 값: 0x31 01 DD 3B 0C
  • Run Length: 0x01 (1개의 클러스터 길이)
  • Run Offset: 0x0C 3B DD

데이터 섹터 계산 공식

(Run Offset 값 * 클러스터 당 섹터 개수) + VBR 시작 섹터 = 데이터 섹터 위치

예제 계산:

0x0C 3B DD * 8 + 2048 = 6,416,104섹터

위의 계산을 통해 실제 파일 데이터가 위치한 섹터를 찾을 수 있다.

2.2. Runlist를 통한 데이터 위치 찾기

Runlist는 파일이 저장된 위치를 나타내는 중요한 정보이다. Runlist를 분석하여 실제 파일 데이터가 저장된 섹터를 계산할 수 있다.

Runlist 구조 및 의미

(예시)

Runlist 값 Run Length (클러스터 길이) Run Offset (파일 데이터 위치)
0x31 01 DD 3B 0C 0x01 (1개의 클러스터 길이) 0x0C 3B DD (데이터 시작 위치)
  • Run Length: 파일이 차지하는 클러스터의 개수를 의미하며, 파일이 얼마나 연속적인 공간을 차지하는지를 나타냄.
  • Run Offset: 데이터가 위치하는 클러스터의 상대적 오프셋을 의미하며, 파일 데이터가 저장된 정확한 위치를 계산하는 데 사용됨.

Runlist의 위치

Runlist는 MFT 엔트리 내 $DATA 속성에 저장되며, 파일이 차지하는 실제 데이터 클러스터의 위치를 가리킨다. NTFS 구조에서 Runlist는 다음과 같이 나타날 수 있다:

  1. MFT 엔트리 내부: 파일 메타데이터와 함께 위치하며, 파일이 저장된 위치 정보(클러스터 번호)를 저장.
  2. 연속된 데이터 클러스터를 가리킴: Runlist를 이용해 파일 데이터의 정확한 위치를 찾을 수 있음.

데이터 섹터 계산 공식

(Run Offset 값 * 클러스터 당 섹터 개수) + VBR 시작 섹터 = 데이터 섹터 위치

예제 계산:

0x0C 3B DD * 8 + 2048 = 6,416,104섹터

위의 계산을 통해 실제 파일 데이터가 위치한 섹터를 찾을 수 있다.


3. 삭제된 PNG 파일 복구 예시

3.1. MFT 엔트리 및 Runlist 분석

  1. NTFS Walker를 사용하여 PNG 파일의 MFT 엔트리를 확인
    • 예시로 삭제된 PNG 파일의 MFT 번호는 42였다.

데이터 섹터 계산

42 * 2 = 84
84 + 660496 = 660580
660580 * 512 = 0x1428C800
  1. Runlist 분석 및 복구
    • Runlist 값이 0x88 05로 확인되었다면:
    • 0x88 05 * 8 + 128 = 11456섹터
    • 해당 섹터로 이동 후, PNG 파일 크기만큼 데이터를 복사하여 저장하면 복구 완료된다.

4. NTFS에서 손상된 VBR 복구

NTFS에서는 마지막 섹터에 VBR의 백업이 존재한다. 따라서 VBR이 손상된 경우 이를 이용해 복구할 수 있다.

4.1. VBR 손상 확인

  1. MBR 정보를 확인하여 VBR의 시작 섹터 찾기
    • 손상된 VBR을 확인한 후, 백업된 VBR을 찾아 복구한다.
  2. 백업 VBR 위치 계산
1981439 * 512 = 0x3C77FE00
    • 해당 섹터에서 백업된 VBR을 복사하여 원래 VBR 위치에 덮어씌우면 복구 가능하다.
시작섹터 32 + 총 섹터 크기 1981408 - 1 = 1981439

5. 파일 MFT Entry 찾는 구조

resident Flag

Non-resident Flag

Resident Flag - Non-Resident Flag

Resident는 데이터 속성 헤더 뒤에 파일의 데이터가 나온다/

 

Non-resident는 파일 크기가 너무 커 1024byte에 데이터를 못넣을 때 다른 섹터에 데이터를 저장하고 그 위치를 데이터 속성 해더 뒤에 넣는다

이때 파일 데이터의 위치를 알려주는 값들을 Cluster Run이라 부른다