관리 메뉴

IT창고

VHD로 알아보는 FAT32 본문

보안/Digital forensic

VHD로 알아보는 FAT32

방구석여포 2018. 9. 26. 22:58

2018/07/06 - [보안/Digital forensic] - FAT32 파일시스템에서 FAT32에 대해 알아봤으며 이번에는 실제PC에서 VHD를 만들어 자세히 살펴보도록 하겠습니다. 


사용할 에디터는 hex editor입니다. 에디터의 종류도 여러가지가 있는데 010editor가 가장 유명하며 winhex도 있습니다. 010editor의 경우 유료 라이센스를 5만원 정도로 구입해야만 합니다. 

hex editor의 경우 https://mh-nexus.de/en/downloads.php 에서 무료로 다운로드가 가능합니다.


하드디스크의 구조를 잠시 살펴보면 1개의 sector가 512byte이며 대부분 클러스터 단위로 많이 관리를 합니다. 단 문제가 될 경우가 있는데 DB의 경우 DB의 칼럼 용량을 주의해야하며 클러스터를 너무 크게 할 경우 낭비공간과 읽기/속도가 느려집니다.



본격적으로 FAT32에 대해 살펴보겠습니다. 테스트 환경은 실제PC에서 VHD를 만듭니다. 


실행창에 diskmgmt.msc 를 입력하면 위와 같은 창이 나옵니다. VHD를 만드는 법은 동작 -> VHD만들기를 클릭합니다.


원하는 위치에 가상디스크를 지정하고 저는 3GB의 고정크기로 만들었습니다.


만들었다면 아직 초기화가 되어있지 않다고 나와있습니다. 초기화를 시킬때 MBR형식으로 초기화 시켜줍니다.


초기화 시키고 볼륨까지 생성했다면 실제PC에서 폴더에 방금만든 드라이브가 추가된것이 눈에 보입니다.

위의 드라이브로 테스트를 진행합니다.

볼륨을 생성시킬때 할당받는 크기가 있습니다. 기본값으로 할 경우 8개의 sector가 1개의 클러스터입니다. 즉 1cluster = 8sector = 4096byte 입니다.


HxD에서 기타설정에 보면 디스크 열기가 있습니다. 논리디스크와 물리디스크가 있으며 만약 논리디스크로 열게 되면 0섹터가 MBR부터가 아닌 BR부터 시작되게 됩니다.


MBR에 대한 자세한 내용은 2018/07/05 - [보안/Digital forensic] - 디스크 주소 표현 방식, MBR를 참고합니다. 부트코드의 마지막 부분을 보면 디스크 서명이 있습니다. 부트코드는 모든 윈도우10과 같지만 디스크 서명만큼은 다른 값을 가지게 됩니다. 

정확히 살펴보면 440byte까지는 부트코드이며 그 다음 4byte가 디스크 서명이고 그 다음 2byte는 보통 00 00의 값을 가지며 446byte 모두를 모두 부트코드라고 합니다.


부트코드 아래에 64byte가 파티션의 정보이며 마지막 4byte는 시그니처입니다.

윈도우는 Little Endian방식을 사용하며 시그니처를 읽을 경우 AA 55로 읽어야만 합니다. Big Endian보다 속도는 빠르지만 안정성은 떨어지는 편입니다.


만약 MBR에 문제가 생기면 부트코드 안에 존재하는 에러메세지가 출력되게 됩니다. 


현재 만든 파티션은 FAT32이며 하나의 파티션만 존재합니다. 


00

 부팅불가 (부팅가능은 80)

 02 03 00 

 사용하지 않음

 0C 

 FAT32(0x0B, 0x0C)     (0x07은 NTFS, 0x05 확장파티션)

 8C 0A 82 

 사용하지 않음

 80 00 00 00 

 LBA시작주소 (128번 섹터가 FAT32 시작지점)

 00 00 20 00

 총 섹터의 수 (2097152*512= 값/1024 = 값/1024= 1024즉 1GB)

