* 들어가기에 앞서 본 스터디에 사용 된 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)


지난 포스팅에 이어 이번에는 FAT 영역에 대해 정리해 보도록 하겠다. 먼저 앞서 설명했던 FAT32의 구조에 대해서 기억하는지 살펴보자.


[그림 1. FAT32 구조]

[그림 1]은 FAT32#1 포스팅에서 보았을 것이다. FAT32 볼륨 가장 앞에는 Boot Record가 오며, 그 뒤를 이어 예약영역, FAT 영역, 데이터 영역 등으로 이루어져 있다. Boot Record는 앞선 포스팅에서 설명을 했고, 이번에 설명할 영역은 FAT #1과 #2로 이루어진 FAT 영역에 대해서 설명하고자 한다.


위 구조대로라면 우리가 원하는 FAT 영역으로 가기위해서는 Boot Record와 예약영역을 지나야 갈 수 있다. 앞에 내용을 복습하기 위해, MBR부터 FAT#1까지 가기위한 계산을 수행해 보도록 하자.

[그림 2. MBR 영역 구조]

가장 먼저 볼륨의 Boot Record의 위치부터 확인해야 한다. BR 영역의 시작을 가르키는 Start LBA Address는 파티션 테이블 영역의 시작에서 8번째 offset ~ 11번쨰 offset에 위치하고 있으며, [그림 2]에서는 0x80 (Dec = 128)을 기록하고 있다. 이를 따라 128번 Sector로 가면 우리가 찾던 BR 영역이 존재함을 확인 할 수 있다. 


[그림 3. Boot Record 영역]

[그림 3]은 바로 지난 포스팅에 설명했던 Boot Record 영역이다. BR영역의 전체적인 구성이나 세부적인 내용은 바로 전 포스팅을 참조하도록 하자. 우리가 이번 포스팅을 통해 공부해야 할 내용은 BR영역이 아니라 FAT 영역이니까 말이다. 

위 FAT 영역의 위치를 잘 모르겠다면 화면을 위로 올려 [그림 1]을 다시 보고 오기 바란다. FAT 영역으로 가기 위해서는 BR영역까지의 섹터와 예약 영역의 섹터 수를 더하면 FAT 영역의 시작 섹터가 나오게 된다. Boot Record에는 예약 영역이 갖는 전체 섹터 수(Reserved Sector Count)를 표기하고 있는데 offset 주소로 000E ~ 000F가 Reserved Sector Count가 된다. 값은 0x2A10으로 기록되어있으나, *리틀엔디언 표기법에 따라 0x102A로 계산하면 4,138이 나온다.

 * 앞서 설명했어야 하나, 미처 설명하지 못해 본 포스팅에서 '리틀 엔디언'에 대해 설명하고자 한다. 엔디언은 쉽게말하면 바이트를 배열하는 순서인데, 큰 단위가 앞에오는 빅 엔디언, 작은 단위가 앞에오는 리틀 엔디언으로 나뉜다. 예를 들어 0x1234를 입력할 경우, 빅 엔디언 기반의 구조에서는 12 34로 입력되고 리틀 엔디언 기반에서는 34 12로 기록되는 것이다. 우리가 사용하는 Intel 기반에서는 리틀 엔디언 기반으로 사용하고 있으니 섹터 수를 계산할 때 특히 햇갈리지 않도록 한다. 특별한 경우가 없다면 앞으로는 리틀 엔디언 기반으로 설명할 예정이며 빅 엔디언 기반으로 설명해야 할 경우에는 따로 언급 하도록 한다.

혹시라도 4,138 섹터로 간 독자가 있는가? 혹시 가봤다면 어떤 결과가 나오는가? 필자랑 동일하게 앞의 과정부터 수행했다면, 나오지 않아야 정상이다. Reserved Area는 말 그대로 시스템에서 나중에 사용하기 위해 '예약한' 영역이기 때문이다. 


[그림 4. FAT Area]

