swuforce

[디지털 포렌식 개론] 8장 1~3절

범호야 2024. 11. 6. 19:01

도서관과 같이 생성된 데이터를 계속해서 관리하기 위해서는 데이터 기록물을 적당한 위치에 보관하면서 쉽게 접근할 수 있도록 분류하고 체계화 하는 과정이 필수적이다.

디지털 데이터도 전통적인 기록물 보관 방식과 유사하게 저장 매체 상의 적당한 위치에 보관하면서 쉽게 접근하여 열람, 수정, 삭제할 수 있는 방식이 필요로 하기 때문에 디지털 데이터를 하나의 객체(파일)로 취급하면서 사용자가 쉽게 사용할 수 있도록 관리하는 방식을 파일 시스템이라 말한다. 

1. 파일 시스템 이해

1. 파일 시스템 소개

파일 시스템은 디지털 데이터를 효과적으로 관리하기 위해 파일을 체계적으로 기록하는 방식이다. 하드 디스크, 플래쉬 메모리 등의 저장 매체 용량이 증가함에 따라 저장되는 파일의 수가 많아진다. 이러한 상황에서 원하는 파일을 빠르게 읽고 쓰기 위해서는 파일 시스템의 도움이 필요로하다. 파일 시스템은 저장 매체의 종류와 운영체제의 목적에 따라 각각 고유한 파일 시스템을 사용한다. 

2. 파일 시스템 구조

운영체제는 어떠한 파일이 있는지, 해당 파일이 저장된 위치는 어디인지, 파일의 이력은 무엇인지 효과적으로 파악해야 한다. 또한, 새로운 파일을 생성하여 저장할 때는 저장 매체의 빈 공간을 찾을 수 있어야 한다. 

파일 시스템의 구조는 메타 영역곽 데이터 영역으로 나누어진다.

사용자가 생성한 파일의 내용은 데이터 영역에 기록되고, 메타 영역에는 파일 관리를 위한 파일의 이름, 위치, 크기, 시간 정보 등이 기록된다. 파일 시스템은 이러한 메타 데이터를 유지함으로써 파일을 효과적으로 관리한다. 

3. 파일 시스템의 주요 요소

1. 주소지정방식(Addressing)

하드 디스크의 주소지정방식은 크게 CHS(Cylinder-head-sector)방식과 LBA(Logical Block Address) 방식으로 나뉜다. CHS는 실린더, 헤더, 섹터를 의미하는 것으로 디스크의 물리적인 구조에 기반한 주소지정방식이다. 이 방식은 초기 ATA 표준에서 정의한 주소 지정 비트와 BIOS에서 지원하는 주소 지정 비트의 차이로 인해 최대 504MB 크기까지만 주소 지정이 가능하였다. 이후 디스크 용량의 증가로 BIOS의 주소 지정 비트 수를 확장시켰지만 8.1GB까지만 주소 지정이 가능하였기 때문에 대용량 디스크를 지원하지는 못한다. 결국 CHS 방식은 새롭게 LBA 주소지정방식으로 나타나게 되었다.

LBA 주소지정방식은 물리적인 구조를 고려할 필요 없이 디스크의 0번 실린더, 0번 헤드, 1번 섹터를 01ㅓㄴ으로 하여 디스크의 마지막 섹터까지 순차적으로 주소를 지정하는 방식이다. 

2. 클러스터(Cluster)

하드 디스크의 물리적인 최소 단위는 섹터(512 바이트)이다. 따라서 하드 디스크의 관련된 읽기 쓰기 작업은 모두 섹터 단위로 이루어진다. 그러나 섹터 단위로 입출력을 처리하면 큰 파일의 경우 많은 시간이 요구되기 때문에 대부분 여러 개의 섹터를 묶어 한꺼번에 처리한다. 윈도우 운영체제에서는 여러 개의 섹터를 묶은 클러스터가 데이터의 입출력 단위이다. 따라서 파일의 크기와 상관 없이 클러스터의 배수로 파일이 할당된다. 

