이번 글에서는 디렉토리 엔트리에 대해서 알아 볼 것이다.

디렉토리 엔트리에는 디렉토리의 이름과 여러 데이터를 대신 설명 해주는 메타데이터가 포함되어 있다. 

이러한 엔트리들은 파일과 디렉토리 모두에 할당이 되며 엔트리 위치는 할당 된 파일이나 디렉토리의 부모 디렉토리 클러스터에 위치하게 된다.

엔트리에 저장되는 이름의 최대 길이는 확장자를 제외하고 8글자이며, 확장자는 최대 3글자이다.

디렉토리 엔트리의 바이트 오프셋은 아래와 같으며 부가적 설명이 필요한 항목은 따로 설명을 하도록 하겠다.

 

[그림 1 - 디렉토리 엔트리 바이트 오프셋]

 - 파일이름의 첫 문자 또는 할당 상태 : 이 항목은 디렉토리나 파일의 이름 첫 번째 문자가 설정되는 부분이며 해당 디렉토리 엔트리가 비 할당 상태일 시 문자대신 "0xE5" 또는 "0x00" 이 설정된다.


 * 참고 : 파일명이 8글자 이하일 경우 사용되지 않는 바이트는 "스페이스(0x20)" 으로 채워진다.

 - 파일의 속성 : 아래 표를 참고하기 바란다.


[그림 2 - 파일속성]

표를 참고하여 보면 위 이미지의 속성 타입은 디렉토리가 된다.

 - 첫 번째 클러스터 주소 상위 2바이트 : FAT 12/16의 경우 이 값은 0으로 설정된다. 위 이미지는 FAT 16 이미지이기 때문에 0으로 설정되어 있다.

 - 파일 크기 : 이 항목은 디렉토리 일때 0으로 설정된다. 위 이미지의 디렉토리 엔트리는 속성타입에서 보았듯이 디렉토리 속성을 가지고 있어 파일크기가 0으로 설정되어 있다.



위 이미지를 보면 타임스탬프 값들이 hex값으로 되어 있어 사람이 인식하기에는 조금 무리가 있다.

타임스탬프 값을 사람이 알아 볼 수 있도록 계산을 해주어야 하는데 계산 과정은 아래와 같다(위 이미지 값을 기준으로 함)

 1) 날짜변환
     타임스탬프 값 중 날짜 값은 아래와 같은 규칙을 가진다.

 [그림 3 - 날짜 변환 규칙]

일단 hex 값을 2진수로 변환한다.

 -  0x3116(생성 날짜) -> 0011000100010110

다음으로 위 규칙대로 2진수를 끊어 10진수로 변환한다.

 - 0011000 -> 30
 - 1000 -> 10
 - 10110 -> 26


년도의 경우 1980년도를 기준으로 하기 때문에 1980~ 2107년도까지 표현이 가능하다.

위 나온 년도 값에 1980을 더해주면 계산이 완료 된다.

 - 변환 값 : 2010. 10. 26 

2) 시간변환
    날짜와 마찬가지로 시간도 규칙이 있다.
 

[그림 4 - 시간 변환 규칙]

일단 날짜 계산 과정과 마찬가지로 hex 값을 2진수로 변환한다.

 - 0x5C7A(생성 시간) -> 0101110001111010


다음으로 위 규칙대로 2진수를 끊어 10진수로 변환한다.

 - 01011 -> 13
 - 100011 -> 43
 - 11010 -> 32


시간은 따로 더해주는 값이 없어 이대로 계산이 끝난다.

 - 변환 값 : 오후 13시 43분 32초