[그림 4]는 [그림 1]에서 FAT#1에 해당하는 영역이다. 우리가 예전에 봐왔던 MBR이나 BR과는 사뭇 다르게 굉장히 심플하게 구성되어있다. 하지만 저 심플하게 구성된 부분이 파일 시스템에서는 굉장히 중요한 역할을 한다. FAT는 이름 그대로 File Allocation Table로 파일 할당 테이블을 의미한다. 윈도우 기반의 파일시스템(현재 주로 사용하는 FAT32, NTFS)은 파일의 용량을 할당할 때 클러스터 단위로 할당 한다. 

따라서 FAT 영역에는 별다른 구조체가 존재하지 않고 클러스터의 상태값만을 보여주는 모습이다. 아래 구조를 보고 FAT 영역의 내용에 대해 조금 더 자세히 알아보도록 하자.


[그림 5. FAT Area Structure]

[그림 5]는 [그림 4]에서 보인 FAT 영역을 구조화 한 표이다. 위에서 볼 수 있는 것과 같이 하나의 클러스터는 4byte를 가지고 있다. 자세히 보면 클러스터의 시작이 0번이 아닌 2번부터 시작하는 것을 볼 수 있다. 이는 파일시스템이 FAT 영역의 0번과 1번 클러스터를 Media Type 과 Partition Status의 용도로 사용해버렸기 때문이다. 이는 다음 포스팅에서 다룰 Root Directory에서의 파일 생성 / 복구 등에서 꽤나 중요하게 작용하니 반드시 기억하기 바란다. 


별다를게 없어 보이는 이 FAT 영역을 굳이 포스팅을 통해 정리하는 이유는 이 영역이 파일의 생성, 삭제 등에 있어서 매우 중요하기 때문이다. FAT32 파일시스템은 생성 된 파일의 용량을 정할 때 Cluster 단위로 저장한다. 예를 들어, 5kbyte의 파일을 생성한다고 가정하자. 파일은 생성 될 때 아무리 작은 용량의 파일이라도 1개 이상의 클러스터를 할당 받는다. 기억할지 모르겠지만, 여러분은 BR영역에서 클러스터 당 섹터 수에 대해 정의한 내용을 보았다.


[그림 6. Boor Record Structure]

앞의 포스팅으로 돌아가서 관련 내용을 확인하고 와도 좋지만, 시간을 낭비하기 싫은 독자들을 위해 [그림 6]을 통해 BR의 구조를 확인하도록 하자. 0x0D를 보면 'Sector Per Cluster' 라는 영역을 볼 수 있는데 이 부분이 우리가 이 포스팅에서 중요하게 봐야 할 부분이다. 실제 여러분의 환경에서 'Sector per Cluster'의 값을 보면 '0x08'로 표기되어있는 것을 볼 수 있는데, 아마 여러분이 앞으로 보게 될 거의 모든 FAT32 환경에서는 동일하게 표기되어 있을 것이다. 

FAT32영역에서 'Sector Per Cluster'는 사용자가 임의로 조정하지 않는 한 Defualt 값으로 0x08을 갖는다. 하나의 Sector는 512byte의 값을 갖는데 이를 볼 때 하나의 클러스터는 4Kbyte ( 512Byte * 8 = 4096Byte)의 크기를 갖는 것을 알 수 있다. 다시 위로 올라가서, 5kbyte의 파일을 예를 들면, 1개의 클러스터로는 용량이 부족하기 때문에 2개의 클러스터를 필요로 한다. 아래에서 파일이 있을 떄의 FAT Area의 상태에 대해 자세히 알아 보도록 하자.


[그림 7. 파일이 존재하는 FAT 영역]

[그림 8. VHD 내 존재하는 파일 List]

[그림 7]은 필자의 FAT 영역 내용 중 일부이다.  또한 [그림 8]은 현재 필자의 가상 환경 내 VHD에 존재하는 파일의 List 이다. 각각의 파일은 jpg 파일이 826kbye, txt 파일은 각각의 6자리의 영문을 담고 있는 파일이다. 지금부터 [그림 8]의 파일 List를 기준으로 [그림 7]에 존재하는 내용들을 정리하는 시간을 갖고자 한다.