윈도우 시스템에서 디스크를 포맷할 때 클러스터의 크기를 지정한다. 클러스터의 크기를 임의로 지정할 수도 있지만 기본 할당 크기를 선택할 경우 볼륨 크기에 따라 미리 정의된 클러스터의 크기가 할당된다. 

3. 슬랙 공간(Slack Space)

슬랙 공간은 물리적인 구조와 논리적인 구조의 차이로 인해 발생하는 낭비 공간이다. 즉, 파일이 물리적으로 할당된 공간이지만 논리적으로 사용할 수는 없는 공간을 말한다. 슬랙 공간은 크게 램 슬랙(RAM Slack), 파일 슬랙(File Slack), 파일 시스템 슬랙(File System Slack), 볼륨 슬랙(Volume Slack)으로 나누어진다. 이러한 슬랙 공간은 정보를 은닉할 수 있기 때문에 디지털 포렌식 관점에서 유의해서 관찰할 필요성이 있다. 또한 파일 복구와 삭제된 파일의 파편을 조사할 때 유용하게 사용될 수 있다. 

1) 램 슬랙(RAM Slack)

램 슬랙은 램에 저장되어 있는 데이터가 디스크에 저장될 때 512 바이트씩 기록되는 특성 때문에 발생하는 공간으로 섹터 슬랙이라고도 한다. 램 슬랙은 윈도우 운영체제에서 사용하는 메모리 관리 정책 때문에 0x00의 값으로 기록된다. 예를 들어, 1,500바이트의 데이터를 기록할 경우 3개의 섹터가 사용되며 512의 배수가 되지 않는 여분의 36바이트는 0x00의 값으로 기록된다. 파일의 크기가 대부분 512의 배수가 아니기 때문에 거의 모든 파일에서 램 슬랙에 발생된다. 따라서 램 슬랙을 이용하면 파일의 끝을 알 수 있고, 삭제된 파일을 복구할 때 유용하게 사용된다. 

2) 파일 슬랙(File Slack)

파일 슬랙은 클러스터의 사용으로 인해 낭비되는 공간 중 램 슬랙을 제외한 나머지 부분을 나타내는 것으로 드라이브 슬랙(Drive Slack)이라고도 한다. 0x00으로 기록되는 램 슬랙과 다르게 파일 슬랙은 이전의 데이터가 그대로 남아 있다. 그 이유는 최하단의 디스크 입출력은 섹터 단위로 진행되기 때문이다. 

파일 슬랙을 이용하면 특정 파일이 해당 저장 매체에 존재하였는지를 규명할 수 있다. 즉, 존재 여부를 알아야 하는 파일이 있다고 하면 그 파일을 클러스터 단위로 나눈 후, 각 클러스터의 마지막 부분과 파일 슬랙 중 일치하는 부분이 있는지 확인함으로써 해당 파일이 존재했었는지 확인할 수 있다. 범죄 관련 파일이 저장 매체에 있었다가 삭제되었음을 입중할 때 이러한 방법을 사용할 수 있다. 

3) 파일 시스템 슬랙(File System Slack)

파일 시스템의 크기는 파일 시스템을 생성할 때 결정된다. 그런데 파일 시스템은 클러스터 크기의 배수만큼 사용할 수 있기 때문에 파일 시스템 끝 부분에 남는 공간이 발생하게 된다. 파일 시스템 할당 크기와 볼륨 크기간의 차이로 인해 발생되는 공간을 파일 시스템 슬랙이라고 한다. 

4) 볼륨 슬랙(Volume Slack)

볼륨 슬랙은 전체 볼륨의 크기와 할당된 파티션 크기의 차이로 인해 발생하는 공간이다. 볼륨 슬랙은 다른 슬랙과 다르게 파티션 크기의 변경을 통해 임의로 생성이 가능하다.

 2. 파티션과 MBR

1. 파티션(Partition)

대부분 저장매체의 저장 공간을 사용용도 별로 논리적으로 분할하여 개별 공간으로 사용하는데 이를 파티션이라고 한다. 운영체제를 설치하는 공간과 사용자가 생성한 데이터를 저장할 공간을 분할하여 사용하는 것이 그 예이다. 