요즘은 이러한 계산을 자동으로 해주는 도구가 많이 있다. 대표적으로 DCode( http://www.digital-detective.co.uk/downloads.asp ) 프로그램이 있다. 


이번에는 디렉토리 엔트리 중 긴 파일명을 저장하는 엔트리를 알아보자.

LFN(Long File Name) 엔트리는 디렉토리 엔트리에 포함되는 엔트리이며 긴 파일명을 사용하는 디렉토리나 파일에 디렉토리 엔트리가 할당되면 LFN 엔트리에 파일명이 저장된다.

LFN 엔트리는 일반 엔트리보다 우선시 되어 짧은 이름을 저장하는 기본 엔트리 전에 목록화되는데 그 순서는 역순이다.

아래는 LFN 엔트리의 바이트 오프셋을 나타낸 것이다. 부가적 설명이 필요한 부분은 따로 설명하도록 하겠다.

[그림 5 - LFN 엔트리 바이트 오프셋]

 - 순서번호 또는 할당 상태 : 순서번호는 0x40과 OR 연산되어 할당 상태일 경우 설정되며, 비 할당 상태이면 0xE5로 설정된다.


위 그림을 참고해 보면 이름은 New Folder가 된다.

사용되지 않는 바이트 들은 "0xFF" 로 채워지며 파일 이름의 끝은 "NULL(0x00)" 으로 채워진다.


디렉토리 엔트리에 대하여 위에서 자세히 알아보았다. FAT의 경우 데이터 구조체 수가 적어 단순하다는 느낌을 받았을 것이다.

FAT 영역은 시스템을 자동분석 할 때 중요하게 사용되는 영역이고, 그 안에 있는 디렉토리 엔트리는 응용 프로그램 수준의 기술 없이 삭제된 파일을 복구할 떄 중요한 역할을 하는 엔트리이므로 필수적으로 알아두어야 할 부분이다.
 

'[+] Forensic' 카테고리의 다른 글

File System - NTFS (2)  (0) 2012.02.07
File System - NTFS (1)  (0) 2012.02.06
File System - FAT (10)  (0) 2012.02.05
File System - FAT (9)  (0) 2012.02.04
File System - FAT (8)  (0) 2012.02.03
이번 글 에서는 예약영역 다음 섹터부터 시작하는 FAT 영역에 대해서 알아 볼 것이다.

FAT 영역은 FAT 파일시스템에서 중요한 역할을 담당하고 있는데, 그 역할은 다음과 같다.

 - 클러스터 할당 상태 파악
 - 어떠한 파일이나 디렉토리에 할당 된 클러스터의 다음 클러스터 주소 파악


FAT은 보통 FAT 파일시스템에서 두 개가 존재하며, 정확한 번호는 부트 섹터에서 할당한다.

첫 번째 FAT은 예약 영역 섹터 다음부터 시작하며, 부트섹터에서 전체크기를 할당 한다.

두 번째 FAT은 만약 존재한다면 첫 번째 FAT 마지막 섹터 다음부터 시작하며, 구성은 같은 크기의 엔트리들로 구성된다. 

 * 참고 : 엔트리에 Header와 Footer는 존재하지 않는다.

각 엔트리 크기는 FAT 종류마다 다른데, 해당 종류의 숫자 bit 크기를 갖는다.(ex. FAT 12는 12bit)

엔트리 주소는 0부터 시작하며, 같은 주소의 클러스터와 맵핑된다.

클러스터가 할당되지 않은 엔트리는 다음 클러스터 항목에 0 값을 가지고, 클러스터가 할당 되면 0값이 아닌 파일이나 디렉토리에 할당 된 클러스터의 다음 클러스터 주소를 갖게 된다.

마지막 클러스터 주소를 가지게 되면 엔트리에는 마지막 클러스터라는 어떠한 값을 가지게 되는데, 그 값은 FAT 종류마다 달라 아래에 나열 해 두었다.

 - FAT 12 : 0xFF8
 - FAT 16 : 0xFFF8
 - FAT 32 : 0x0FFF FFF8


 * 참고 : 위 값보다 큰 값들은 모두 가능하다.

만약 위 값들 보다 작은 값을 가진다면 클러스터가 손상되었다는 의미이며, 할당되어서는 안된다.

클러스터의 시작 주소는 2부터이어서 FAT 영역에도 당연히 0과 1의 주소를 갖는 엔트리는 꼭 필요하지 않다.

보통 0의 주소를 갖는 엔트리는 미디어 유형 복사본을 저장하는 엔트리이고, 1의 주소를 갖는 엔트리는 파일시스템의 불량 상태를 저장하는 엔트리로 사용된다.

부트섹터에도 미디어 유형 종류를 저장하는 항목이 있지만, 윈도우는 부트 섹터 항목은 사용하지 않고 FAT 영역의 엔트리 0을 사용한다.

 * 참고 : 0과 1 이 값들은 부 정확할 수 있다.

 

'[+] Forensic' 카테고리의 다른 글

File System - NTFS (1)  (0) 2012.02.06
File System - FAT (10)  (0) 2012.02.05
File System - FAT (9)  (0) 2012.02.04
File System - FAT (8)  (0) 2012.02.03
File System - FAT (7)  (0) 2012.02.02
이번 글 부터는 FAT 파일시스템의 각 데이터 구조체들을 자세히 살펴 보도록 하겠다.

현재 글에서는 부트 섹터와 FAT 32 파일시스템에만 존재하는 FSINFO 구조체를 알아 볼 것이다. 

일단 부트 섹터는 파일시스템 첫 섹터에 존재하며 FAT 파일시스템의 종류에 따라 조금씩 다르다.


하지만 첫 36byte는 동일하다. 일단 부트 섹터의 36byte부터 살펴보자.

[그림 1 - 부트섹터 처음 36byte]

위 이미지만 봐서는 정확히 설명이 안되는 부분이 있기 때문에 아래에 설명이 필요한 부분을 따로 설명 해 두었다.

 - 부트 코드 점프 명령어 : 해당 부분은 부팅 파일시스템이 아니면 설정되지 않아도 되는 부분이다.

 - 섹터당 바이트 수 : 이 부분은 주로 512, 1024, 2048, 4096 바이트로 할당되며, 이미지의 경우 512byte로 할당 된 것을 볼 수 있다.

 - 클러스터 당 섹터 수 : 클러스터 당 섹터 수는 2제곱의 숫자만이 할당되는데 현재 이미지를 보면 1로 할당 되어 있어 정상적으로 할당 된 것을 알 수 있다.

 - FAT 영역 개수 : 이 부분은 보통 2로 할당되지만 일부 작은 저장 장치에서는 1로 할당 되기도 한다.

 - 루트 디렉토리 최대 파일 개수 : 이 부분은 FAT 파일시스템 종류마다 조금씩 차이가 있다.
     1) FAT 12 : 224
     2) FAT 16 : 512
     3) FAT 32 : 0

