c0msherl0ck.github.io

[출처 및 참고]

https://github.com/proneer/Slides/tree/master/Filesystem "(FP) FAT12,16,32 Filesystem.pdf"  (FP) FAT12,16,32 Filesystem.pdf

http://holywaterkim.tistory.com/20?category=810422 "VBR (FAT12/16/32, NTFS) 분석"

http://holywaterkim.tistory.com/3?category=810422 "MBR 분석"


charsyam 과제 "FAT32 에서 폴더 및 파일 탐색하기"


1. MBR 에서 볼륨 시작 주소 찾기

2. 볼륨의 맨 첫번째, VBR 에서 FAT(File Allocation Table) 크기 구하기

3. Data Area 시작 주소 구하기

4. 루트 디렉토리 분석하기

5. 서브 디렉토리 이동하기



1. MBR 에서 뷸륨 시작 주소 찾기



MBR 에서 파티션 테이블 엔트리의 내용은 다음과 같다.


partition type : 0x0B, (FAT32 의미)

LBA Starting Addresss : 0x3F, 63 번째 섹터(볼륨시작주소), Data area 영역을 구하는데 필요

Size in Sector : 0x3C3FC0, 3948480


해당 볼륨의 시작 주소 63 번째 섹터로 이동하면 VBR 의 Boot Sector 를 볼 수 있다.


2. 볼륨의 맨 첫번째, VBR 에서 FAT(File Allocation Table) 크기 구하기



VBR 크기 : 0x1F0, 496 번째 섹터, Data area 영역을 구하는데 필요

FAT32 크기 : 0xF08, 3848 번째 섹터 , Data area 영역을 구하는데 필요



3. Data Area 시작 주소 구하기




Data area 의 시작주소는 : 볼륨시작주소 + VBR 크기 + FAT 크기 * 2


즉, Data area 의 시작주소는 0x3F + 0x1F0 + 0xF08 * 2 = 0x203F , 8255 번째 섹터이다.


루트디렉토리가 클러스터 2번이기 때문에 Data area 의 첫 번재가 루트 디렉토리이다. 만약, 루트 데릭토리가 cluster 2 번이 아니라면 Data area 의 첫번째 영역이 root directory 가 아니다. 


참고 1. 여기서 클러스터 2번이라고 해서 볼륨의 시작주소 + 클러스터크기*2 를 하게 되면 전혀 엉뚱한 주소로 가게된다. 클러스터 2번이라는 의미는 FAT entry 표현에서 Data area 첫번재 주소부터 클러스터2번째로 표현한다는 것이지, 전체 볼륨에서 클러스터 두번째라는 얘기가 아니다.

즉, Data area 의 시작주소부터 cluster 2 번째로 카운트 한다고 생각하면 된다.


참고 2. 루트디렉토리는 Data area 영역의 어느 곳에나 올 수 있으나, 일반적으로 가장 첫번째에 온다.



4. root directory 분석



32 bytes 크기의 directory entry 로 나누어져 있으며, 파일의 이름의 길이가 긴 경우 Long File Name entry 를 통해 표현하고 있다.



위의 엔트리 구조에 따라 루트 디렉토리를 분석하면 다음과 같다.



첫번재 파일 : ① 엔트리

Attr : 0x08(Volume Label), 해당 파일의 이름이 곧 볼륨이름이며, "EVIDENCE" 이다.




두번째 파일 : ②, ③, ④ 엔트리

Attr : 0x16 = 0x10(Directory) + 0x04(System file) + 0x02(Hidden file), 시스템 숨김 폴더이며,  "System Volume Information" 이다.




세번째 파일 : ⑤, ⑥ 엔트리

Attr : 0x10(Directory), 이며 한글폴더로 한글 한 문자당 2 bytes 가 사용된다.(Little Endian 이다.) "리더십"



Name 1(Unicode) : AC B9 54 B3 ED C2 00 00 FF FF

Name 2(Unicode) : FF FF FF FF FF FF FF FF FF FF FF FF

Name 3(Unicode) : FF FF FF FF


0xB9 AC : 리

0xB3 54 : 더

0xC2 ED : 십

0x00 00 : Null (문자열의 마지막에 온다.)

0xFF : 문자가 할당되지 않을 경우 채우는 용


Name : B8 AE B4 F5 BD CA 20 20  -> 의미 없는 한글 깨진 문자.



네번째 파일 : ⑦, ⑧ 엔트리

Attr : 0x10(Directory), 이며 한글폴더로 한글 한 문자당 2 bytes 가 사용된다.(Little Endian 이다.) "성행동 심리학"


Name 1(Unicode) : 31 C1 89 D5 D9 B3 20 00 EC C2

Name 2(Unicode) : AC B9 59 D5 00 00 FF FF FF FF FF FF

Name 3(Unicode) : FF FF FF FF


0xC1 31 : 성

0xD5 89 : 행

0xB3 D9 : 동

0x00 20 : space bar

0xC2 EC : 심

0xB9 AC : 리

0xD5 59 : 학

0x00 00 : Null (문자열의 마지막에 온다.)

0xFF : 문자가 할당되지 않을 경우 채우는 용


Name : BC BA C7 E0 B5 BF 7E 31 -> 의미 없는 한글 깨진 문자



다섯번째, 여섯번째, 일곱번째 폴더 또한 같은 방법으로 분석한다.



5. Sub directory 로 이동하기


디렉토리 엔트리에서 Starting Cluster Hi, Low 를 통해 파일이 위치한 시작 클러스터 주소를 알 수 있다.



세번째 파일 "리더십" 폴더의 시작 주소를 알아보면 다음과 같다.(Little Endian 으로 표현되어 있음에 주의.)


Starting Cluster Hi : 0x00 00

Starting Cluster Low : 0x00 05


Starting Cluster : 0x00 00 00 05


※ 서브 디렉토리의 시작 주소 찾기 (이 개념을 몰라 삽질을 몇번했다.)

Root directory 의 시작클러스터가 2번이므로. 5번 클러스터는 2번클러스터의 시작주소로부터 클러스터 3개만큼의 크기를 더해주면 구할 수 있다.

2번 클러스터의 시작 주소는 루트 디렉토리, Data area 의 시작주소 8255 섹터이다.


sub directory 시작 주소 = root directory 시작주소 + 클러스터 시작 주소 차이 * 클러스터당 섹터 수

8255 + (5-2) * 8 = 8279 번째 섹터이며, 해당 위치로 이동하면 다음과 같다.


현재 폴더를 의미하는 "." 폴더

상위 폴더를 의미하는 ".." 폴더

Long File Name 을 가지는 파일 2개