시스템은 부팅과정에서 파티션의 크기와 위치와 설치된 운영체제 등을 파악하여 그에 맞게 구동해야 한다. 이러한 정보를 담고 있는 영역이 Boot Record영역이며 윈도우즈 운영체제의 경우 파티션의 첫 번째 섹터에 위치한다. 

2. Master Boot Record

시스템은 부팅 과정에서 운영체제의 커널 파일을 불러와 구동시켜야 한다. 이러한 역할은 BR영역의 정보를 통해 수행된다. 

Boot Record 위치

파티션을 나누지 않은 단일 파티션의 경우 1개의 BR 영역이 첫 번째 섹터에 위치한다. 하지만 분할된 파티션의 경우, 각 파티션의 BR영역을 관리할 필요가 있다. BR을 관리하는 영역은 MBR이라고 하며, 각 BR영역을 찾아갈 수 있는 정보를 담고 있다. 

MBR 구조

부트 코드 영역에서 파티션 테이블에서 부팅 가능한 파니션을 찾아 해당 파티션의 부트 섹터를 호출하는 코드가 위치한다. 즉, 부팅 중 POST 과정 후에 BIOS에 의해서 해석되어 동작하는 영역이다. 

3. 확장 파티션(Extended Partition)

MBR 영역에서 파티션 정보를 표현하는 공간은 64바이트로 총 4개까지만 파티션을 분할할 수 있다. 이런 한계를 극복하기 위해 나온 개념이 확장 파티션이다. 확장 파티션의 구조는 MBR의 구조를 그대로 사용한다. 구체적으로 말하면 MBR영역이 담고 있는 4개의 파티션 테이블 정보에서 마지막 4번째 파티션 테이블이 가리키는 위치가 또 다른 MBR 영역을 가리켜 추가적으로 4개의 파티션을 담을 수 있도록 하는 구조이다. 

확장 파티션을 가리키는 파티션 정보는 파티션 유형을 나타내는1바이트의 값이 0x05나 0xoF로 설정된다. 즉, 4번째 파티션 테이블 정보의 파티션 유형 값이 0x05나 0x0F이면 확장 파티션을 사용하고 있다는 것을 알 수 있으며, 해당 정보를 따라가면 또 다른 파티션 테이블 정보를 얻을 수 있는 MBR 영역을 확인할 수 있다. 

MS-DOS 확장 파티션 구조

확장 파티션 개념을 이용해 생성할 수 있는 파티션의 개수는 제한이 없지만 윈도우즈 운영체제에서는 C:\같은 드라이브 문자로 파티션을 구분하기 때문에 A부터 Z까지 총 26개의 파티션을 사용할 수 있다. 하지만 윈도우즈는 추가적으로 폴더에 가상으로 지정한 파티션에 접근하는 기능을 제공하기 때문에 사실상 제한 없이 확장 파티션을 사용할 수 있다. 

3. FAT 파일 시스템

1. FAT 파일 시스템 소개

FAT(File Allocation Table)은 MS-DOS 파일 시스템에서 파일의 위치 정보를 기록한 테이블을 지칭하였다. 이후 윈도우 시스템으로 운영체제가 바뀌면서 MS-DOS 파일 시스템 자체를 가리키는 용어가 되었다. 

파일 시스템과 테이블을 구분하기 위해 파일 시스템은 "FAT12/16/32" 또는 "FAT파일시스템"이라고 표기하고, 테이블은 "FAT영역"이라고 표기한다. FAT 뒤의 숫자는 파일 시스템에서 관리하는 클러스터의 개수를 의미한다. 

FAT 파일 시스템의 클러스터 최대 개수

FAT12(2의 12제곱)의 경우 12비트를 사용하여 클러스터의 위치를 표현하므로 최대 4,096개의 클러스터를 표현할 수 있다. 하지만 미리 예약된 12개의 클러스터가 존재하기 때문에 최대 4,084개의 클러스터를 표현할 수 있다. 

