1580, 10/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 : 11575     Date : 2012/01/11 11:47



    
ktmahacker 이것 공부하느라고 고생많이 했는데
또 사용하지 않으니까 잊어버렸네요.
다시 공부해야 할 것 같네요
2012/01/13  
havu ktmahacker // 동기부여가 됬다면 좋은거죠! 화이팅 2012/01/13  
1400   리눅스 명령어 한꺼번에(소유님꺼)[11]     ssakura
07/07 11651
1399   2번째C강좌~![9]     괴도js
07/03 11642
1398   [동강]백트랙을 이용한 재밌는 놀이들![4]     cdpython
09/29 11577
  [자작]포렌식을위한NTFS구조[2]     havu
01/11 11574
1396   D.Dolphin님 질문내용] LAN과 WAN의 차이점과 VAN의 정의[5]     푸른하늘
09/11 11543
1395   [자작]프로세스모니터Operation필터     havu
01/10 11539
1394   GetProcAddress 로 알아보는 키워드     HongMK900
08/13 11526
1393   원격종료....[39]     bsjzzz
01/02 11524
1392   * 해킹영화 볼만한거 *[5]     HackerMapia
02/20 11497
1391   [펌] 알고있으면 유용한 도스 명령어들.[2]     dzhfldk
08/22 11437
1390   Xmanager로 리눅스 이용하기(멍멍님 만화강좌 사용)[15]     DarkSlayer
09/21 11395
1389   리눅스 시스템 정보 알아내기[3]     bitcom01
08/11 11393
1388   C언어 함수 요약[5]     qkreoghks00
11/15 11389
1387   cmd [명령프롬프트] 로 해커스쿨접속방법[30]     HackerMapia
01/12 11378
1386   [Project] 전기,전자 상식 및 샤프심으로 전구만들기. - 1[11]     아이프리드
02/03 11342
1385   bof & fsb 에 유용한 펄 스크립트[5]     awsedr45
03/11 11286
1384   [펌]TCP SYN_Flooding 공격의 원인과 해결책[1]     Chris Ruiel
10/06 11271
1383   리눅스 기본 명령[1]     jeongseok0
04/22 11266
1382   [컴퓨터 짱되는 100가지 팁] 네이버에서 퍼옴!![2]     turtle0216
04/12 11266
1381   윈도우즈 XP SP1 WFP (Windows File Protection) 끄기[1]     x90c
03/05 11264
[1][2][3][4][5][6][7][8][9] 10 ..[79]

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