파티션의 정보를 읽어보면 위와 같습니다.


Tip.

하드디스크의 부팅순서를 보면 먼저 BIOS 하드웨어 검사 -> 부팅순서 확인 -> MBR읽기 -> 부팅가능하면 해당 파티션으로 가기 -> 해당 파티션안에 있는 OS를 읽기 입니다.

대표적으로 USB는 기본 파일시스템이 FAT32입니다. 만약 앞에 80이 아닌 00으로 바꿔버리면 부팅이 불가능해집니다.


Tip.

VHD 확장파티션 만들기

VHD의 확장파티션은 디스크 관리에서는 만들수가 없습니다. cmd를 관리자 권한으로 들어가서 diskpart툴을 사용해야 합니다. 사용명령어는 위와 같으며 사용가능한 공간이 있어야만 합니다. 마지막에 명령어 assign를 입력하면 자동으로 드라이브명을 할당해줍니다.


실제로 논리 드라이브가 생긴걸 확인할수있습니다.



RootDirectory를 찾도록 하겠습니다. 

RootDirectory는 MBR~BR과 예약된 영역과 FAT#1+FAT#2를 모두 합한 위치가 RootDirectory의 위치입니다.


FAT의 BR구조이며 MBR~BR의 값은 MBR에 있는 파티션에서 찾아볼수있습니다. 128섹터로 이미 알고 있습니다.

예약된 영역(Reserved Sector Count)는 128번 섹터에서 찾아볼수있습니다. 


위의 사진이 현재 테스트중인 BR이며 예약된 영역은 0x10 0x0E로 4110입니다.  128 + 4110을 할 경우 클러스터 테이블로 갈수있습니다. 


실제로 4238섹터에 클러스터 테이블이 존재합니다. 


FAT#1의 경우는 FAT size 32입니다. 0x07 0xF9이며 2041입니다. 

FAT#2도 같은 값을 가지므로 2041입니다. 


이제 MBR~BR 과 예약된 영역과 FAT#1,2를 더해보면 128 + 4110 + 2041+ 2041 = 8320섹터입니다.


RootDirectory를 제대로 찾아오게 되었습니다.


테스트를 위하여 폴더와 텍스트 파일을 생성하여 넣어두었습니다. HxD로 RootDirectory가보면 방금 생성한 실제 파일들의 정보가 있습니다. RootDirectory Entry 구조는 아래의 그림을 참조합니다.


gsk.txt파일의 정보를 살펴보면 아래와 같습니다. 


47 53 4B 20 20 20 20 20

NAME (GSK) 

 54 58 54

확장자 TXT 

 20

0x20은 일반파일 0x10은 디렉토리 0x01은 읽기전용 0x02는 숨김파일 

 18

 X

 A6

 X

 0B BF

10111 111000 01011 

23   56   11*2

즉 오후 11시 56분 22초입니다.

 3A 4D 

 0100110 1001 11010    (1980년이 기준점)

1980+38   9   26

즉 2018년 9월 26일 입니다.

 3A 4D

 접근 날짜

 00 00

상위 클러스터 

 1A BF

수정 시간 

 3A 4D

수정 날짜 

 08 00 

하위 클러스터 

 1C 00 00 00

 29Byte 크기

날짜 계산법과 시간 계산법은 이진수로 바꿔서 구분합니다. 


실제 gsk.txt파일이 있는곳으로 이동해보겠습니다. 

하위 클러스터를 참고하여 하위 클러스터 -2 *8 = 값 + RootDirectory = 실제 파일위치 입니다. 

계산해보면 8 - 2 * 8 = 48 + 8320 = 8368섹터입니다.


실제로 어떤 데이터가 존재하며 TXT는 시그니처가 없기 때문에 위의 데이터를 복구해보겠습니다.


.txt의 확장자로 파일을 복구해보면 실제 gsk.txt파일의 내용을 복구해낼수있습니다.

Comments