이후 윈도우 Embedded CE 6.0부터 FAT32를 확장한 exFAT가 사용되었다. exFAT는 윈도우 Vista Service Pack 1에서 기본으로 지원하며 윈도우 XP에서는 패치를 통해 사용가능하다 .

FAT 파일 시스템 구조

2. 예약 영역

예약 영역은 FAT 파일 시스템에서 가장 앞에 위치하는 구조로 여러 개의 섹터를 포함한다. 예약 영역의 크기는 기본적으로 FAT 12/16의 경우에는 1개의 섹터, FAT32의 경우에는 32개의 섹터를 사용한다. 

FAT 파일 시스템 부트 섹터 구조

첫 번째 섹터는 부트 코드를 포함하고 있는 부트 섹터(Boot Sector)로 사용한다. 따라서 FAT12/16은 예약 영역이 곧 부트 섹터가 된다. 부트 섹터에는 제인 먼저 BPB를 지나 부트 코드로 점프하기 위한 명령어가 위치한다. 부트 코드는 파일 시스템의 여러 설정 정보를 나타내는 BPB를 참조하여 시스템을 부팅한다. 부팅 과정이 실패하면 미리 설정된 오류 메시지를 출력한다.

FAT12/16/32 부트 섹터의 공통된 데이터 구조

FAT 파일 시스템을 분석할 경우 반드시 부트 섹터의 오프셋 14-15(Reserved Sector Count)값을 확인해야 한다. 예약 영역의 크기는 가변적이지만 0, 1, 2, 6, 7, 8 번 섹터는 미리 정해져 있다. 

섹터 0번은 부트 섹터로 사용하며 만약을 대비해 섹터 6번이 이것의 백업으로 존재한다. 백업 위치도 부트 섹터의 오프셋 50-51 항목을 사용해 임의로 지정할 수 있다. 

섹터 1번은 FSINFO(File System Information)구조체를 저장하고 섹터 7번이 이것의 백업이다. 이 구조체의 위치도 부트 섹터의 오프셋 48-49 항목을 사용해 임의로 저장할 수 있다. FSINFO 구조체는 운영체제에게 미할당 클러스터의 첫 위치와 전체 미할당 클러스터의 수를 알려줌으로써 저장할 데이터를 빠르게 할당할 수 있도록 도와주는 역할을 한다. 

섹터 2번은 부트 섹터의 부트 코드 영역이 부족할 경우 추가적으로 사용할 수 있는 영역이고 섹터 8번은 이것의 백업니다. 부팅 과정에서 추가적인 작업이 필요할 경우 이 영역을 사용하는데 보통은 비어 있다. 

결과적으로 FAT32는 예약 영역 중 6개의 섹터만 사용하며 나머지 섹터는 만약을 대비해 예약해 둔 것으로 일반적으로 사용되지는 않는다. 따라서 이 부분에 데이터가 존재한다면 은닉된 데이터일 수도 있다. 

3. FAT 영역

FAT 파일 시스템의 두 번째 요소는 FAT 영역이다. FAT 영역은 예약 영역 바로 다음에 위치하며, 일반적으로 두 개의 FAT 영역(FAT1, FAT2)가 존재한다. FAT2는 FAT1의 복사본으로 만약의 경우를 대비해 백업한 것이다.

FAT 영역은 데이터 영역의 클러스터 할당 상태를 표시한다. FAT16은 16비트, FAT32는 32비트를 사용해 데이터 영역의 시작 클러스터부터 마지막 클러스터까지의 할당 상태를 표시한다. 

FAT 영역의 구조

FAT Entry의 값은 파일 시스템에서 데이터 영역의 각 클러스터가 사용되고 있는지를 나타낸다. 또한, 특정 파일이 점유하고 있는 클러스터의 위치를 나타낸다. 

미할당 상태일 경우, 0x00의 값을 가진다. 따라서 운영체제는 새로운 파일 및 디렉터리를 저장하고자 할 경우 FAT Entry 값이 0x00인 클러스터를 찾아 할당한다.

할당 상태일 경우, FAT Entry의 값은 그 클러스터를 점유하고 있는 파일의 다음 데이터가 있는 클러스터를 가리킨다. 파일의 마지막 데이터가 있는 클러스터라면 마지막을 나타내는 특정 값을 사용한다. 

