1579, 9/79 회원가입  로그인  
   havu
   http://havu.tistory.com
   [자작]포렌식을위한NTFS구조

http://www.hackerschool.org/HS_Boards/zboard.php?id=Free_Lectures&no=1923 [복사]


옛날에 동영상 보면서 정리해둔건데
도움되시라고 올려봅니다.



## MFT(Master File Table)

# MFT란
- MFT Entry들의 모음
- MFT의 시작위치는 BR에서 확인한다.
- MFT의 크기는 볼륨에 있는 파일과 디렉토리의 개수에 비례한다.
  예)볼륨에 파일과 디렉토리의 개수가 60000개일 때 MFT Entry개수는 대략 60000개 이상 차지한다.
  60000 * 1KB = 60000 KB = 약 60 MB

# MFT Entry
- 파일 또는 디렉토리에 대한 정보를 담고 있다.파일명,크기,시간,파일내용,위치,권한,할당량 ...
- 기본적으로 파일이나 디렉토리는 하나의 Entry를 사용하며 기록할 내용이 많은 경우 Entry를  
   여러 개 사용할 수도 있다.
- 기본 크기는 1KB이다.(BR 또는 MFT Entry Header에서 확인가능)
- MFT Entry는 섹터 2개를 차지한다.
- MFT Entry Header와 여러 개의 속성들(Attributes)로 구성된다.
- MFT Entry 마지막 속성의 뒷부분에 End Marker(0xFFFFFFFF)로 끝난다.


## MFT Entry Header
- 크기가 42 bytes

# Signature
- MFT Entry임을 나타내는 표시이다.
- 위치: 0~3번 바이트
- 크기: 4 Bytes
- 정상 Entry에는 FILE 이라는 문자열이 적혀있다.
- 문제가 발견된 Entry에는 BAAD라고 적혀있다.


# Offset of Fixup Array
- MFT Entry 시작 위치로부터  Fixup 배열까지의 거리
- 위치: 4~5번 바이트
- 크기: 2 Bytes
- 보통 0x48이라고 적혀있다.

(참고) Fixup Array
- 데이터가 저장된 섹터의 내용의 손상여부를 확인하기 위한 기법
- 섹터의 마지막 2바이트를 특정 Signature로 바꿔놓고 원래의 2바이트 값은 Fixup배열에
   기록해 둔다.
- Signature값은 Fixup 배열의 맨앞에 기록한다.
- 섹터를 읽을 때 Signature값이 틀리면 손상된 섹터로 간주한다.
- 위치: 보통 MFT Entry Header가 끝나고 바로 이어진다. Offset to Fixup Array항목에서 확인
- 크기: Count of Fixup Values 항목에서 확인
- 이 기법이 사용되는 항목은 MFT Entry,Index Record, RCRD Record, RSTR Record 등이다.
- 파일 내용이 들어가는 클러스터의 섹터에는 적용하지 않는다.

# Count of Fixup Values
- Fixup 배열(Array)의 크기(항목의 개수)
- MFT Entry는 기본적으로 3이다.
   (MFT Entry가 1KB이므로 섹터 2개를 사용 + Signature가 1개 항목 사용)
- 위치: 6~7번 바이트
- 크기: 2 바이트

# $LogFile Sequence Number(LSN)
- 설명은 뒤에서 다시 다룬다.
- 내용은 다양한 값을 가질 수 있다.
- 위치: 8~15번 바이트
- 크기: 8 바이트

# Sequence Value
- MFT Entry가 할당 또는 해제될 때 값이 증가한다.
- MFT Entry를 재할당하면 이값이 바뀌므로 내용이 바뀌었다는 것을 추측할 수 있다.
- 위치: 16~17번 바이트
- 크기: 2 바이트(16 bit)

(참고) File Reference Address (64 bit)
Seqence Value(16 bit) + MFT Entry Address(48 bit)

# Hard Link Count
- 하드 링크의 개수
- 보통 1 이다. Base MFT Entry에서만 사용된다.
- Hard Link 개념을 윈도우에서도 사용할 수 있다. 하지만 실제 도구가 없어서 사용할
  수 없다. 그러나 MS에서 제공되는 도구가 있다.