먼저 [그림 4]로 다시 한번 올라가보자. [그림 4]는 [그림 8]에서 'Desert.jpg'만 존재하지 않는 상태이다. 앞서 [그림 5]에서 우리는 각각의 클러스터의 구조가 어떤식으로 구성되어있는지 확인했다. FAT 영역에서 각각의 클러스터는 파일이나 디렉터리가 저장 된 위치를 Linked List 방식으로 표현하고 있다. 즉, 각각의 FAT Entry는 자신의 다음 Cluster 값을 담고 있다는 의미이다. 즉, 파일이 1개 이상의 클러스터를 가지고 있을 경우 클러스터에는 다음 클러스터의 위치를 갖게 된다는 의미이다.

[그림 7]을 보면 자세히 알 수 있다. 다만 여기서 주의할 게 하나 있다. [그림 7] 의 1번 클러스터를 보면 앞 뒤로 있는 0, 2번 클러스터와는 조금 다른 것을 알 수 있다. 0번은 [F8 FF FF F0], 1번은 [FF FF FF F7] 그리고 2번은 [FF FF FF F0]으로 되어있다. 여기서 0번 클러스터는 [그림 5]에서 설명한것과 같이 시스템이 Media Type으로 사용하고 있다. 

그러면 [그림 7]의 1번 클러스터가 [그림 5]의 Partition status가 되어야 한다. 근데 그렇게 되면 [그림 4]의 내용이 맞지 않게된다. 결론부터 이야기하자면 1번 클러스터는 Bad Cluster로 인식되어 있다. 즉 잘못된 클러스터로 인식되어 사용하지 못해 시스템이 1번 대신 2번 클러스터를 Partition Status으로 설정 한 것으로 보인다. (정황 사정상 그래보이며, 필자도 추가적인 확인을 하게 될 경우 수정하도록 하겠다.) 추가적으로 Bad Cluster의 경우 [FF FF FF F7]로 표기 된다.