만약 배드 섹터가 포함된 클러스터가 발견될 경우 FAT12에서는 0xFF7, FAT16은 0xFFF7, FAT32는 0xFFF FFF7 값을 사용해 표시하게 한다. 표시된 클러스터는 이후에 사용되지 않는다. 

FAT 영역의 첫 번째 섹터 덤프 결과

FAT32 파일 시스템에서 FAT 영역의 첫 번째 섹터를 덤프한 결과이다. FAT32인 경우 4 바이트를 FAT Entry 로 사용하기 때문에 한 섹터당 128개의 FAT Entry 로 표현할 수 있다. 

FAT Enry 0, 1번은 앞서 살펴본 바와 같이 특별한 의미로 사용된다. 실제 데이터 영역의 시작은 FAT Entry 2번부터 시작한다.

4. 데이터 영역

대부분의 파일 시스템은 디랙터리 표현을 위해 트리 구조를 사용한다. FAT파일 시스템 역시 트리 형태로 표현되지만 가장 중요한 요소가 최상위 루트 디렉터리다. 

FAT12/16은 루트 디렉터리가 FAT 영역 바로 뒤, 데이터 영역의 제일 앞부분에 온다. 따라서 루트 디렉터리의 시작은 FAT Entry 2번에 해당한다. 

FAT 32에서 루트 디렉터리는 데이터 영역 어느 곳에나 올 수 있다. 하지만 특별히 설정하지 않는 한 FAT12/16 과 같이 FAT Entry 2번에 위치한다. 특별한 설정을 한 경우에도 루트 디렉터리의 위치를 찾을 수 있다. FAT 32에서는 루트 디렉터리에 생성할 수 있는 파일 및 디렉터리의 개수 제한이 없어졌다.

데이터 영역에 저장되는 데이터는 크게 디렉터리와 파일로 나눌 수 있다. 디렉터리는 디렉터리 내부에 포함되는 하위 디렉터리 및 파일의 이름, 확장자, 시간 정보, 크기 등을 표현하기 위해 Directory Entry라는 구조를 사용한다. 파일은 해당 파일의 형식에 따라 실제 데이터가 저장된다. 

Directory Entry 의 구조

첫 번째 바이트가 0xE5이면, 해당 Entry는 삭제되었음을 의미한다. 파일이 삭제될 경우 FAT 영역에서 파일 에 할당되었던 클러스터에 대응되는 FAT Entry를 0x00으로 초기화하고, 해당 파일의 정보를 담고 있는 Directory Entry의 첫 번째 바이트를 0xE5로 표시한다. 단순히 첫 번째 바이트 값만 변경되고 나머지 값은 초기화하지 않기 때문에 파일의 정보 및 내용을 복구할 수 있다. 

첫번째 바이트가 0x00이면, 해당 Entry는 사용되지 않는 Entry이다. 새로운 파일을 저장할 때 파일이 위치한 디렉터리에서 삭제된 Directory Entry를 검색한 후 삭제된 Directory Entry가 없을 경우 마자막의 사용되지 않는 Directory Entry에 파일의 정보를 기록한다. 따라서 Directory Entry가 0x00으로 표현되었다면, 이후에 Entry가 존재하지 않는다는 것을 의미하므로 더 이상 검색할 필요가 없다. 

Directory Entry 데이터 구조
Directory Entry의 속성

Directory Entry 구조에 의하면 파일 이름을 기록하기 위해 8바이트만 사용할 수 있다. FAT 파일 시스템에서는 8바이트보다 긴 파일 이름을 표현하기 위해 LFN(Long File Name) Entry라는 추가적인 구조를 사용하는데 이 때 이름은 모드 유니코드로 표현된다. 

FAT32의 경우 파일 이름을 255자까지 지원하기 때문에 파일 이름이 길면 하나의 LFN Entry로 표현하기 부족하다. 이 경우 여러 개의 LFN Entry를 사용해 표현하게 되는데 LFN Entry 오프셋 0 항목인 순서번호는 이러한 여러 개의 LFN Entry의 관계를 나타내기 위해 사용된다. 