- 위치: 18~19
- 크기: 2 Bytes

# Offset to First Attribute
- MFT Entry의 첫 번째 속성(Attribute)의 위치(Offset)
- 보통 56(D)=0x38 이지만 얼마든지 다른 값이 올 수 있다. 확인 필수
- 위치: 20~21
- 크기: 2 Bytes

# Flags
- MFT Entry의 상태정보
- 내용이 0x1 이면 MFT Entry가 사용 중임을 나타낸다.
- 내용이 0x2 이면 MFT Entry가 디렉토리에 사용되고 있음을 나타낸다.
- 위치: 22~23번 바이트
- 크기: 2 바이트

# Used Size of MFT Entry
- MFT Entry 전체크기(보통 1KB)중에서 사용중인 공간의 크기를 나타낸다. 정확하지는
   않고 8의 배수로 기록된다.
- 내용: 다양한 값을 가질 수 있음.
- 위치: 24~27번 바이트
- 크기: 4 바이트

# Allocated Size of MFT Entry
- MFT Entry 전체크기를 나타낸다.
- 보통 1024 가 적혀있다. (MFT Entry는 1KB로 고정되어 있음)
- 위치: 28~31번 바이트
- 크기: 4 바이트

# File Reference to Base MFT Entry
- Non-Base MFT Entry의 Base MFT Entry의 위치를 나타낸다.
- File Reference Address로 기록되어 있다.
- Non-Base MFT Entry 에서만 기록된다.
- Base MFT Entry에서는 언제나 0 이다.
- 위치: 32~39번 바이트
- 크기: 8 바이트

(참고) Base MFT Entry & Non base MFT Entry

# Next Attribute ID
- 현재 MFT Entry에 새로운 속성이 기록될 때 사용할 속성ID(고유한 값, 속성 TYPE ID와 다름)
- 위치: 40~41번 바이트
- 크기: 2 바이트

## Attribute(속성)

# 구성
- 속성 헤더(Header) + 속성 내용(Content)

# 속성 헤더 구조 (Resident)
- Resident 형태의 속성은 내용이 MFT Entry내에 있다
- $FILE_NAME (파일 이름 속성)

# 속성 헤더 구조 (Non-Resident)
- Non-resident 형태의 속성은 내용이 다른 클러스터에 들어있고 속성에는 위치만 기록됨.

# 속성 종류(Attribure Type)
$STANDARD_INFORMATION                
$ATTRIBUTE_LIST
$FILE_NAME
$VOLUME_VERSION
$OBJECT_ID
$SECURITY_DESCRIPTOR
$VOLUME_NAME
$VOLUME_INFORMATION
$DATA
$INDEX_ROOT
$INDEX_ALLOCATION
$BITMAP
$SYMBOLIC_LINK
$REPARSE_POINT
$EA_INFORMATION
$EA
$LOGGED_UTILITY_STREAM


# $STANDARD_INFORMATION
- 파일과 디렉토리에 대한 시간정보/소유자/보안설정/파일종류/할당량 등의 정보를 담는다.
- 모든 파일과 디렉토리에 대한 Base MFT Entry에는 반드시 존재하는 속성
- 속성 타입 번호 : 0x16                 
- 저장 형태: 반드시 Resident 형태만 가능함
- 크기: 보통 72(Byte), 다를 수 있음, 확인 필요

- 속성 구조 요약

항목 이름        설명        위치        크기          
Created Time        처음으로 파일이 생성된 시간 정보        0~7        8          
Modified Time        마지막으로 파일 내용이 수정된 시간        8~15        8          
MFT Modified Time        MFT Entry 내용이 마지막으로 수정된 시간        16~23        8          
Accessed Time        마지막으로 파일 내용을 접근한 시간        24~31        8          
Flags        파일의 특성        32~35        4          
Maximum number of version                36~39        4          
Version Number                40~43        4          
Class ID                44~47        4          
Owner ID        파일의 소유자의 ID        48~51        4          
Security ID                52~55        4          
Quota Charged                56~63        8          
Update Sequence Number                64~71        8        


