3-1) MBR 파티션 테이블 구조
Last updated
Last updated
윈도우를 이용하여 MBR 및 파티션 테이블을 만들어 봅시다.
가상 디스크 설정 방법 : 2-1) 가상 디스크 설정
생성한 가상 디스크가 없을 경우 다운 받아서 활용
가상디스크를 우클릭 - 탑재 하거나, 디스크관리에서 가상디스크를 연결(읽기전용은 해제)
우리 가상디스크는 test를 데이터를 입력한 것 외에는 어떠한 작업을 하지 않았습니다. 즉, 윈도우가 무엇을 어떻게 저장하고 있는지 모르기에 초기화가 안되어 있습니다. 우클릭 - 디스크 초기화에서 MBR을 선택하고 확인을 하여보면. 절대 다른 디스크를 초기화하면 큰일납니다. 민트색(?)으로 된 가상디스크만 초기화 하도록 합시다.
이제 MBR 초기화가 되었습니다.
관리자권한으로 HxD를 열고, 도구 - 디스크 열기에서 우리가 초기화 한 가상디스크를 선택하도록 합시다. 다른거 선택하면 큰일나니 꼭 여러번 확인한다. 추가로 읽기전용은 해제!
아직 우리는 16진수가 익숙하지 않으니 오프셋 기반 - 10진수로 해서 살펴봅시다.
부트코드 영역은 0~439 총 440 바이트 부분 그 뒤에 4바이트는 디스크 시그니처 부분 마지막 뒤에 2bytes (55 AA) 는 부트 시그니처로 55 AA가 아니면 MBR로 인식하지 않습니다. 즉, 고정값 입니다
그렇다면 설명하지 않은 중간 영역이 파티션 테이블이라고 하며, 4개의 파티션 정보를 나눠서 표시합니다. 각각 파티션 정보를 가진 영역을 파티션 엔트리라고 합니다. 예약 영역으로 큰 의미없는 영역으로 보면 됩니다. 각 파티션 정보 부분을 파티션 엔트리라고도 불리며, 16bytes 길이를 갖습니다.
부트코드에 경우 포렌식 관점에서 자주 분석하는 주요 대상이 아니긴 하다. 다만 침해사고 대응과 같이 부트코드 부분이 변조되었거나 하면 또 충분히 분석이 필요한 영역일 수 있습니다.
우선 디지털포렌식과 친해지기에서는 부트코드 부분은 생략하고, 조금 더 상세히 알고자 한다면 따로 공부를 해보는 것을 추천합니다. (추후 따로 분석하는 부분에 대해서 공유할만한 좋은 자료들을 찾거나 만들게 되면 공유 하겠습니다.)
우선 우리는 파티션 테이블이 어디에 위치하는지 파악 하였습니다. 가상 디스크를 이용하여 파티션을 생성을 해보도록 합시다. 우선 윈도우가 생성해주는 것을 확인해보면
이제 HxD로 다시 한번 열어봅시다. 관리자 권한으로 HxD를 실행 한 후 읽기전용 해제 한 후 열어봅시다.
새로 추가된 영역이다. 이 부분을 보다 상세히 분석해봅시다. (값 자체는 실습 환경마다 약간은 다를 수 있습니다.)
조금 더 확대한 뒤 해당 영역을 하나씩 분석해서 보면 아래와 같습니다.
[1번 파티션 엔트리 분석]
0
부트 플래그 (부팅 가능한 파티션인지 여부)
00
부팅불가
1-3
파티션의 시작 섹터(CHS)
02 03 00
4
파티션의 파일 시스템 타입
06
FAT16
5-7
파티션의 끝 섹터(CHS)
48 07 01
8-11
파티션의 시작 LBA (Logical Block Address)
80 00 00 00
128 섹터
12-15
파티션의 크기 (섹터 단위)
00 50 00 00
20,480 섹터
위의 내용은 파티션 엔트리 위치별 정해진 약속으로 무조건 고정해 해당 합니다. 해석 해보면..
0 / 부트플래그
00
또는 0x00
: 부팅 가능하지 않은 파티션을 나타냅니다.
80
또는 0x80
: 부팅 가능한 파티션을 나타냅니다.
1-3 / 파티션의 시작 섹터(CHS)는 HDD(원판 하드디스크)에만 주로 해당. 최근에는 거의 의미 없음.
Cylinder: 02
(2)
Head: 03
(3)
Sector: 00
(0)
따라서 이 값은 Cylinder=2, Head=3, Sector=0인 위치에서 파티션이 시작됨을 의미합니다.
4 / 파티션의 파일 시스템 타입
06 으로 FAT16을 나타냄 / 아직 파일시스템에 대해 배우진 않앗으나 이런게 있다고 참고
주요 파일 시스템 타입 종류 (0x 는 16진수를 의미)
0x01: FAT12 파일 시스템을 가진 주요 파티션
0x04: FAT16 파일 시스템을 가진 주요 파티션 (32MB 이상의 파티션에 사용)
0x05: 확장 파티션
0x06: FAT16 파일 시스템을 가진 주요 파티션 (32MB 이상의 파티션에 사용)
0x07: NTFS 파일 시스템을 가진 주요 파티션
0x0B: FAT32 파일 시스템을 가진 주요 파티션
0x0C: FAT32 파일 시스템을 가진 주요 파티션 (LBA 모드로 사용)
0x0E: FAT16 파일 시스템을 가진 주요 파티션 (LBA 모드로 사용)
0x0F: 확장 파티션 (LBA 모드로 사용)
5-7 / 파티션의 끝 섹터(CHS)로 HDD(원판 하드디스크)에만 주로 해당. 최근에는 거의 의미 없음
Cylinder: 48
(72)
Head: 07
(7)
Sector: 01
(1)
따라서 이 값은 Cylinder=72, Head=7, Sector=1인 위치에서 파티션이 끝남을 의미합니다.
8-11 / 파티션의 시작 LBA (Logical Block Address), 즉. 파티션 시작 섹터 번호
저장된 값) 00 00 00 80 -> 128 섹터(10진수 계산한 값)
저장된 값 80 00 00 00 을 계산 하기 위해서 00 00 00 80 (16진수)를 10진수로 계산하면 128이 된다.
리틀 엔디안: 숫자의 가장 낮은 바이트부터 시작하여 높은 바이트까지 나열됩니다.
빅 엔디안: 숫자의 가장 높은 바이트부터 시작하여 낮은 바이트까지 나열됩니다.
12-15 / 파티션의 크기 (전체 섹터 수 ) ,
정리하면 1번 파티션의 시작 위치는 128 섹터이고, 20,480의 전체 섹터 수를 가진다. 아직은 우리는 아무 것도 없이 파티션만 나눠논 거기 때문에 운영체제, 파일시스템 관련은 의미는 없는 부분이다.
그렇다면, 이번엔 2번 파티션은 우리가 직접 만들어 봅시다.
우선 1번 파티션은 128섹터에 시작해서 20,480섹터까지 사용합니다. 그렇다면 128+20480 섹터인 20,608섹터보다 뒤인 20,610섹터부터 원하는 크기까지 파티션을 만들어 볼 수 있습니다. 20MB 로 해보도록 하자. 20 X 1024 X 1024 = 20971520 =20MB 필요한 섹터 수는 20,971,520(전체용량) / 512(1섹터 크기)= 40,960섹터
임의로 파티션 시작 위치를 정해봅시다. 시작LBA : 20,610 섹터 전체섹터 수 : 40,960 섹터
시작 섹터와 전체 섹터 수를 16진수로 변환한 뒤 리틀엔디안이 적용 후 저장되어야 할 값을 구해봅시다.
시작LBA : 20,610 -> 50 82 (16진수) / 00 00 50 82 -> 82 50 00 00 (리틀엔디안)
위에서 구한 값을 파티션 2번 엔트리에 저장 파티션 타입의 경우 파티션 1번과 동일한 값(06)을 저장 (파티션 타입은 추후에 변경 예정) CHS 값의 경우 큰 의미가 없음으로 빈값
디스크관리에서 F5(새로고침)을 하면 MBR을 새로 읽어 오는데 정상적으로 수동으로 파티션 나눴다면 아래와 같이 2개의 디스크를 구분하여 줍니다. 즉, 윈도우에서 파티션을 정상적으로 구분하고 있는 것입니다.
이 과정을 통해 윈도우에서는 디스크관리자에서 파티션, 확장 파티션을 만들 때 어떤 원리로 만드는지 이해가 되었을 것입니다.
정리하면 파티션 1번 파티션은 128섹터 부터 20,480만큼 사용하며, 섹터 번호로는 128~20,607섹터 (총 20,480섹터 사용)
2번 파티션은 20,610섹터 부터 40,960섹터를 사용한다. 섹터 번호로는 20,610~61,569 (총 40,960섹터 사용) (시작 섹터 번호 + 총 섹터 수 - 1)을 하면 해당 파티션의 마지막 섹터번호를 확인할 수 있습니다. -1의 이유는 시작섹터도 총 섹터 수에 포함하기 때문입니다.
그렇다면 파티션 테이블은 총 4개만 가능한 것일까? 5~6개는 불가능 한걸까? 이 부분은 처음 공부하거나, 자격증만 목표로 할 경우에는 필수 사항이 아니니 참고만 하도록 하자. 다만 제대로 분석을 위해서 이 구조를 잘 알고 있어야 나중에 응용 및 재미난 장난을 칠 수 있다.
4개 이상의 파티션을 사용하기 위해서 확장파티션을 활용하여 더 많은 파티션을 만들 수 있다. 우선 윈도우에서 어떻게 만들어주는지 확인하여 봅시다.
디스크 관리에서 할당되지 않은 영역에 파티션을 추가해봅시다. 용량은 10M짜리로 3개를 더 추가
추가하다가 녹색영역에 우클릭 [새 단순 볼륨]을 추가하여 기존과 동일하게 파티션을 추가
총 5개 파티션 생성되면 아래와 같이 표시됩니다.
관리자 권한으로 실행한 HxD에서 도구 - 디스크 열기에서 가상 디스크를 열어봅시다. 이번엔 읽기전용
파티션 테이블을 보면 4번 파티션 테이블을 보게 되면 파티션 타입이 05(확장파티션)
4번 파티션에서 의미있는 것만 보면
파티션 타입 (05) : 확장파티션
시작섹터 (00 41 01 00) : 00 01 41 00 ->82,176 섹터
전체섹터 수(00 D0 01 00) : 00 01 D0 00 -> 118,784 섹터 = 60,817,408 Bytes = 58MB 즉, 82,176~200,959 영역에 해당하는 영역이 확장 파티션에 영역이다.
그렇다면 확장 파티션이 있는 시작 위치를 한번 가봅시다. 확장 파티션의 시작 섹터인 82,176섹터로 이동 MBR의 파티션 테이블과 같은 구조의 파티션 테이블이 보이고 마지막에 55 AA 인 것을 확인할 수 있습니다.
확장 파티션(82,176섹터)의 가장 위에 보이는 파티션 정보를 분석(사실상 4번 파티션)
파티션 타입 (06) : FAT16
시작섹터 (80 00 00 00) : 00 00 00 80 -> 128 섹터
전체섹터 수(00 50 00 00) : 00 00 50 00 -> 20,480 섹터
그렇다면 4번 파티션의 위치는 어떻게 될까? 128번 섹터는 이미 1번 파티션의 시작위치이다. 여기서 부터는 확장파티션을 기준이 된다. 그렇다면 확장파티션 섹터 + 시작 섹터가 실제 시작 섹터가 되고, 마지막 섹터 번호는 시작섹터 + 전체섹터 수 -1이 된다.
시작섹터 = 82,176 + 128 = 82,304 섹터 마지막섹터 = 82,304(시작 섹터) + 20,480(전체 섹터 수) - 1 = 102,783 즉, 82,304 ~ 102,783가 4번 파티션 영역이다.
확장 파티션테이블(82,176섹터)에서 2번째 파티션 엔트리를 분석
파티션 타입 (05) : 확장파티션
시작섹터 (80 50 00 00) : 00 00 50 80 -> 20,608섹터
전체섹터 수(80 50 00 00) : 00 00 50 80 -> 20,608 섹터
82,176(확장파티션 있는 섹터) + 20,608(시작섹터) + 20,608 - 1 = 123,391 102,784 ~ 123,391 섹터가 다시 또 확장파티션의 범위가 됩니다.
우리는 끈질기기에 마지막 확장 파티션으로 가보면 위에서 확인한 섹터 102,784를 가면 확장파티션이 있고 또 동일한 파티션 테이블 정보를 표시합니다.
확장파티션테이블에서 1째 파티션 엔트리를 분석해보자.(사실상 5번 파티션)
파티션 타입 (06) : FAT16
시작섹터 (80 00 00 00) : 00 00 00 80 -> 128섹터
전체섹터 수(00 50 00 00) : 00 00 50 00 -> 20,480섹터
102,784(확장파티션 있는 섹터) + 128(시작섹터) + 20,480 - 1 = 123,391 102,912 ~ 123,391 섹터가 다시 또 확장파티션의 범위가 되는 것입니다.
위에서 계산 했던 모든 값들을 대략 정리해보면 아래의 그림처럼 생각해볼 수 있다. 흠.. 확장파티션으로 가면 갈수록 복잡해지는 것을 알 수 있습니다. (3번 파티션은 직접 구해봅시다.)
이제 아래 그림에서 Boot Sector와 Data 영역 제외하고 대부분 충분히 이해 할 수 있을 것입니다.
그렇다면 다른 분석 도구에서도 동일하게 나올까? FTK IMAGER에서 확인해봅시다. FTK Imager 에서 File - Add Evidence item 후 Phisical Drive 를 선택 한 뒤 우리가 분석하던 가상디스크를 선택
[View - Properties]를 선택하면 해당 영역의 분석 내용을 확인할 수 있습니다. Partition을 클릭 하면 해당 파티션의 시작섹터 번호, 총 섹터수를 확인할 수 있으며, 파티션의 스크롤을 가장 밑으로 내린 뒤 마지막 섹터를 클릭 한 뒤 가장 밑으로 내리면 마지막 섹터 번호를 확인할 수 있습니다. (Phy sec)
log sec는 해당 파티션 기준으로 섹터 번호를 나타낸다. 파티션 시작 섹터 기준으로 몇 번 섹터인지 확인할 수 있으며, 전체 섹터 수 -1 인 것을 확인할 수 있습니다. Physical Sector와 Logical Sector의 차이를 확실히 알고 계산을 할 수 있어야 합니다.
확장 파티션의 주요 내용을 모두 확인하였습니다. 그런데 하면 할수록.. 뭐랄까.. 비효율적인거 같습니다. 계속 확장 파티션을 만들고 한 섹터의 파티션 테이블도 최대 3,4개 정도만 되니 불편하구요.. 최근 스마트폰 등등의 경우 파티션이 기본 8~10개가 넘어가는 경우도 많은데 말이죠...
MBR의 단점을 보완한 GUID Partition Table(GPT)가 등장하였고, 최근에는 많이 사용되는 방식으로, 이제 GPT를 상세히 알아보도록 합시다.
아래와 같이 부트시그니처 부분을 다른 값으로 수정하면 어떤일이 벌어질까?
그럼 다시 55 AA로 수정해놓으면 어떻게 될까?
그렇다면... 이 0번 mbr을 그대로 복사해두었다가 쓸 수 있을까? 이건 나중에 디지털 포렌식과 더 친해지기 / 놀아보기 등에서 해보기로 해자.
부트코드 분석 참고 사이트 :
아래와 같은 순서로 세팅을 해봅시다. 1) 우선 할당되지 않은 부분을 우클릭 후 [새 단순 볼륨 선택] 2) 단순 볼륨 크기 10 MB 3) 드라이브 문자 또는 드라이브 경로를 할당 하지 않음 4) 이 볼륨을 포맷하지 않음
정상적으로 완료하면 아래와 같이 표시가 됩니다.
에서 보다 다양한 정보 확인가능
일반 pc에서 리틀 엔디안 저장하기 때문에 저장된 데이터를 해석 할때는 아래와 같이 바이트 단위로 순서를 역순으로 배치한 16진수를 10진수로 계산해야한다.
저장된 값) 00 00 50 00 -> 20,480섹터(10진수 계산한 값)
전체 섹터: 40,960 -> A0 00 (16진수) / 00 00 A0 00 -> 00 A0 00 00 (리틀엔디안)