주어진 파일은 NTFS 파일시스템을 가진 이미지파일이다.


어떤 파일이 파일시스템에서 마운팅 되어, 파일로 인식되기 위해서는 


MFT영역의 MFTEntry에 메타데이터가(파일이름, 생성시간,...등) 들어있고, 

- Resident 파일이라면( $Data 속성 header 다음 contents영역 )안에 // 대부분 700바이트 이하의 경우 resident (항상은 아님)

- Non-Resident 파일이라면 클러스터 런을 통해서 , DATA 영역의 클러스터를 찍어줘야한다. 


DATA area에는 클러스터 단위로 파일이 저장되어 있다. 클러스터 런에 따라서!  









따라서 해당 파일에 유니코드로  MFT가 있는지 검색해서 $MFT 파일이 있는지 봤더니 없었다.


그런 경우에는 파일 카빙을 통해 사진 파일이 있는지 확인해야 한다. // 참고 1) 데이터복구 - file carving이란 



File Digger라는 툴을 사용해서 카빙을 한다.



플래그를 가진 PNG 사진 파일을 발견했다.


클러스터런이 끊겨있는데, MFT정보가 사라져서 그런것 같다.








PNG 구조를 보면, 청크 단위로 되어 있는데, 


한 청크당 


CHUNK = length(4byte) + chunk type(4byte) + chunk data (length만큼byte) + CRC (4 byte)


의 구조를 가지고 있다.




시그니쳐와, 클러스터 크기로 유추해서 경우의 수를 줄인 뒤, 여러 개 해보면 될 것 같다. 





해당 파일을 HxD로 열면, VBR에서 SectorPerCluster가 2이므로 


한 클러스터는 1024byte(0x400)이다.  





HxD에서 "IDAT"를 검색하니, 여러개가 나오고


"IEND"로는 하나의 검색결과가 나온다.



1) %PNG   797000

2) IDAT     797050+8   ffa5  ok

3) IDAT     7A7000+8   FFF4  ok

4) IDAT  19E96400+C   FFF4

          ~19E97000      BFC

          ~19E97900     14FC 

 NULL

            19E9A400~  F004 해당 CRC는 "87 DB 8B 0D" (F000)

5) IDAT   19EA9400   A561 해당 CRC는 "8D B9 90 31"



다행히, 2)와 3) 그리고, 3)과 4) 사이에는 티나는 공백이 있어서 그대로 이어붙이니 그림파일이 늘어났다.







4)와 5) 사이에는 공백을 지우고 이어주는 것만으로 사진파일이 생기지 않았다.


0x500의 쓰레기 값이 있었는데, (클러스터 기준으로 기록되기 때문에 해당 파일이 아닌 바이트가 있다.)


클러스터 기준으로 자른다음, CRC 영역을 확인해서 어떤 클러스터에 있는 값이 사진파일인지 확인해 준다. // 참고 2) CRC란 

   

PNG Chunk에서 crc는 name과 data로만 계산한다.


그렇게 찾고나서 "IEND"까지 연결하면 




이렇게 플래그가 뜬다.







참고1) 파일카빙이란    // http://hy00un.tistory.com/107




 

참고 2)) CRC란


암호화 알고리즘의 하나로,


http://mwultong.blogspot.com/2006/06/qna-zip-rar-crc32-crc-crc.html // crc 영역


http://schaik.com/png/pngcsum.html // PNG에서 crc는 name과 data로만 계산한다.


http://noteroom.tistory.com/entry/PNG-%ED%8F%AC%EB%A9%A7-1 // png 포맷


 













< 문제 풀이>


주어진 이미지는 USB의 이미지 이다. 


이 이미지는 NTFS 파일 시스템을 가지고 있다. // 참고1) NTFS 이미지 파일의 구조


 

USB를 인식하기 위해서는


MBR의 Partition Table이 파티션의 위치를 잘 가리키고 있고,


해당 (NTFS)파티션의 VBR이 MFT를 잘 가리키고 있어서,  


MFT와 DATA영역을 읽어들여야 


해당 이미지 파일에 어떤 파일이 들어있는지 파일 구조를 볼 수 있다.


((그림))

  MBR ---> VBR --->MFT

   ---> VBR --->MFT



USB를 마운팅 했을 때,  unallocated area로 읽히면  


파티션부터 제대로 인식되지 않는다는 것이다.  

( ENCASE에서도 partiton finder을 이용해서 VBR의 시그니쳐="   NTFS"를 검색하고 'add partition'을 눌러 추가해 주었었다.) 


따라서, MBR의 Partition table를 제대로 수정을 해 주어야 한다.


※부팅과 마운팅의 차이점


부팅은 운영체제가 설치되어 있는 파티션에서 꺼져있는 


마운팅은 이미 부팅되어 있는 시스템 파일 시스템을 읽어들여서 파일 내부 구조를 볼 수 있는 것을 말한다.











MBR은 맨 첫 번째 섹터에 있는 영역인데(크기 : 0x200), 없는 것으로 보인다. // 참고 2) MBR의 구조


