Piki's Play
Chapter 5. PC 기반 파티션 - 도스파티션 본문
여기서는 볼륨의 이론적인 설명과 개인사용자들이 사용하는 파티션 시스템들의 세부사항을 살펴보자!
도스, 애플, 이동식 매체 파티션의 동작과 구조를 분석하기로한다. (오늘은 도스만!)
5.1 도스파티션 (가장 흔하지만 가장 복잡한 분할 시스템이다)
-> 사실 도스파티션은 소규모를 위해서 세상에 나왔다. 오랜기간 인텔 하드웨어에서 사용했으나 공식적인 명세가 존재하지는 않는다.
따라서 마이크로소프트에서는 이 '도스파티션'을 'MBR'(Master Boot Records)로 부른다.
나중에 MBR을 EFI(Extensible Firmware Interface), GPT(GUID Partition Table)와 비교해보도록하자.
- 기본적인 디스크들이 MBR이나 GPT를 참조하고, 디스크의 파티션들은 MBR이나 GPT에 독자적이다. -
▶ 전체 개요
-> 도스파티션의 개념과 부트코드 위치를 조사해보자
▷ 기본적인 MBR 개념
-> 도스파티션을 사용하는 디스크는 512바이트 섹터 내에 MBR을 갖는다.
이 MBR은 부트코드, 시그니처, 파티션 테이블을 가진다.
부트코드는 파티션 테이블 처리 명령어, 운영체제 위치 확인 명령어를 가진다.
파티션 테이블에는 도스파티션을 설명하는 4개의 엔트리가 존재한다.
각 엔트리는 다음과 같은 항목을 가진다.
▷ 확장 파티션 개념
-> MBR은 4개의 파티션을 표현한다. 하지만 더 많은 파티션을 나누고 싶으면 '도스파티션을 더욱 복잡하게' 하면된다.
* 1,2,3 엔트리는 그대로 사용한다. 마지막 파티션을 '주 확장 파티션'으로 만든다.
* 주 파일 시스템 파티션(Primary File System Partition)
=> 파일 시스템이나 다른 구조화된 데이터 포함
* 주 확장 파티션(Primary Extended Partition)
=> 추가적인 파티션을 포함할 수 있다.
* 부 파일 시스템 파티션(Secondary File System Partition)
=> 윈도우에서 '논리파티션'으로 부르며 주 확장파티션 '내부'에 위치한다. 한개의 파일시스템파티션과 확장파티션으로 이루어져있다.
▷ 확장 개념의 레이아웃
-> 3개까지는 MBR에서 '주 파일시스템'으로 지정하고 그 이상은 '주 확장 파티션'으로 지정한다.
(아래는 12GB의 도스파티션을 2GB바이트 6개로 나누는 예이다)
- 기본적으로 3개의 주 파일시스템은 생성이 가능하다. 따라서 2GB 3개를 생성하고 남은 6GB를 나누도록 한다.
▷ 부트코드
-> MBR 512Byte안에 1~446 번째 바이트에 존재한다. (즉, 0~465) 나머지는 '파티션 테이블'이다.
표준 마이크로소프트 부트모드는 파티션 테이블로 처리하고 부팅플래그가 있는 파티션을 구분한다.
이후 부팅코드는 부팅가능한 파티션의 첫 섹터를 찾고 OS코드를 실행한다.
* 부트섹터 바이러스는 MBR의 1~446번째 바이트에 코드를 삽입하여 부팅될때 매번 실행된다.
그렇다면 여러 OS를 사용하고 싶은 경우에는 어떻게 하면 될까?
1. 이 코드에 사용자가 OS를 선택할 수 있는 코드 삽입시 여러 OS를 쓰기 가능하다. 대신 크기가 크다.
2. MBR부트실행시 OS(윈도우)가 실행되고 '윈도우 부트 파티션'에서 선택모드를 삽입할 수 있다.
▷ 요약
-> 도스파티션 시스템은 파티션 테이블이 4개의 엔트리만 있어서 복잡하다. 앞서서 언급한 GPT같은 것들은 더 큰 테이블이여서 더욱 간단하게 여러 파티션을 나눌 수 있다.
▶ 데이터 구조체
-> 여기서는 시스템을 동작하도록 만드는 데이터 구조체들을 알아보자.
▷ MBR 데이터 구조체
-> 도스파티션 테이블은 MBR과 각 확장 파티션의 첫 섹터에 존재한다.
0~445번까지는 부트코드이며 각 파티션의 엔트리는 16Byte씩을 가진다.
또한 각각의 파티션 테이블 엔트리는 다음과 같은 구조체를 가진다.
타입은 워낙 많아서 따로 검색해보는 것을 추천한다!
※ 이제 구조체를 분석해보자! 예제는 리틀엔디안의 윈도우와 리눅스 그리고 8개의 파일시스템 파티션을 갖는다.
#dd if=disk3.dd bs=512 skip=0 count=1 | xxd
(xxd : 헥사편집이랑 동일)
- 445까지는 부트코드이므로 그 뒤부터 보면(진하게 칠해진 부분) 16바이트로 이루어진 파티션 엔트리를 볼 수 있다. 또한 4번째바이트를 보면 타입이 'Ox07'임을 알수있다. 이는 NTFS를 나타낸다. 그 밑줄에 'Ox83'는 리눅스이다.
-시그니처는 가장 마지막에 볼 수 있고 리틀엔디안 방식이므로 => Ox55AA(FAT 파일시스템)
따라서 위 코드의 결과는 그림으로 다음과 같다.
▷ 확장 파티션 데이터 구조체
-> 구조는 MBR과 같지만 시작 섹터주소가 디스크 기준이 아니다.
거기다 '부 확장 파티션'이 시작하는 섹터와 '부 파일시스템'이 시작하는 섹터의 상대주소가 다르다.
즉, 부 확장 파티션 엔트리의 시작주소는 '주 확장 파티션'에서 상대적이다.
- 주 확장 파티션은 11,000 섹터의 길이를 가지고 섹터 1000에서 시작한다.
- 주 확장 파티션 기준으로 시작 섹터가 63인 FAT는 전체 파일시스템에서 1063이 시작섹터가 된다.
- 두번째 NTFS는 주 확장 파티션내의 부 확장 파티션 안의 기준으로 63이다.
앞에 FAT가 5000에 끝났으므로 NTFS의 시작주소는 5063이 된다.
▷ 도구를 이용한 예제 이미지 분석
1. fdisk (리눅스에 내장되어있는 명령어)
"-ㅣ" : 읽기모드, "-u" : 실린더 대신 섹터들로 출력
예)
2. mmls
-> 파티션 테이블 위치, 사용되지 않은 섹터(Unallocated), 확장 파티션 위치를 나타내준다.
▶ 분석 고려사항
-> MBR과 확장 파티션은 63섹터를 할당해준다. 그런데 부트코드와 파티션 테이블은 한 섹터로도 충분하고 이때 공간이 생기게 되는데 이 공간에 데이터를 숨길 수 있다.
=> 파티션 테이블이 손상되면 수동으로 추출해야하는데 다음과 같이 찾아야 한다.
#dd if=disk.dd bs=512 skip=63 of=part.dd
이론적으로 확장파티션은 두 개의 엔트리를 가진다. "부 파일시스템 파티션", "다른 부 확장 파티션"
그래서 다양한 도구들이 이 기준을 따르는데 3번째 엔트리도 수동으로 생성이 가능하다.
따라서 이부분이 존재하고 또 보이는지도 테스트 해야한다.
p.s 시간이 날때 살을 더 붙이도록!!
'포렌식 > 파일시스템 (파일시스템 포렌식분석)' 카테고리의 다른 글
PC기반 파티션 - 이동식 매체 (0) | 2020.02.01 |
---|---|
PC기반 파티션 - 애플파티션 (0) | 2020.01.31 |
(Part 2) Chapter 4 볼륨분석 (0) | 2020.01.29 |
Chapter 3. 하드디스크 데이터 수집 (0) | 2020.01.22 |
Chapter 2. 컴퓨터 기초 (2) (0) | 2020.01.18 |