안 쓰던 블로그
[포렌식] NTFS 파일 시스템 구조 (NTFS에서 파일 복구 방법) 본문
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 Entry는 MFT 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 백업본은 이렇게 찾을 수 있다
'CTF > Forensic' 카테고리의 다른 글
BOF 문제 풀이 (하는 중) (0) | 2020.10.20 |
---|---|
pwntools (0) | 2020.09.21 |
[포렌식] FAT 파일 시스템 구조 (FAT에서 파일 복구 방법) (0) | 2020.08.28 |
Puzzle #1: Ann’s Bad AIM 문제풀이 (네트워크 포렌식) (0) | 2019.11.28 |
xcz.kr 27번 문제풀이 (포렌식) (0) | 2019.11.28 |