디렉터리 엔트리 분석 (Directory Entry Analysis)
Directory Entry
디렉터리 엔트리는 Windows의 FAT(File Allocation Table) 파일시스템에서 파일의 이름, 확장자, 위치, 크기, 시간정보 등을 표현하기 위한 구조체이다. 하나의 파일 및 디렉터리는 각각의 메타정보를 표현하기 위해 하나의 디렉터리 엔트리를 가진다. 편의상 파일 및 디렉터리라는 용어는 파일로 통일해서 설명하겠다.
FAT 파일시스템의 FAT 영역에 이어서 오는 루트 디렉터리(Root Directory)영역(FAT32는 설계상 파일시스템의 어느 곳에나 올 수 있다)을 살펴보면 최상위 디렉터리에 존재하는 파일들의 디렉터리 엔트리를 확인할 수 있다. 디렉터리 엔트리는 32바이트의 고정된 형태로 해당 파일의 메타정보를 표현하는데 구조는 다음과 같다.
- 0 – 0 : File Name or Status Bytes
- 1 – 7 : File Name
- 8 – 10 : File Extension
- 11 – 11 : Attributes
- 12 – 13 : Reserved
- 14 – 15 : Created Time
- 16 – 17 : Created Date
- 18 – 19 : Accessed Date
- 20 – 21 : Starting Cluster High 2 Byte
- 22 – 23 : Written Time
- 24 – 25 : Written Date
- 26 – 27 : Starting Cluster Low 2 Byte
- 28 – 31 : File Size
디렉터리 엔트리는 기본적으로 이름을 표현할 수 있는 필드가 8바이트이다. 그 중 첫번째 바이트는 파일이 파일시스템상에 존재할 경우 파일이름을 표현하기 위해 사용되지만 파일이 삭제되었을 경우에는 0xE5의 값으로 해당 파일이 삭제되었다는 것을 나타낸다.
그리고 확장자와 생성날짜 및 시간, 접근 날짜, 수정 날짜 및 시간, 파일 크기, 해당 파일의 클러스터 시작 위치 등의 정보를 제공한다. 흔히 MAC(Modified, Accessed, Created) 시간이라고 하는 정보는 FAT에서는 표현하지 못한다. 마지막 접근에 대해 날짜 정보만 유지하기 때문이다. 이후 NTFS에서는 MFT Entry라는 새로운 구조를 사용해 모든 시간 관련 정보를 표현하고 있다.
파일이름을 표현하기 위해 8바이트의 필드만 사용하는데 다음은 "proneer.txt"라는 파일을 생성한 후 해당 디렉터리 엔트리를 확인할 것이다. "proneer"라는 파일이름은 7바이트만 사용하기 때문에 하나의 디렉터리 엔트리를 사용해 파일이름을 표현할 수 있다. 8바이트를 초과할 경우에는 LFN(Long File Name) 엔트리라는 새로운 구조를 사용해 파일이름을 표현한다.
LFN (Long File Name) Entry
LFN 엔트리는 8바이트를 초과하는 파일의 이름을 표현하기 위해 FAT 파일시스템에서 사용하는 엔트리로 구조는 다음과 같다.
- 0 – 0 : Sequence Number or Status Byte
- 1 – 10 : LFN Character 1-5 (Unicode)
- 11 – 11 : Attributes
- 12 – 12 : Reserved
- 13 – 13 : Chesum
- 14 – 25 : LFN Character 6 – 11 (Unicode)
- 26 – 27 : Reserved
- 28 – 31 : LFN Character 12-13 (Unicode)
LFN 엔트리는 앞서 살펴본바와 같이 파일이름을 표현하기 위해 유니코드 형식을 사용한다. 디렉터리 엔트리로 파일이름을 모두 표현하지 못할 경우에는 디렉터리 엔트리는 LFN 엔트리을 사용한다는 의미로 짧은 파일이름 형식('~'포함)으로 변환되고 실제 파일이름은 LFN 엔트리를 사용하여 표현한다. 하나의 LFN 엔트리는 13문자만 표현가능하기 때문에 13문자를 넘을 경우에는 하나 이상의 LFN 엔트리가 사용된다. 여러 개의 LFN 엔트리는 Offset 0번의 Sequence Number를 통해 순서를 구별한다.
다음은 "forensic-proof.txt" 라는 이름을 가진 파일을 생성하였을 경우 표현되는 디렉터리 엔트리와 LFN 엔트리의 모습이다. 제일 하단의 32바이트가 디렉터리 엔트리이다. 8바이트를 초과하였기 때문에 "FORENS~1"이라는 짧은 파일이름 형식으로 표현되었다.
그 위로 따라 오는 두 개의 32바이트 영역이 LFN 엔트리를 나타낸다. 위의 LFN 엔트리 구조를 참고하면"forensic-proof.txt"라는 파일이름이 표현되어 있는 것을 확인할 수 있다.
한글 이름의 표현 방식
지금까지 살펴본 내용은 파일시스템과 관련된 책이나 문서를 찾아보면 쉽게 알 수 있는 내용이다. 다음은 FAT 파일시스템 상에서 한글이름을 가진 파일을 생성하였을 경우에 나타나는 결과를 살펴볼 것이다. 언듯 생각했을 경우 한글 이름은 LFN 엔트리를 사용해서 표현할 것만 같았다. 그래서 8바이트를 초과하지 않는 경우에도 LFN 엔트리를 사용할 것으로 생각했으나 결과는 예상밖이었다.
다음은 "프로니어.txt"라는 파일을 생성한 후 해당 파일의 디렉터리 엔트리를 확인한 것이다. 한글을 표현하기 위해서는 2바이트가 필요하기 때문에 "프로니어"라는 파일이름은 하나의 디렉터리 엔트리를 사용해 표현이 가능하다. 디렉터리 엔트리에는 한글을 표현하기 위해 한글 완성형 코드 값을 사용하였다. 다음은 각 글자에 대응되는 한글 완성형 코드 값이다.
- 프 : 0xC7C1
- 로 : 0xB7CE
- 니 : 0xB4CF
- 어 : 0xBEEE
한글 완성형 코드 값은 다음의 사이트를 통해 확인할 수 있다.
http://kkamagui.tistory.com/234
http://kkamagui.tistory.com/234
한글 완성형은 유니코드가 나오기 전에 1987년 컴퓨터 시스템에서 한글을 표현하기 위해 정부가 제정한 것으로 미리 정해놓은 한글 음절에 대응되는 2바이트 코드값을 사용하는 방식이다. 아직 유니코드로 완전한 전환이 이루어지지 않았기 때문에 대부분 한글 완성형을 사용하고 있다.
이처럼 한글이름은 4음절을 초과하지 않을 경우에는 디렉터리 엔트리를 사용해 표현되며 한글 완성형 코드 값으로 기록된다. 그렇다면 4음절을 초과하게 되면 어떻게 될까? 예상한 것처럼 한글 완성형 코드 값으로 짧은 이름 형식이 표현되며, 실제 파일이름은 LFN 엔트리를 사용해 유니코드로 표현된다.
다음은 "포렌식프루프닷컴.txt"라는 파일을 생성한 후 해당 파일의 디렉터리 엔트리를 확인한 것이다. 각 글자에 대응되는 유니코드 값은 다음과 같다.
- 포 : U+D3EC
- 렌 : U+B80C
- 식 : U+C2DD
- 프 : U+D504
- 루 : U+B8E8
- 프 : U+D504
- 닷 : U+B2F8
- 컴 : U+CEF4
유니코드와 UTF-8에 대한 코드표는 다음의 사이트를 통해 확인할 수 있다.
http://www.utf8-chartable.de/
http://www.utf8-chartable.de/
"포렌식프루프닷컴.txt"는 12글자로 하나의 LFN 엔트리를 통해 표현이 가능하다. 위의 LFN 엔트리 구조와 대응시켜보면 쉽게 각 문자에 대응되는 유니코드 값을 찾을 수 있을 것이다.
0 개의 댓글