# $FILE_NAME
- 파일이나 디렉토리의 이름과 이름에 관련된 추가 정보가 저장되는 속성이다.
- 이 속성은 반드시 Base MFT Entry에 있어야 읽을 수 있다.
- 속성 타입 번호 : 0x48
- 저장 형태: 반드시 Resident 형태만 가능함
- $FILE_NAME의 Attribute Content 구조

위치        크기        설명          
0~7        8        부모 디렉토리의 File Reference Address          
8~15        8        Created Time          
16~23        8        Modified Time          
24~31        8        MFT Modified Time          
32~39        8        Accessed Time          
40~47        8        파일의 할당 크기          
48~55        8        파일의 실제 크기          
56~59        4        Flag          
60~63        4        Reparse Value          
64~64        1        이름의 길이          
65~65        1        이름의 형식          
66~??        동적        이름        
- 이 속성은 Index Entry에도 존재하며 Index Entry에 있는 $FILE_NAME속성을 우선적으로 갱신한다.
- Flag 항목은 $STANDARD_INFORMATION 속성의 flag와 동일한 구조이다.

# $DATA
- 실제 파일이나 디렉토리의 내용이 저장되는 공간이다.
- 속성 타입 번호 : 0x128
- 저장 형태: 700 Byte를 기점으로 작으면 Resident 형태로 저장되고 크면 Non-Resident 형태로 저장된다.

# $DATA속성의 ADS 항목
- Alternate Data Stream
- 파일이나 디렉토리에 추가되는 $DATA 속성

  Hit : 10148     Date : 2012/01/11 11:47
[불법/스팸글로 신고하기]



    
ktmahacker 이것 공부하느라고 고생많이 했는데
또 사용하지 않으니까 잊어버렸네요.
다시 공부해야 할 것 같네요
2012/01/13  
havu ktmahacker // 동기부여가 됬다면 좋은거죠! 화이팅 2012/01/13  
1419   원재아빠님의 gcc 2.96에서의 버퍼 구조 강좌.[9]     ttongfly
09/19 10720
1418   해킹기법? (기발하다고 해야하나,웃기다고 해야하나)[35]     whqkdnf000
07/31 10695
1417   [Reverse Engineering] 리버싱의 기초 - 범용 레지스터와 Assembly(Pop,Mov)     zen0c1de
07/18 10636
1416   [펌]스니핑[1]     loveaaav
03/24 10564
1415   c언어 for문      hacs98
06/15 10532
1414   I. 리눅스 구조 및 일반 명령어.     괴도js
07/04 10499
1413   왠만한사람들은다알지도모르겠지만[6]     백룡출해
03/17 10421
1412   C언어(진법)[9]     whqkdnf000
02/25 10420
1411   [C기초] 11 - 함수 매개변수로 배열을 넘기려면?      sihun1113
05/01 10398
1410   메모리 덤프(블루 스크린=STOP 스크린) 코드 및 해결[1]     ROK.AF
02/09 10361
1409   네트워크 개념 휘어잡기 7[8]     소유
09/16 10338
1408   리눅스 명령어 한꺼번에(소유님꺼)[11]     ssakura
07/07 10302
1407   [동강]백트랙을 이용한 재밌는 놀이들![4]     cdpython
09/29 10193
1406   알기 어렵게 설명한 Buffer Overflow[4]     blackcoder
02/17 10179
1405   네트워크 개념 휘어잡기 6[10]     소유
09/15 10154
  [자작]포렌식을위한NTFS구조[2]     havu
01/11 10147
1403   개발자가 알아야할 10가지 보안팁으로 코드를 보호하자.     푸른하늘
09/01 10146
1402   D.Dolphin님 질문내용] LAN과 WAN의 차이점과 VAN의 정의[5]     푸른하늘
09/11 10113
1401   원격종료....[39]     bsjzzz
01/02 10030
1400   배열 내에서 랜덤한 n개 추출하기[2]     kjwon15
12/05 10026
[1][2][3][4][5][6][7][8] 9 [10]..[79]

Copyright 1999-2021 Zeroboard / skin by Hackerschool.org / Secure Patch by Hackerschool.org & Wowhacker.com