```start-multi-column ID: ID_nto4 Number of Columns: 2 Largest Column: left Border : off ``` ## 개요 - - - 오늘 하게 될 것은 실로 간단하다. NTFS 파일시스템이 어떤 것인지도 대충 알고, 파일이 저장되는 속성이나 구조들을 파악했을 것이다. 그렇다면 실제로 특정 파일시스템 이미지에서 특정 파일의 메타데이터와 데이터를 찾는 과정을 겪어보도록 하자. 이번 글에서 설명한 내용을 천천히 따라온 다음에 글을 보지 않고 직접 실습 해보는 것을 추천한다. 잘 응용한다면 이 과정을 이용해서 삭제된 파일 역시 복구해낼 수 있다. --- column-end --- ## Table of Contents - - - - [[#개요|개요]] - [[#Table of Contents|Table of Contents]] - [[#STEP 1. Find VBR|STEP 1. Find VBR]] - [[#STEP 2. Find $MFT|STEP 2. Find $MFT]] - [[#STEP 3. Find Entry|STEP 3. Find Entry]] - [[#STEP 4. Find Data Attribute|STEP 4. Find Data Attribute]] - [[#STEP 5. Find Cluster Data|STEP 5. Find Cluster Data]] - [[#Deleted File Data Recovery|Deleted File Data Recovery]] - [[#결론|결론]] --- end-multi-column ## STEP 1. Find VBR - - - 먼저 VBR을 찾아야 한다. NTFS 라는 문자열을 검색해도 괜찮지만 디스크 초반에 작성된 0x1C6 오프셋의 값을 참조하면 된다. 일반적인 경우 0x800 으로 2048 번째 섹터에 위치하고 있을 것이다. ## STEP 2. Find $MFT - - - VBR을 성공적으로 찾았다면 분석을 진행해야 한다. 우리는 Filesystem 영역에서 이미 [[VBR]]에 대해서 다룬 적이 있으니, 내용적인 부분을 모른다면 참고하고 오자. $MFT 의 위치를 찾아야 하는데, 0x30번째 오프셋에서 해당 정보를 찾을 수 있다. ## STEP 3. Find Entry - - - 이제 $MFT 까지 들어왔다. 우리가 원하는 파일을 찾아야 한다. 그렇다면 파일은 어떻게 찾는가? 단순하다. 파일 이름을 알고 있다는 전제가 있어야 하는데, 파일 이름을 기준으로 string search 해주면 된다. 그게 아니라면 NTFS Walker 라는 도구를 이용하여 Entry 번호를 확인 해도 괜찮지만 거기서 거기다. 파일 이름을 알면 어떻게 찾을 수 있을까? 이 질문에 대답을 할 수 없다면 [[MFT Attribute (2)#$FILE_NAME(0x30)]] 에 대한 내용을 잘 모르는 걸 거다. 모든 MFT Entry는 파일 이름 속성을 가지고 있기 때문에 이 특징을 이용하는 것이다. ## STEP 4. Find Data Attribute - - - 이제 성공적으로 원하는 엔트리에 접근한 상태일 것이다. 엔트리에서 데이터에 대한 정보가 저장되는 것은 0x80 의 [[MFT Attribute (2)#$DATA(0x80)]] 속성이다. 잘 모르면 역시 읽고 오자. 데이터 속성을 찾아 분석을 하면 데이터에 대한 단서를 찾을 수 있다. 이 단계에서는 특정 파일의 내용물을 찾는다는 목적을 성공적으로 목적을 달성한 사람도 있을 것이고, 그렇지 못한 사람도 있을 것이다. 왜냐하면 파일 크기에 따라 데이터를 처리하는 방식이 [[MFT Attribute (1)#Resident Header]] 와 [[MFT Attribute (1)#Non-Resident Header]]로 나뉘기 때문이다. 이 역시 잘 이해가 안간다면 읽고 오는 것을 추천한다. 파일 크기가 일정 크기를 넘어선다면 MFT Entry에 데이터가 저장되지 않기 때문에 분석이 끝나지 않는 것이다. 만약 데이터가 작은 파일을 대상으로 했다면 이 단게에서 분석은 끝난다. 그렇지 않는 경우, 추가적으로 Cluster Run까지 분석에 들어가야한다. ## STEP 5. Find Cluster Data - - - 자 Non Resident Header를 사용하는 속성의 데이터를 찾기 위해서는 [[MFT Attribute (1)#**Cluster Run(Run List)**]] 을 잘 이해해야 한다. 큰 크기의 데이터는 따로 저장하기에 Run List를 참조하는 것이다. 참조 방법을 잘 숙지해 파일 위치를 찾아간다면 우리가 원하는 파일을 찾을 수 있다. ## Deleted File Data Recovery - - - 소개 부분에서 언급했듯 앞서 배운 과정들을 활용하면 삭제된 데이터 역시 복구할 수 있다고 했다. 어떤 방법을 이용해야 할까? 힌트는 [[$MFT#MFT Entry Header]] 를 잘 읽고 오는 것이다. 정답을 공개하겠다! 정답은 바로 Flag 값을 이용하거나, Seq 값을 활용하는 것이다. 언급된 두 값은 직접적으로나 간접적으로 삭제된 엔트리인지 여부를 확인할 수 있다고 말했었다. 따라서 $MFT 엔트리를 스캔하며 삭제된 파일의 엔트리를 추려낼 수 있다. > [!Question] 제가 원하는 파일의 엔트리는 없는데요? > > 우선 매우 유감이다. 삭제된 파일의 엔트리를 천년만년 저장하면 저장장치 공간은 어떻게 유지하겠는가? 당연히 일정 기간이 지나 할당 해제(삭제된) 파일의 엔트리가 새롭게 만들어진 파일의 엔트리에 의해 덮어씌워진 상태라면 복구가 거의 불가능하다. 추려낸 다음 과정부터는 [[#STEP 4. Find Data Attribute]] 과정을 따라가면 되겠다. ## 결론 - - - 간단하지만 매우 불친절하게 파일의 데이터를 찾고, 삭제된 파일의 데이터를 복구하는 방법까지 알아보았다. 불친절하게 설명한 이유는 간단하다. 첫째, 설명된 내용들이기 때문이다. 다른 게시글에 매우 상세하게 바이트 단위로 분석해놓은 글이 있다. 이미 읽어 숙지한 사람들은 더 간결하게 필요한 정보만 얻어가게 하게끔 글을 작성했다. 둘째, 평소에는 잔뜩 쓰는 사진과 같은 예시가 없다. 처음에 이 글을 작성할 때 샘플 예시와 함께 보여주면 더 이해가 잘 갈 것이라는 것을 알고 있다. 그럼에도 그림 예시 없이 텍스트만으로 글을 불친절하게 구성한 이유는 따라하지 말고 직접 정보들을 활용해 본인의 힘으로 문제를 해결해 보라는 의미가 담겨 있다. 직접 해보니 성취감도 남다르고 재밌다는 생각이 든다면 적성에 잘 맞는 것이라고 생각된다.