본문 바로가기
예전 포스팅 (~2018)

MBR과 boot loader

by akaranch 2021. 9. 23.

0. 왜 궁금했을까

PC에 전원을 넣으면 컴퓨터는 어떻게 사용자에게 OS를 불러다 보여주는 걸까? 흔히 컴공과에 진학하게 되거나,
호기심이 왕성하다면흔히 "컴퓨터가 켜지는 과정"에 대해 알고 있을 것이다.

  1. ROM에서 하드웨어의 상태를 체크하는 POST (Power On Self Test)를 수행 후 Bios에서 CMOS 설정 정보를 확인한다.
  2. 이후 OS을 로딩하기 위해 디스크의 첫번째 섹터인 MBR을 읽어 부트코드를 수행한다.
  3. 부트코드는 부팅이 가능한 파티션을 찾아 해당 파티션의 부트 레코드를 호출하여 RAM에 적재한다.

이 중 MBR에 대해 뜯어보려한다.

1. MBR (Master Boot Record)

MBR 데이터 구조

MBR은 기본적으로 아래와 같은 구조를 지닌다.

  1. 446byte는 Boot code 영역
  2. 그다음 64byte는 Partition Table 영역 (16byte x 4)
  3. 2byte는 Signature 영역

    446byte의 Boot strap code와 artition Table(각 16byte씩 4개의 entry), 2byte의 Signature영역을 합쳐 총 512 byte 크기를 가지게 된다.

HxD를 사용하여 뜯어보면 아래와 같이 확인 할 수 있다.

HxD 검증

boot flag : 00 - 0x00 (부팅 불가능) / 0x80(부팅 가능)

Strating CHS Addr : 02 03 00 - CHS 주소의 시작값을 알려준다.
Part Type : 0B 파티션의 파일시스템을 알려준다. 참고

Ending CHS Addr : FE 3F 81 - CHS 주소의 끝값을 알려준다.

Straing LBA Addr : 80 00 00 00 - 실제 파티션의 시작 위치를 알려준다.

Size in Serctor : 00 E8 1F 00 - 파티션의 총 섹터 수를 알려준다.

위 예시를 해석해보면 boot flag가 "00" 이기에 부팅이 안되는 디스크이다.
또한 파일 시스템의 종류는 "0B" 이기에 "FAT32" 이며,
Straing LBA Addr가 "80 00 00 00"인것으로 보아, 첫번째 파티션의 시작은 0x80 =128 sector
Size in Serctor는 "00 E8 1F 00"로 보여지기에, 파티션의 총 섹터 수는 0x1FE800 = 2091008 serctor = 1070596096 byte = 1021MB = 0.99707GB 일것이다. 즉 파티션은 1GB의 용량이란걸 알 수 있다.

만약 파일을 카빙하게 된다면, 파티션 테이블 엔트리의 모든 정보는 리틀 엔디안 방식으로 기록되기에
00 E8 1F 00의 순서로 계산하면 안되고, 역순인 0x1FE800으로 하는걸 잊지 말아야 한다.

FAT32 방식의 파일 시스템을 가진 DISK에서 지워진 파일을 파일 카빙 기법을 이용하여 복구

FAT32 방식의 파일 시스템을 가진 DISK에서 지워진 파일을 파일 카빙 기법을 이용하여 복구해보자.

우선 0번 섹터에 위치한 MBR을 통해 파티션의 갯수와 BR의 오프셋을 확인한다.
1개의 파티션이고 부팅은 불가능, 파일시스템은 FAT32이고 Start LBA의 위치는 0x80

즉, 128 sector에 존재한다는걸 알 수 있다. 128 섹터로 이동해보자.

BR이 확인된다.

BR의 구조는 위와 같다. 목표는 Root Directory의 위치를 파악하여 지워진 파일을 복구하는 것이다.
Root Directory의 위치는 어떻게 알 수 있을까?

그렇다. MBR + 예약된 영역 + FAT #1 +FAT #2(backup)의 사이즈를 더하면 찾을 수 있다.

위 BR 에서보면 0x19F6임을 알 수 있다. 즉 6646 섹터이다.
계산해보자. MBR [128]+예약영역 [6646]+FAT#1 [773]+FAT#2(backup) [773]= root directory [8320]
root directory는 8320 섹터에 존재하는 것을 알 수 있다.

이동해보자.

root directory의 구조는 위와 같다. 위 정보를 토대로 삭제된 파일을 카빙해 볼 것이다.

E5 45 46 43 4F 4E 20 20 48 57 50 20 10 15 AA 54
5E 4D 5E 4D 00 00 CC 63 48 4D 44 02 59 43 1E 00

0x0244 = 580 - 2 (예약되어있는 sector) = 578
578 * 4 = 2312 + 8320 = 10632
파일의 크기 =0x1E4359 = 1983321

파일의 데이터가 있는 sector을 알수 있다. 이동해보자

파일의 시작점은 알지만 끝을 알수가 없다고 당황할 필요가 없다. 우리에겐 파일의 용량이 있기 때문이다.
블록선택을 눌러서 용량을 넣어주면 알아서 블록이 잡힌다.

복사해서 새로 만들어서 붙여넣어준 뒤,저장한다.
삭제되었던 파일이 hi.pdf로 복원되었음을 알 수 있었다.

댓글