- 파일시스템 섹터 수 : 이 부분은 2바이트로 표현된다.  2바이트로 표현되는 값보다 섹터 수가 많다면 0으로 설정된다.

- 미디어 유형 : 디스크 유형에 따라 다른 값이 할당 되는 부분으로, 고정식 디스크의 경우 "0xF8", 이동식 디스크의 경우 "0xF0" 이 할당 된다.

 - FAT 영역의 섹터 수 : 이 부분은 FAT 12/16의 FAT 영역 섹터 수를 나타내는 부분으로 FAT 32의 경우는 0이 할당 된다.

 - 파일시스템 섹터 수 : 위 2바이트로 표현되는 부분과 동일하나 차이점이 있다면 4바이트로 표현된다는 것이다. 2바이트로 표현이 안될 시 2바이트 부분은 0으로 설정되고 이 부분에 섹터 수가 설정 된다. 두 부분 중 한 부분은 무조건 0이 되어야 한다.



위에서 설명한 36byte 부분 다음부터는 FAT 12/16 과 FAT 32가 다르다. 하나의 이미지로는 설명 할 수 없어 설명은 표로 대신 한다.

 [그림 2 - FAT 12/16의 부트 섹터 나머지 부분]

 

[그림 3 - FAT 32의 부트 섹터 나머지 부분]

