1. MBR (Master Boot Record)?
MBR은 Master Boot Record의 약자로 컴퓨터에 전원이 공급되고 부팅이 가능한 운영체제를 찾아 해당 운영체제의 boot code를 실행할 수 있도록 Partition들의 위치 정보를 갖는다.
회색으로 색칠된 부분이 Boot code이고 아래에 여러 색으로 색칠된 부분이 Partition table이다.
Boot code는 Partition Table 중 부팅이 가능한 Partition을 찾아 부팅을 할 수 있게 해주는 코드이며 마지막 2bytes(0xAA55)는 MBR의 Signature이다
MBR의 Partition table 형식이다. Partition Table의 첫 바이트인 Boot Flag는 해당 Partition이 부팅이 가능한지 여부를 나타내는 플래그다.
그 다음으로 오는 세 바이트는 CHS(Cylinder-Head-Sector) 방식의 주소를 사용할 경우 해당 Partition의 시작 주소를 나타낸다.
그 다음으로 오는 Part Type 필드는 해당 Partition의 유형을 나타내며, 각 값이 가지는 아래 표로 나타낸다.
이후 네 바이트는 LBA(Logical Block Addressing) 방식의 주소를 사용할 경우의 Partition의 시작 주소를 나타낸다.
LBA Starting Address의 이후에 오는 Number of sectors in partition 필드는 해당 Partition의 Sector 개수를 나타내며 따라서 LBA 주소 방식을 사용할 경우 전체 파티션 영역은 다음과 같다.
시작 주소 : [Starting LBA address] * [Sector size]
끝 주소 : [Starting LBA address] * [Sector size] * [Num of sectors in Partition]
각 필드의 의미를 정리하면 다음과 같다.
- Boot flag(1byte) : 해당 파티션이 부팅이 가능한 파티션인지 여부를 나타냄 (0x80 : 부팅 가능, 0x00 : 부팅 불가능)
- CHS Start(3bytes) : 해당 파티션의 시작 주소를 의미함(CHS 방식)
- Part Type(1byte) : 해당 파티션의 종류를 의미함 (0x0B : CHS 모드 FAT32, 0x0C : LBA 모드의 FAT32, 0x07 : NTFS 등)
- CHS End(3bytes) : CHS 방식의 종료 주소
- LBA Start(4bytes) : 해당 파티션의 시작 주소(LBA 방식)
- Size in Sector(4bytes) : 파티션의 섹터 수
Partition Type에 올 수 있는 값들은 위와 같다.
0번지부터 512Bytes까지 MBR이 기록되어 있으며 위 그림과 같이 Partition Table을 확인할 수 있었다.
초록색으로 색칠한 부분이 각 Partition의 Partition Type을 나타내며, 네 개의 Partition 모두 해당 값이 0x07이다.
위 그림에서 확인하면 0x07은 exFAT 또는 NTFS 파일시스템을 나타낸다.
4개의 Partition Entry중 색칠한 부분이 각각 [LBA Starting address]와 [Num of sectors in Partition]에 해당한다.
따라서 첫 번째 Partition은 0x3F에 0x200(512bytes)를 곱한 위치에 존재한다고 볼 수 있다.
0x3F에 0x200을 곱한 값은 0x7E00이므로 해당 위치에 실제 Partition이 저장되어 있는지 확인한다.
앞서 계산한 0x7E00의 위치에 NTFS 파일시스템 형식의 Partition이 있는 것을 확인할 수 있었다.
추가적으로 위 그림에서 첫 번째 Partition의 시작 주소인 0x3F와 해당 Partition의 Sector 수를 나타내는 0x032F8E를 더한 값이 다음 두 번째 Partition의 시작 주소임을 확인할 수 있으며 따라서 첫 번째 Partition이 끝나는 지점의 다음 Sector에 두 번째 Partition이 존재하는 것을 확인할 수 있다.
두 번째 Partition의 위치 또한 동일하게 계산해보면 0x032FCD에 Sector의 크기인 0x200(512bytes)를 곱하면 위치를 구할 수 있다.
해당 계산의 결과는 0x65F9A00이며 해당 위치에 실제 Partition이 존재하는지 확인해본다.
위 그림에서 확인할 수 있듯이 0x65F9A00에 해당 Partition이 기록되어 있는 것을 확인할 수 있었다.
이후 세 번째 LBA를 계산하면 0x065F9A에 Sector 크기를 곱한 값은 0x0CBF3400이며 해당 위치에 실제 세 번째 Partition이 존재하는지 확인해본 결과 다음과 같이 실제 Partition이 존재하는 것을 확인할 수 있었다.
네 번째 Partition 역시 0x098F67 * 0x200인 0x131ECE00에 실제 Partition이 위치하는 것을 확인할 수 있었다.
세 번째 파티션
네 번째 파티션
다음으로 CHS(Cylinder-Head-Sector) 방식은 이름 그대로 실제 HDD의 Cylinder, Head, Sector를 이용하여 디스크 영역을 접근하는 방법이다.
표현할 수 있는 크기가 크지 않아서 현재는 사용하지 않지만 주소 계산 방법을 살펴보면 다음과 같다.
색칠된 부분이 CHS Address의 시작 주소를 나타낸다.
해당 값을 계산하기 위해선 해당 값으로부터 Cylinder, Head, Sector 부분을 계산해야 하며 계산을 위해선 세 값을 비트로부터 추출해야 한다.
위 Partition Table의 첫 번째 Partition의 CHS Address인 0x000101을 이용하여 세 값을 나타내면 다음과 같다.
해당 값을 리틀엔디안 방식을 고려하지 않고 해석하면 가장 맨 뒤 10비트가 Cylinder를 의미하며 그 앞 6비트는 Sector, 처음 8비트는 Head를 의미한다.
따라서 0x000101의 각 세 값은 0, 1, 1이 된다. 해당 값을 이용하여 공식에 따라 LBA 주소로 변환이 가능하며 그 공식은 다음과 같다.
실린더당 헤드의 개수와 트랙당 섹터 개수는 고정적으로 각각 0xFF(255), 0x3F(63)을 사용하며, 해당 값을 대입하여 계산하면 변환된 LBA의 주소는 0x3F(63)이 된다.
해당 값은 같은 Partition Table의 LBA 주소인 0x3F와 일치한다. 두 번째 Partition의 CHS 주소인 0x0D0100을 이용하여 LBA 주소 계산을 해보면 마찬가지로 Cylinder의 값은 13, Head의 값은 0, Sector의 값은 1이 되어 LBA 주소 계산 결과 208,845가 도출되며 해당 값을 16진수로 변환하면 0x032FCD가 된다.
해당 값은 두 번째 Partition의 LBA 값과 일치한다.
세 번째 Partition 역시 Cylinder 값 0x1A(26), Head 값 0, Sector 값 1이 되어 계산 결과 417,690이 도출되며 해당 값은 16진수로 0x065F9A로 세 번째 Partition의 LBA 주소와 일치한다.
네 번째 경우도 0x270100의 CHS 값은 Cylinder 0x27(39), Sector는 1, Head는 0으로 마찬가지로 위의 공식에 대입하면 십진수 626,535를 구할 수 있으며 이는 16진수로 0x098F67로 네 번째 Partition의 LBA 값과 일치하다.
* 첫 번째 파티션이 63(0x3F)에 있는 이유
과거에 Disk access에 사용된 BIOS API의 INT 13h가 CHS Addressing에 사용되었는데 해당 인테럽트를 사용하여 Disk accessing을 하는 시스템에는 모든 Partition이 Cylinder의 Boundary에 위치해야 한다. 따라서 첫 번째 Cylinder의 Boundary에 위치한다. 비록 LBA 주소 계산 방식이 사용되어도 과거 CHS 방식과 호환을 위해 첫 번째 Cylinder의 Boundary에 위치하며 각 Cylinder에는 63개의 섹터가 있어서 0x3F(63)에 Partition이 위치하게 됐다. 현재는 Logical Sector와 Advanced Format으로 인해 한 섹터를 4K로 정렬해야 하며 이러한 시스템에서 0x3F라는 값은 8의 배수가 아니기 때문에 Partition을 위치시키는 과정에서 섹터에 맞지 않는 오배열로 이어질 수 있으며 이는 Performace 문제를 발생시킬 수 있어서 현재 사용되는 OS의 Partition은 일반적으로 0x800에 위치한다.
'Study > Digital Forensic' 카테고리의 다른 글
Memory Forensic (0) | 2019.02.19 |
---|