* 들어가기에 앞서 본 스터디에 사용 된 OS 종류 및 VMware 종류에 대해 기술하고 시작하고자 한다. 다른 버전이어도 상관은 없으나, 사용 상 불편한 부분까지 본 블로그에서 일일히 다루어 주지는 않는다. 물론, 질문을 남겨줄 경우, 따로 확인해서 답변을 드리긴 하겠다.

  - 필자 E-Mail : wotmd9408@naver.com

  - 가상머신 : VMWare WorkStation 12

  - OS : Window7 Enterprise K 64bit

  - RAM : 1GB

  - 나머지 사항은 기본적인 세팅으로 설정하였다.

  - 추가 필요 Tool : Hxd(https://mh-nexus.de/en/downloads.php?product=HxD)


지난 포스팅을 통해 FAT32 분석을 위한 환경 구성을 진행하였다. 환경 구성이 뭔지 궁금한 독자분들 혹은 아직 구성을 하지 않으신 분들은 바로 전 포스팅(3. FAT32#1)으로 돌아가 환경구성을 진행하면 되겠다. 

환경 구성이 마무리 된 독자들은 상단 추가 필요 Tool의 URL을 타고 들어가 HxD를 다운받아 설치하도록 한다. 실제 업무를 함에 있어서는 HxD로 보는 일이 많지 않고 HxD보다 좋은 도구들이 많이 나와있다. 그러나 그 도구들을 사용함에 있어서 정확한 결과를 내려면 기본에 충실해야 한다. 필자가 본 블로그를 시작하고 포스팅을 함에있어서 가장 우선시했던 부분 역시 바로 '기본' 이다. 


설치한 HxD를 '관리자 권한'으로 실행하도록 하자. 반드시 관리자 권한으로 실행하여야 한다. 일반 사용자로 Disk를 불러오려고 하는 경우 오류메시지를 띄우며 Disk를 불러오지 않는다. 


[그림 .1 HxD를 이용해 Disk 열기]

HxD를 실행한 수 위쪽의 디스크 모양(작은 네모)를 클릭하면 [그림 1]과 같이 디스크 열기 창이 열린다. [디스크 열기] 창은 크게 논리 디스크와 물리 디스크로 구분이 되어있는데 논리 디스크를 선택할 경우 바로 해당 파티션의 Boot Record로 시작한다. 반면 물리 디스크에 속해있는 부분을 선택 할 경우 Master Boot Record부터 시작되게 된다. 마지막으로 '읽기전용으로 열기' 체크를 해지해 주고 수락을 누르면 우리가 원하는 파티션 디스크를 열 수 있다.(물리 디스크에서 선택해야 하는 디스크는 실습 환경에 따라 다를 수 있다.)


이후 보이는 화면은 독자여러분이 이 블로그의 포스팅을 제대로 봤거나, 혹은 다른 경로를 통해서 공부를 했던 기억이 있다면 눈에 익은 화면일 것이다.(기억이 나지 않는다면 http://jh8992.tistory.com/entry/FileSystem-Forensics-FAT32 를 참고하기 바란다.) 물리 디스크 선택을 통해 보이는 가장 첫 화면은 바로 여러분이 선택한 디스크의 Master Boot Record이다. MBR에 대한 설명은 앞서 포스팅을 통해 설명했기 때문에 여기서는 설명하지 않고, 바로 Boot Record 로 넘어가기 위한 내용만 서술 하기로 한다.


[그림 2. VHD의 MBR 구조]

부팅에 필요한 프로그래밍이 포함되어있는 440byte(Boot Code)를 넘어가면 우리가 원하는 파티션 테이블 영역을 확인 할 수 있다. [그림 2]에서 보면 해당 파티션은 부팅은 불가능한 파티션(Bootable Flag Value =0x00)이며 파티션 타입은 0x0B로 FAT32인 것을 알 수 있다. Start LBA Address는 0x80(Dec = 128)로 이 Start LBA Address가 바로 우리가 원하는 파티션의 시작 위치이자 Boot Record의 위치이다. 혼자 개인적으로 하는 공부라면 Start LBA Address만 보고 바로 BR 영역으로 넘어가겠지만, 복습을 위해 마지막 부분인 파티션의 용량도 구해보자.

이 파티션의 전체 크기를 Hex값으로 보면 0x5FE800이 된다. 이를 10진수로 변경하면 6,285,312이 되는데 이는 Size in Sector로 파티션이 사용하는 총 섹터의 '수' 이다. 한 섹터는 512Byte에 크기를 갖는데 앞서 구한 값에 512를 곱하면 전체 파티션의 크기가 나온다. 물론 단위는 byte 값으로 3,218,079,744Byte가 나오는데 이를 보기 편한 GB로 나누기 위해서는 1024로 3번 나누어 주면 된다. 결과를 계산해보면 정확히 3GB로 나누어 떨이지진 않고 2.99GB가 나오는데 반올림 하면 3GB가 된다. (계산 시 주의 할 내용이 있는데, 보통 Hex 값을 위해 프로그래밍 용 계산기를 통해 계산을 진행하는데, 이 경우 10진수 계산 시 소수점 아래자리를 버리기 때문에, 총 Byte 값을 구하고 나면 일반 계산기로 변경 후 계산하도록 한다.)


[그림 3. VHD의 Boot Record 영역]

앞서 [그림 2]에서 계산한 Start LBA Address 값의 Sector로 이동하면 [하드 디스크2]의 Boot Record로 진입하게 된다.(개인의 설정마다 결과값이 다르게 나올 수 있다. 반드시 자신의 Start LBA Address 값으로 이동하기 바란다.)

Boot Record는 해당 볼륨의 여러가지 설정 값들을 저장하고 있으며 볼륨의 첫번째 섹터에 위치하고 있다. 만약 하나의 하드 디스크에 여러개의 파티션(혹은 볼륨)이 있다면 각각의 파티션에 Boot Record가 위치하며, 단일 파티션만 위치할 경우 MBR 영역에 Boot Record가 위치한다. 


 [그림 4. Boot Record에서 필수로 알아야 할 내용]

[그림 4]는 향후 파일복구 혹은 데이터 복구를 위해 반드시 알아야 할 부분 중 하나이다. 가장 윗 줄을 기준으로 순서대로 목록을 정리하면 아래와 같다.

 - Byte Per Sector(섹터 당 Byte 수)

 - Sector Per Cluster

 - Reversed Sector Count

 - Number of FATs

 - Total Sector 32(볼륨 섹터 수)

 - FAT Size 32(FAT 영역의 섹터 수)

Byte Per Sector는 하나의 Sector가 차지하는 Byte 수, 즉 용량을 나타낸다. 따로 설정을 하지 않는다면 Default로 0x200(Dec = 512)로 고정이 되며, 앞서 MBR에서 Size in Sector를 구할 때 512를 곱한 이유가 여기에 있다. 보통은 따로 설정을 하지 않기 때문에 512Byte로 알고 계산을 해도 상관없기는 하지만, 앞서 설명했듯이 "절대"라는 값을 갖는 것은 없다. 따라서 분석을 하거나 복구를 함에 있어 반드시 이 부분을 확인해야 한다.

Sector Per Cluster는 하나의 클러스터가 갖는 섹터의 수를 의미한다. 쉽게 이해시켜주기 위해서 한가지 실습을 해보고자 한다. 지금 메모장을 열고 'test'라는 간단한 단어를 입력 후 저장하자. 영어는 하나의 단어가 1Byte의 값을 가지기 때문에, 방금 생성한 텍스트 파일은 4Byte 값을 가져야 한다. 과연 그런가? 저장된 파일의 용량은 우리의 예상대로 4Byte가 아닌 4KByte가 되는것을 확인 할 수 있다. 왜 우리가 예상한 결과와 다른 값을 가지는가? 그 이유가 바로 이 Sector Per Cluster이다. 

Reversed Sector Count는 시스템을 위해 예약 된 영역이다. 해당 영역은 시스템이 나중을 대비해 비워둔 영역이다.  미래를 위해 비워두었지만, 주 용도는 Boot Record 저장과 주요 항목의 백업이다. 여기서 알 수 있듯이, 예약영역에는 Boot Record가 포함되는데 Boot Record는 예약영역의 가장 앞 Sector에 위치하게 된다.

Number of FATs는 사실 그렇게 중요한 부분은 아니다. 보통 값이 2로 고정되어 있으며 볼륨에 있는 FAT 영역의 수를 표기한다. 1로 표기되어 있어도 Window는 호환성을 보장하기는 한다. 만약 1로 되어있는 경우가 있다면 뒤에 나올 Directory Entry를 갈 때 계산을 조금 달리해야 한다. 대부분은 2로 되어있겠지만.. 세상에 무조건 이라는 내용은 없으니 반드시 확인이 필요한 부분이다.

Total Sector 32는 여러분이 MBR영역에서 확인 한 Size in Sector와 동일한 값을 갖는다. 이 영역은 해당 볼륨이 가지고 있는 섹터의 수를 의미하기 때문에, MBR에서 호가인 한 Size in Sector와 동일 한 값을 가져야 한다.

FAT Size 32는 FAT 영역이 갖는 섹터 수를 의미한다. 그러나 여기서 주의해야 할 점이 하나있다. FAT Size 32는 위의 Number of FATs의 값인 2가 아닌 하나의 FAT 영역이 갖는 섹터 수를 의미한다. 앞서 환경구성에 대한 포스팅을 할 때 간단히 FAT32 구조에 대해서 표기해준 적이 있다. 해당 구조에서 FAT#1, FAT#2로 표기한 것은 각각의 FAT영역을 의미한다.


위에 정리한 주요 6개의 영역을 포함한 나머지 기타 영역은 아래와 같으며, 해당 내용에 대해 간략히 표현에 보도록 하겠다.

[그림 5. Boot Record Structure]


 - Jump Boot Code : Boot code로 넘어가기 위한 코드

 - OEM Name : OEM 회사를 나타내는 문자열(바뀌어도 부팅에는 문제되지 않는다)

 - Byte Per Sector : 1개의 섹터가 가지고 있는 byte 수(Default 설정 시 512byte)

 - Sector Per Cluster : 1개의 클러스터가 가지는 Sector 수

 - Reserved Sector Count : 예약 영역이 가지고 있는 Sector 수

 - Number of FATs  : 볼륨에 존재하는 FAT 영역의 수(Default 2개)

 - Root Directory Entry Count : Root Directory 내에 몇개의 파일 / 디렉토리를 수용할지 기록하는 부분. 

    -> FAT32의 경우 Root Directory 위치가 지정되어있지 않기 때문에 0으로 채워진다.

 - Total Sector 16 : FAT16 파일 시스템에서 볼륨의 섹터 수

   ->FAT32에서는 0으로 기록

 - Media : 해당 볼륨이 이동식미디어 인지 고정식 미디어인지를 구분. 플로피 디스크가 아니라면 0xF8(고정식)이 기록되어 있다.

 - FAT Size 16 : FAT16 파일시스템에서 FAT 영역이 갖는 섹터 수

   -> FAT32에서는 0으로 기록

 - Sector Per Track : Track 당 Sector의 개수를 의미하는데 Window 계열에서는 더이상 참조하지 않는다.

 - Number of Header : 볼륨의 헤더 수를 의미하며 Sector Per Track과 마찬가지로 윈도우에서는 더이상 참조하지 않는다.

 - Hidden Sector : 볼륨 앞의 숨겨진 섹터 수를 의미하며 위와 같이 윈도우에서는 더이상 참조하지 않는다.

 - Total Sector 32 : FAT32 파일시스템에서 해당 볼륨의 전체 섹터 수.

 - FAT Size 32 : FAT32 파일시스템에서 단일 FAT 영역의 섹터 수.

 - Ext Flags : FAT 테이블의 사용 여부 등 여러 설정 값 기록

 - File System Version : FAT의 버전정보를 의미하나 실제로는 0으로 기록

 - Root Directory Cluster : FAT32에서는 Root Directory가 어디에 와도 상관없기 때문에 그 시작위치를 값으로 저장한다.

 - File System Information : 파일 시스템 구조체의 위치를 기록

 - Boot Record Backup Sector : Boot Record의 백업 섹터 위치를 기록한다. 일반적으로 FAT32에서는 6번 섹터를 기록하며 0번 섹터를 기록하면 백업을 하지 않음을 의미한다.

 - Reserved : 예약된 영역으로 항상 0으로 기록

 - Driver Number : Windows 계열에서는 더이상 참조 하지 않는 영역

 - Reserved 1 : Windows NT에서 사용하기 위해 만든 예약영역. 항상 0으로 기록

 - Boot Signature : 확장 부트 서명으로 0x29를 기록.

 - Volume ID : 볼륨의 시리얼 번호

 - Volume Label : 볼륨 레이블을 명시

 - File System Type : 항시 FAT32를 기록


이로서 FAT32의 Boot Record 영역에 대한 정리를 진행했다. 다음 포스팅에서는 FAT32 영역에 대해서 정리해 보도록 한다.


 * 참고 1 : 임베디드 개발자를 위한 파일시스템의 원리와 실습(정준석, 정원용 공저), 한빛미디어

 * 참고 2 : http://hyd3.tistory.com/125

Posted by Latte_
,