* 참고 : FAT 32의 경우 버전번호 필드가 있는데 이 부분은 현재 한가지만 사용된다.

공통적으로 시그니처 값 전에 사용하지 않는 영역이 있는데 이 부분은 특별한 목적이 없기 때문에 사용되지 않는다고 표현 해 두었을 뿐, 일반적으로는 부트코드와 오류 메시지를 저장한다.

* 참고 : 볼륨 시리얼 번호는 Win 98에서만 날짜와 시간에 기반을 두어 계산을 했기 때문에 현재 98을 사용하는 시스템은 그렇게 많지 않으므로 계산방법은 생략하겠다.


부트 섹터 설명은 여기까지이다.

다음은 FSINFO 구조체에 대해서 알아 볼 것이다.

이 글 처음에서도 언급 했듯이 FSINFO 구조체는 FAT 32 파일시스템에만 존재하며 구조체의 역할은 운영체제가 새로운

클러스터를 어디에 할당하는지 설명하는 것이다.

각 오프셋 범위 별 설명은 아래 표로 대신하겠다.

[그림 4 - FSINFO 구조체 오프셋]


'[+] Forensic' 카테고리의 다른 글

File System - FAT (10)  (0) 2012.02.05
File System - FAT (9)  (0) 2012.02.04
File System - FAT (8)  (0) 2012.02.03
File System - FAT (7)  (0) 2012.02.02
File System - FAT (6)  (0) 2012.02.02
이번 글에서는 파일 복구와 FAT 파일시스템의 종류를 결정하는 방법, 일관성 검사에 대해서 알아보도록 하겠다.

[파일 복구]
파일 삭제 과정을 보면 FAT 엔트리가 0이 되고 디렉토리 엔트리가 비 할당 상태로 바뀌면서 디렉토리 엔트리의 첫 바이트가 "0xE5" 로 설정된다. 파일을 복구하기 위해서는 파일의 시작 위치(시작 클러스터)와 크기를 알아야 한다.
하지만 시작 클러스터만 알 수 있을 뿐 나머지 연계되는 클러스터는 정확하게 알지 못한다.
파일시스템의 파일의 클러스터들 배치는 아래와 같은 경우들이 있다.

 - 연속적인 클러스터 할당의 경우

 [그림 1 - 연속 할당 클러스터]

위 경우 파일 복구는 정말 쉽다. 시작 클러스터인 45를 시작으로 파일의 크기만큼인 48까지만 복구해주면 된다.

 - 할당 클러스터 사이의 다른 클러스터

 [그림 2 - 클러스터 단편화]

위 경우 파일 내용 클러스터 사이에 전혀 다른 파일의 할당 클러스터가 위치 하고 있어 시작 클러스터인 45부터 파일의 크기만큼 복구를 시도하면 47이라는 전혀 다른 파일 할당 클러스터가 섞여 완전한 복구가 되지 않는다.

 - 할당 클러스터 사이의 비 할당 클러스터

 [그림 3 - 클러스터 단편화 2]

위 경우도 두 번째 경우와 마찬가지로 복구 시도 시 비 할당 클러스터 때문에 완전한 복구가 되지 않는다.

이런 문제점을 해결 하기 위해서는 파일을 지우기 전 디스크의 파일 조각 모음을 통해 클러스터를 한곳으로 모아야 한다.

파일 조각 모음을 할 경우 클러스터가 좀 더 연속적으로 배치되기 때문이다.  


지워진 후 파일 조각 모음은 의미가 없으며 해당 클러스터들은 다시 할당 되었을수도 있기 때문에 불필요 하다. 

 