이제 실제 데이터 파일이 포함된 3번 Cluster부터 이야기를 해 보도록 하자. 앞서 말했듯이 윈도우 시스템에서는 파일에 용량을 부여할 때 클러스터 단위로 부여하며, 최소 1개 이상의 클러스터를 가진다. 하나의 클러스터는 8개의 섹터를 가진다.(자세한 설명은 필자의 다른 포스팅인 Boot Record 부분을 참고하라. / http://jh8992.tistory.com/entry/FileSystem-Forensics-4-FAT322)


[그림 7]처럼 파일이 하나의 클러스터만 가질 경우 [FF FF FF 0F] 로 표기된다. 이는 해당 클러스터가 파일이 갖는 마지막 클러스터이며 더이상 Link 되는 클러스터가 없음을 의미한다. 그리고 클러스터가 하나 이상의 클러스터를 가질 경우 앞 클러스터의 가장 앞부분에 다음 클러스터의 위치를 담게 된다. [그림 7]을 보면 5번째 클러스터에서 새로운 파일이 시작됨을 알 수 있다. 그리고 그 클러스터 부터 다음 클러스터들을 쭈욱 보면 하나의 공통점을 알 수 있는데 그것은 바로 클러스터의 가장 앞에 다음 클러스터의 번호가 쓰여있으며 나머지는 0으로 채워져 있다는 점이다. 

이는 클러스터가 항상 연결된 Link를 갖지 않기 때문이다. 완전히 포멧된 깨끗한 파일 시스템의 경우 FAT 영역이 꺠끗하기 때문에 순서대로 채워지겠지만 파일이 생성되고 지워짐을 반복함에 따라 모든 클러스터가 순서를 유지할 수 없게 된다. 이러한 경우를 대비해서 모든 클러스터는 자신의 위에 다른 클러스터가 연결 될 경우 다음 클러스터를 명시하도록 되어있다. 물론 파일의 용량이 작아 단일 클러스터만 가지고 있거나 더이상 연결될 클러스터가 없는 마지막 클러스터일 경우 [FF FF FF 0F] 값을 가지게 된다.


어떻게 보면 앞에서 설명한 Boot Record 부분보다는 단순한 구조를 가지고 있는 영역임에도 상당히 길게 서술된 느낌이 있다. 그림이 많이 포함됐거나 하는 여러 이유등이 있을 수 있지만 가장 큰 이유는 이후 포스팅 할 파일 수동 생성 부분에서 이 FAT 영역이 상당히 중요하기 때문이다. Root Directory 영역에 대해 공부하거나, Data 영역에 파일을 수동으로 생성 할 때 다른 곳을 모두 정상적으로 적용했다고 하더라도 FAT 영역의 클러스터가 맞지 않으면 정상적으로 파일이 열리지 않기 때문이다.

그렇기 때문에 상당히 단순한 구조임에도 확실하게 알고 갈 필요가 있다. 여러분이 공부하는데 이 포스팅이 쉽게 이해되길 빌어본다.


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

Posted by Latte_
,


* 들어가기에 앞서 본 스터디에 사용 된 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_
,

* 들어가기에 앞서 본 스터디에 사용 된 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, NTFS, HFS, ext2,3,4, ReFS 등 다양하 파일시스템을 알고 있을 것이다. 어떤 파일시스템을 주로 사용하느냐는 여러분이 사용하는 OS에 따라 달라질 것이고, 또는 여러분의 회사에서 사용하는 시스템이 무엇이냐에 따라 달라질 것이다. 

필자는 주로 NTFS를 많이 사용한다. 실제 사용하는 OS가 Window가 많기 때문이다. 실제 일반유저가 사용하는 많은 프로그램중 가장 높은 비중을 차지하는 파일시스템은 아마 Windows 파일시스템일 것이다. 여러가지 프로그램들도 잘 만들어져있고, 무엇보다 금융 거래등을 위해서 꼭 필요한 Active X등을 사용하기 위해서는 Windows OS가 필수로 필요하기 때문이다. 지금부터는  Windows OS의 파일시스템 중 FAT32에 대해 집중적으로 다루려고 한다.


FAT(File Allocation Table)은 디지털 카메라 등에 장착되는 대부분의 메모리 카드와 수많은 컴퓨터 시스템에 사용되는 파일시스템 구조이다. FAT 파일시스템은 1977년 빌게이츠와 마크 맥도널드가 1년간 개발해 만들어 낸 파일시스템 구조로 MS-DOS, DR-DOS, Microsoft Windows를 포함한 다양한 운영체제를 위한 파일 시스템이다. FAT12, FAT16, FAT32, FATX, exFAT 등이 존재하며, 현재 주로 쓰이는 파일시스템은 FAT32이다. 

FAT12는 주로 과거에 많이 쓰이던 MS-DOS 초기에 사용되었고, 이후 플로피 디스크를 사용할 경우 여전히 통용되고 있다. FAT16은 32MB 이상의 하드디스크를 지원하기 위해 사용되었고(당시에는 디스크 및 메모리 사용량이 현재처럼 크지 않았다) Window 95까지는 사용되었다. FAT16은 최대 2GB 까지 용량을 지원한다. 

우리가 이 포스팅부터 다루게 될 FAT32는 2GB 이상의 하드디스크를 지원하기 위해 만들어졌으며 Windows 95 OSR2부터 사용할 수 있게 만들어져있다. FAT32에서 하나의 파일은 최대 4GB -1Byte의 용량을 가질 수 있으며, 하나의 파티션이 최대 8TB의 용량을 가질 수 있다. 그런데 이쯤 되면 하나의 의문이 생길 것이다. 전에 포스팅한 MBR 구조에서 하나의 파티션은 최대 2TB의 크기를 갖는다고 설명했다. 그런데 FAT32 파일시스템은 8TB까지 최대 용량을 갖는다고 한다. 과연 어느게 우선시 되는게 맞는것인가? 

사실 생각해보면 간단하다. 시스템이 구동 될 때, MBR이 먼저 구동되는지 FAT32가 먼저 구동되는지를 알아보면 된다. MBR에 대해 설명할 때 부트코드에는 부팅을 위해 파티션 내 BR(Boot Record)을 호출하는 과정이 프로그래밍 되어 있다고 이야기 했다. FAT32 파일시스템에 대한 정보는 이 BR에 포함되어 있다. 따라서 최대 8TB까지(물리적으로 라면) 지원하는 FAT32라 하더라도 MBR 구조로 되어있는 OS라면 파티션 당 최대 2TB까지만 지원하게 된다.

그리고 이 뒤를 잇는 exFAT나 기타 여러가지 것들이 존재하지만, 실제로는 많이 쓰이지 않으니 이번 포스팅에서는 따로 다루지 않도록 하겠다.


[그림 1. FAT32 구조]


[그림 1]은 FAT32의 전체적인 구조를 보여준다. 하나의 FAT32 파티션은 위와 같은 구조를 가진다. 지금부터 [그림 1]의 세부적인 내용에 대해 하나하나 알아보도록 하자.

세부적으로 알아보기에 앞서, 가상의 FAT32 파티션 하나를 구성해 보도록 하자. 이 내용은 이후 NTFS 파일시스템을 할 때도 동일한 방법으로 이루어질 것이며 이번 포스팅에만 작성 할 것이다. 실제로 한번만 해보면 다시 외울 필요 없을 정도의 내용이니 실습을 통해 숙달하는것을 추천한다.

먼저 실행창(Window 키 + R)을 열어 diskmgmt.msc를 입력한다. 이 명령어는 [디스크 관리] 창을 여는 명령어로 제어판을 통해 찾아 들어가는 방법도 존재하나 매우 번거로우므로 그냥 이 명령어를 기억하고 익숙해지도록 한다. 이후 포스팅을 보고 따라하다보면 상당히 많이 사용하게 될 명령어이다.

 [그림 2. 디스크 관리]

컴퓨터를 사용하다 저장장치를 하나 이상 추가해본 독자라면 한번 이상은 봤을 것으로 생각되는 창이다. 거의 마지막에 하게 될 파일 생성 / 복구 등을 할 때 정말 자주 보게 될 화면이니 잘 기억해두도록 한다. (질리게 해야 할 지도 모른다.)


[그림 3. VHD 만들기 과정#1]

앞으로 자주 사용 될 FAT32 VHD를 하나 만들어 보도록 하자.  먼저 [디스크 관리]에서 동작 -> VHD를 들어가 VHD 생성 탭을 연다. 기존에 만들어둔 VHD가 있다면 VHD 연결을 통해 미리 생성한 VHD를 열어도 상관없다.


[그림 4. VHD 파일 경로 지정 및 크기 지정]

사용할 VHD의 크기 및 경로를 지정해 준다. MB, GB, TB 단위로 지정이 가능하며 원하는 대로 지정할 수 있다.(단 VHD도 하나의 파일로서 크기만큼의 용량을 차지한다.) 본 실습에서는 무난하게 3GB를 지정하였다.

[그림 5. 생성 된 3GB의 VHD 화면]

정상적으로 과정을 완료되었다면 위 붉은 테두리처럼 3GB의 디스크가 생성 된 것을 확인할 수 있다. 다만 현재까지의 과정으로 저 VHD를 바로 사용할 수는 없다. 다음 과정에서 거칠 포멧과정을 거쳐서 정상 Disk로 작동 할 수 있도록 조치할 수 있다.

디스크를 포맷하는 과정을 자세히 설명하지는 않도록하겠다. Forensics를 공부하려는 독자들이라면 간단한 디스크 포맷 지식 정도는 알고 있으리라는 생각도 있지만, 검색을 통해서도 쉽게 찾아 낼 수 있기 때문이다. 다만, 디스크 포맷과 정에서 한가지 주의 해야 할 부분이 있다. 아래 [그림 6]처럼 디스크 포맷 과정 간 파일시스템을 결정하는 부분이 나온다. 이때 Default 값은 NTFS로 되어있는데, 실습을 위해 FAT32로 변경한 후 과정을 진행하도록 한다.


[그림 6. 파티션 포맷 간 FileSystem 설정]


위 과정을 정상적으로 수행했다면 [내 컴퓨터]에 들어갔을 때 방금 생성하 VHD가 정상적으로 접근되는 것을 확인 할 수 있다.


지금까지 FAT32를 본격 분석하기 위한 Setting에 대해 알아보았다. 다음 포스팅부터는 FAT32를 본격적으로 탐구하고 분석하는 시간을 갖도록 하겠다.

Posted by Latte_
,