부팅을 할 것은 아니므로, Partitoin Table만 추가를 해주면 된다.  // 참고3) 부팅과 마운팅이란.





Partitoin Table에는 VBR 영역(크기 : 0x200+추가코드 조금)의 시작주소를 찍어야 하는데, 


VBR은 백업 형태로 맨 아래에 한 번 더 저장되어 있다. // NTFS - VBR





VBR에서는 MFT를 상대주소지정방식으로 찍기 때문에 // NTFS - MFT


MFTStartingAddr= VBRStartingAddr + ( "StartOfMFT" * SizeOfCluster(0x10000) ) 


VBR backup을 올바른 위치에 위치시켜야 한다. 안그럼 백업파일이 있는 주소를 기준으로 MFT를 읽으려고 시도한다.





VBR은 보통 정해진 위치에 있는경우가 많고, 


이 문제의 경우에는 힌트로 0x1000주소에 NTFS가 잔뜩 들어있다.


혹은, $MFT를 유니코드로 검색한 후, 


MFT mirr가 아닌, 진짜 MFT의 주소로부터 VBR을 위치시켜야 할 값을 역으로 찾는다.


VBRStartingAddr = MFTStartingAddr - ( "StartOfMFT" * SizeOfCluster(0x10000) ) 


이 위치에 ctrl + B 해주면 된다.





그러면 FTF imager을 통해  열 수 있고,  


삭제한 파일과 삭제되지 않은 파일은 


현재 시스템에 마운팅 시켜보면 알 수 있다.



"hidden_key_picture.png"가 삭제되지 않은 파일이고 답이지만 키를 알 수 없다.


hidden key라고 하는 것을 보니 스테가노 그라피인것 같다. // 참고 4) 테가노그라피란



스테가노 그래피 툴 OpenStego를 받아서 키 값을 받으면 된다. // https://github.com/syvaidya/openstego/releases


키 값은 :  HS_{I_LIKE_HORROR_MOVIE}



CF) HxD를 관리자 권한으로 열면 현재 내 컴퓨터의 하드디스크나 메모리의 값을 HEX로 볼 수 있다. -->실습가능



참고 블로그 )) 

NTFS 구조 따라가기 실습 : http://ezbeat.tistory.com/405


삭제된 데이터 복구 // http://jmoon1601.tistory.com/86


삭제된 파일복구 자체는 상용화된 툴이나 오픈소스를 이용하는것이 편하다


MBR 파티션 구조 설명 자세하게 : http://hyd3.tistory.com/124

 




※ Partiton Table에서 LBA address는 상대 클러스터 지정 방식으로 되어있다. 




※ NTFS에서 주소를 가리킬 때는 


절대(이미지 전체에서 몇번째 Sector or Cluster)방식과 

상대 (해당 영역의 시작주소 + Sector of Cluster)방식이 있다. 


클러스터의 경우 = 곱하기 0x10000 ( Sector per Cluster가 8개인 경우)

섹터의 경우 = 곱하기 0x200 하면 된다. 





 참고 ))

 MFT mirr은 4섹터만 저장된다.


 





---------------------------------------------------------------------------------------------------------------------------------------


<문제를 풀면서 스스로 한 추론>


여러사진의 파편이 있을것으로 예상.

사진파일은 JPEG, PNG, GIF 등이 있고 - 이미지 파일의 종류?


여러장의 이미지중, 삭제하지 않은 한 이미지를 찾는것이 중요.

-> 삭제되지 않았으면 MFT가 그대로 있을테니, MFT가 남아있는 파일을 찾으면 되지 않을까?



인식이 안되는 이유는 

-> 파일 시그니쳐가 없다. MFT는 있으려나. 시그니쳐로 검색을 해봐야겠다.


---------------------------------------------------------------------


파일디거로 찾아보니 많은 JPEG랑 PNG가 있다.

파일 자체에 삭제여부는 없을테니,


MFT에서 찾아야 한다.




NTFS로 꽉찬 파일 하나를 보니짤리지 않고 잘 들어가있다. 

아마 0x1400 = 5120 바이트만큼이 클러스터 크기인가 보다. 

이건 출제자가 일부로 힌트를 주려고 바이너리를 조작한 것이다.



0x800(2048바이트)만큼이 밀려있는것 같다.




hint )) MBR과 VBR을 공부하시오 



카빙이라는 기법은 파일시스템 메타데이터가 없을때(덮어써졌을때) 복구하는 방법입니다. 따라서, 파일명을 알 수가 없기 때문에 도구마다 각자의 방법으로 파일명을 생성합니다. 






MFT Entry Header 구조



Q. 부팅 = 마운팅? 

A. 부팅은 운영체제가 설치되어 있어서 윈도우즈에서 

마운팅은 이미지파일 혹은 디스크의 파일 구조를 볼 수 있도록 뷰어로 여는것??


내생각 ) 마운팅 시킬 땐, 부트코드가 필요없고 그냥 파티션 테이블만을 읽어들이는것 같다.



http://www.hackerschool.org/HS_Boards/zboard.php?id=QNA_Network&page=1&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=184

+ Recent posts