[종류 결정]
FAT 파일시스템은 여러 종류가 있는데 정작 파일시스템은 그 종류를 결정하는 기능이 없다.
FAT 파일시스템은 데이터 영역의 클러스터 개수에 따라 종류를 결정 할 수 있다. 클러스터의 개수를 알기 위해서는 데이터 영역의 섹터 개수를 알아야 한다.
FAT 12/16 파일시스템의 경우 루트 디렉토리는 FAT 영역 다음인 데이터 영역 첫 번째 섹터에 위치하고, 이 영역 다음에 클러스터 2가 시작 된다.  FAT 32 파일시스템의 경우 루트 디렉토리가 유동적이어서 클러스터 2가 데이터 영역 첫 번째에 위치하게 된다. 이러한 루트 디렉토리의 엔트리 개수는 부트 섹터에서 알 수 있으며 FAT 32의 경우 0이다. 
아래는 루트 디렉토리의 섹터 개수(루트 디렉토리 크기)를 계산하는 공식이다.

 - ((루트 디렉토리 엔트리 개수 * 32) + (섹터 당 바이트 - 1)) / (섹터 당 바이트)

클러스터에 할당 된 섹터 수(데이터 영역)는 파일시스템 전체 섹터에서 예약 영역 크기, FAT 영역 크기, 루트 디렉토리 크기를 빼면 된다.

 - 파일시스템 전체 섹터 수 - 예약 영역 크기 - FAT 구조체 개수 * FAT 구조체 크기 - 루트 디렉토리 크기

위 공식의 계산으로 인해 데이터 영역의 크기가 나오고 이 값을 클러스터 당 섹터 수로 나누면 클러스터 개수가 나온다.

 - 데이터 영역 크기 / 클러스터 당 섹터 수

각 FAT 종류는 데이터 영역의 클러스터 개수가 아래처럼 다르다.

 - FAT 12 : 4,085보다 작을 때
 - FAT 16 : 4,085보다 크거나 같을 때
 - FAT 32 : 62,525와 크거나 같을 때 


[일관성 검사]
일관성 검사는 FAT 파일시스템을 분석하기 전에 하는 것이 좋다. 목적은 숨겨진 데이터가 있는지 점검 하는 것에 있다.
FAT 32 파일시스템에서 백업 부트 섹터가 있다면 이를 이용 해 원본과 백업본을 비교하는 일관성 검사를 수행 해야 한다.
마지막 클러스터의 FAT 엔트리와 FAT에 할당 된 섹터 끝 사이에 공간은 파일시스템에서 사용되지 않아 데이터가 숨겨질 수 있는 공간이기 때문에 조사를 수행 해 봐야 한다. 마지막 클러스터와 파일시스템 마지막 사이에도 할당 되지 않은 섹터가 있을 수 있으니 조사를 수행해야 한다. 루트 디렉토리와 하위 디렉토리 조사를 반드시 수행해야 하며, FAT 각 클러스터 연결은 할당 된 디렉토리 엔트리가 그 시작을 가리키는지도 점검해야 한다.
볼륨 레이블로 표시된 디렉토리 엔트리는 시작 클러스터를 갖지 않아야 하고, 파일시스템에서는 유일해야 한다.
할당 된 LFN 디렉토리 엔트리들의 체크섬을 조사해보고, 할당 된 SFN 엔트리와 비교해야 한다.
만약 관련된 SFN 엔트리를 찾을 수 없다면 그 LFN 엔트리들을 조사해야 한다. 이는 긴 파일명을 지원하지 않는 OS를 사용해서 파일시스템과 충돌이 나거나, 숨겨진 데이터가 있다는 것을 의미한다.
또 값이 0이거나 난수인 디렉토리 엔트리들은 영구 삭제 도구가 접근 했던 엔트리 이거나, 예전에 할당 되었던 엔트리 일 가능성이 있다.
마지막으로 NULL 엔트리 이후에 디렉토리 엔트리가 있는지 검사해야 한다. 대부분의 운영체제는 NULL 엔트리 이후의 엔트리는 보여주지 않는다. 

'[+] Forensic' 카테고리의 다른 글