LFN Entry 구조

 

LFN Entry 데이터 구조

 

5. 파일의 할당, 삭제로 인한 변화 요소 

1. 파일 할당

"\dir1\filel.dat"이라는 파일을 생성할 때, FAT 파일 시스템 에서 변화되는 정보를 나타낸다. \dir1 디렉터리는 이미 생성되어 있고 클러스터 의 크기는 4,096 바이트, file1.dat의 크기는 6,000 바이트라 하자.

1. 예약 영역의 부트 섹터에 있는 BPB에서 데이터 영역, 루트 디렉터리, FAT 영역의 위치를 얻어온다. 

2. \dir1 디렉터리의 정보를 얻기 위해 루트 디렉터리에서 \dir1에 해당하는 Directory Entry를 검색한다. => \dir 1 디렉터리 정보를 가지는 시작 클러스터가 80번임을 확인할 수 있다.

3. 클러스터가 80번에서 file1.dat파일의 메타 정보를 저장할 Directory Entry를 찾는다. 첫 번째 바이트가 0xE5 값을 갖는 삭제된 Directory Entry가 없다면 마지막의 0x00의 값을 갖는 새로운 Directory Entry를 할당한다.

4. fill.dat 파일의 내용을 저장할 클러스터를 찾기 위해 FAT 영역을 검색하여 0x00 값을 갖는 FAT Entry를 찾은 결과 클러스터 190번에 해당하는 FAT Entry 190번이 선택되었다.
5. FAT Entry 190번에 "0x0FFF FFFF" 값을 기록하고, Directory Entry 의 시작 클러스터 번호를 190번으로 기록한다.
6. file1.dat 파일의 처음 4096 바이트의 내용을 클러스터 200번에 기록한 다. 그 결과 1904 바이트의 내용이 남았다.
7. 남은 1904 바이트의 내용을 다시 기록하기 위해 FAT 영역에서 또 다른 빈 FAT Entry를 찾는다. 그 결과 FAT Entry 191번이 선택되었다.
8. FAT Entry 190번의 값을 FAT Entry 191을 가리키도록 "201"로 수정한후 FAT Entry 191번의 값은 클러스터 체인의 마지막을 나타내는"0x0FFFFFFF" 값으로 기록한다.
9. 남은 1.904 바이트의 내용을 클러스터 191번에 기록한다. 기록 결과 144 바이트의 램 슬랙과 2,048 바이트의 파일 슬랙이 생성되었다.

파일 할당 시 FAT 파일 시스템의 변화

2. 파일 삭제

"\dirl\filel.dat" 파일을 삭제할 때. FAT 파일 시스템에서 변 화되는 정보를 나타낸다. 클러스터 크기는 4,096 바이트라고 하자.
1. 예약 영역의 부트 섹터에 있는 BPB에서 데이터 영역, 루트 디렉터리, FAT 영역의 위치를 얻어온다.
2. \dir1 디렉터리의 정보를 얻기 위해 루트 디렉터리에서 \dir1에 해당하는 Directory Entry를 검색한다. 그 결과 \dir1 디렉터리 정보를 가지는 시 작 클러스터가 80번임을 확인했다.
3. 클러스터 80번에서 Directory Entry들을 검색하여 filel.dat 파일 이름을 가지는 Directory Entry를 찾는다. 그 결과 해당 파일의 시작 클러스터가 190번임이 확인되었다.
4. FAT Entry의 클러스터 체인을 확인한 결과 해당 파일이 클러스터 190, 191번을 사용한다는 것이 파악되었다.
5. FAT Entry 190, 191번의 값을 0x00으로 초기화한다.
6. file1.dat 파일의 Directory Entry의 오프셋 0x00 위치의 값을 0xE5로 변경한다. 

\dir\file1.dat파일 삭제 시 FAT 파일 시스템의 변화

 

덤프 시에 나타나는 내용에 대해 이해할 수 있는 시간이었다. 

[출처] 디지털포렌식개론 - 이상진