File System - FAT (9)  (0) 2012.02.04
File System - FAT (8)  (0) 2012.02.03
File System - FAT (7)  (0) 2012.02.02
File System - FAT (6)  (0) 2012.02.02
File System - FAT (5)  (0) 2012.02.02
이번 글에서는 FAT 파일시스템에서 파일 생성, 삭제가 어떻게 이루어지는지에 대해서 이야기 할 것이다.

생성, 삭제 수행들은 여러 참조 모델들의 데이터를 이용하여 이루어 지는데 그 과정은 아래와 같다.

[파일생성 과정]
디렉토리(dir)는 생성되어 있으며 클러스터의 크기는 4096byte이고 파일 크기는 5000byte라고 가정한 과정이다.

1. 볼륨 섹터 0에서 부트 섹터를 참조하고, FAT 구조체와 데이터영역, 루트 디렉토리의 위치를 파악한다.

[그림 1 - 1번 과정]

2. 디렉토리를 찾기 위해 루트 디렉토리에서 각 디렉토리 엔트리를 해석하고, 찾을려고 하는 디렉토리의 이름과 디렉토리 속성을 이용하여 찾으려고 하는 디렉토리의 엔트리를 찾는다.

 [그림 2 - 2번 과정]

  * 참고 : 루트 디렉토리에는 "." 이 존재하지 않으나, 이미지에는 루트 디렉토리를 나타내기 위한 방편으로 추가하였다.

3. dir 시작 클러스터(10)의 내용을 읽고, 사용 가능한 디렉토리 엔트리를 찾아 파일명을 입력 한 후 할당 상태로 전환시킨다. 또 파일의 크기와 시간값도 입력한다. 그 후 파일 내용을 위한 클러스터를 할당 하기 위해 FAT 영역의 FAT 구조체를 이용한다. FAT 구조체에는 파일명, EOF, 다음 클러스터 주소 데이터, 타입 등이 포함된다. FAT 구조체로 클러스터를 할당 한 후 클러스터 10의 File.txt 디렉토리 엔트리에 시작 클러스터를 입력하고, 할당 된 클러스터에 파일 내용을 입력한다.

[그림 3 - 3번 과정]


4. 하지만 클러스터의 크기보다 파일의 크기가 더 커 또 하나의 클러스터를 할당 한다. 클러스터를 할당 하기 위해 FAT 영역의 FAT 구조체를 이용한다. 적당한 구조체를 통해 또 하나의 클러스터를 할당한다. 

[그림 4 - 4번 과정]

5. 시작 클러스터의 FAT 구조체에서 EOF 데이터를 지우고 다음 클러스터 주소를 입력한다. 그 후 나머지 파일 내용을 새롭게 할당 된 클러스터에 입력한다.

[그림 5 - 5번 과정]
 
 * 참고 : 위 이미지에는 나와있지 않지만, 클러스터 101의 FAT 구조체는 EOF 설정이 되어 있다.

 

이제 삭제 과정을 알아보자. 삭제 과정은 의외로 간단하다.

[파일삭제 과정]
파일 삭제 과정은 아래와 같다.

1. 파일 생성 과정 전체 과정처럼 파일의 클러스터 연결 확인까지 진행한다.

2. 클러스터 연결 확인을 수행했다면 해당 파일과 연관되어 할당되어 있는 클러스터의 FAT 구조체 엔트리 모두를 0으로 설정한다.

3. 그 후 디렉토리 엔트리의 첫 바이트를 "0xE5" 로 변경하여 해당 파일을 디렉토리 엔트리에서 할당 해제 시킨다.

위 과정을 거치면 아래와 같은 상태가 된다.

[그림 6 - 삭제 상태]

위 상태가 되면 커맨드 명령어나 탐색기로는 해당 파일에 접근이 불가능하다.



'[+] Forensic' 카테고리의 다른 글

File System - FAT (8)  (0) 2012.02.03
File System - FAT (7)  (0) 2012.02.02
File System - FAT (6)  (0) 2012.02.02
File System - FAT (5)  (0) 2012.02.02
File System - FAT (4)  (0) 2012.02.01

+ Recent posts