Post

Windows boot process, MBR

  • MBR 앞쪽 440Byte에는 bootstrapping program이 들어있고, OS-specific하다. ( Windows MBR laoder, LILO, GRUB… )
  • MBR의 446~509( 64Byte )Byte에 Partition Table이 들어있고, bootstrapping program과 달리 표준화되어있다. 각 파티션은 16Byte를 사용하므로 기본적으로 4개의 파티션에 대한 정보를 나타낼 수 있다. 각 파티션 정보의 첫 번째 바이트는 해당 파티션이 부팅 가능한 파티션인지 나타낸다. ( 0x80이면 부팅 가능 0x00이면 불가능 )

MBR 바이너리는 이렇게 생겼다.

드라이브 1

드라이브 1의 MBR code

드라이브 2

드라이브 2의 MBR code

  • 파티션 테이블이 잘못되면 출력되는 Invalid Partition Table과 Missing Operating System 문자열을 확인할 수 있다.
  • 드라이브 마다 MBR에 저장되는 code, error string 등이 다른것을 알 수 있다.

Windows boot process

  1. 파워가 들어오고 CPU가 동작하면 multi-processor 또는 multi-core system의 경우 CPU 하나를bootstrap processor (BSP)로 선택한다.
    • BSP가 모든 BIOS, kernel initialization code를 수행한다.
    • 나머지 프로세서들은 application processors (AP)라고 부르며 kernel에 의해 활성화 될 때 까지 halt상태다.
  2. 전기적 신호를 보내 PC를 초기화한다.초기화 값은 보통 0xFFFFFFF0 (Reset vector)로 이 곳에 BIOS entry point로 jmp하는 instruction이 있다. 그래서 BIOS code로 jmp하게 된다.
  3. CPU는 BIOS code를 실행한다. 먼저 POST를 진행한다. POST에서는 시스템 버스나 클럭 동기화, 그래픽 카드, 램 등을 테스트 및 초기화한다. 여기서 그래픽 카드가 제대로 동작하면 모니터에 이것저것 출력되기 시작한다. POST가 끝나고 4로 넘어가기 전에 하드웨어에 따라 SCSI BIOS 등 추가적인 BIOS를 램에 적재하는 경우도 있다.
  4. BIOS는 OS를 부팅하기 위해 boot device를 찾고, 운영체제 로드를 위한 기본적인 구성을 램에 적재한다.
  5. 운영체제를 로드하기 위해 드라이브의 첫 번째 섹터(MBR)를 읽는다.
    MBR의 내용을 0x7c00에 적재하고 이 주소로 jmp해서 MBR의 앞 440Byte에 있던 코드를 실행한다. 별 다른 검사루틴 없이 실행하기 때문에 MBR 감염시 위험하다.
  6. MBR code에 따라 Partition Table에서 부팅 가능한 파티션을 찾는다.
    부팅하다 파티션 테이블이 잘못되면, Invalid Partition Table 또는 Missing Operating System과 같은 문구가 나타난다.
    이 문구는 BIOS에 있는게 아니라 MBR에서 확인할 수 있다. 그래서 MBR에 따라 다른 문구가 나타난다.
  7. 부팅 가능한 파티션을 발견하면 해당 파티션의 첫 번째 섹터(VBR)로 이동한다.
    • VBR(boot sector) 은 파티션의 첫번째 섹터로 클러스터 크기, MFT 위치, 전체 섹터 등 해당 볼륨의 정보와 부팅에 필요한 시스템파일의 위치와 실행할 수 있는 코드가 포함되어 있다.
  8. VBR code에 따라 진행한다.
    • VBR의 첫번째 2Byte는 jmp instruction이다. (EB 52) VBR 내부의 code로 jmp한다.
Windows Vista 이전 OS boot process
  1. NT loader( ntldr )을 실행한다. Boot.ini도 읽는다.
  2. OS를 로드한다.
Windows Vista 이후 OS boot process
  1. Windows Boot manager ( bootmgr )을 실행한다. BCD도 읽는다.
  2. bootmgr은 boot menu를 보여주고, system-specific boot loader를 로드한 다음 boot parameter를 boot loader( winload.exe )에게 넘긴다.
  3. winload는 parameter와 함께 boot process 흐름을 넘겨받아 OS를 로드한다.

bootmgr과 BCD를 쓰느냐, ntldr과 boot.ini를 쓰느냐의 차이다.

Vista 부터는 BCD ( Boot Configuration Data )라는 새로운 부트로더 아키텍쳐를 사용한다.
  • BCD는 firmware-independent boot configuration and storage system이다. BCDEdit (BCDEdit.exe ) 라는 툴을 이용해 디버깅, 테스트, 트러블슈팅에 따른 부트옵션을 구성할 수 있다.
  • 당연히 BCDEdit을 사용해 BCD를 수정할 때는 관리자권한이 필요하다. BCDEdit을 사용해서 부트옵션을 수정하는 것은 강력한 만큼 잘못 설정했을 경우 부팅이 안될 수 있다. 가벼운 설정은 msconfig를 사용하는게 좋다.
  • 기존의 NT Loader는 다음의 3개 항목으로 대체됐다.
1
2
3
Windows Boot Manager ( Bootmgr.exe )
Windows operation system loader ( Winload.exe )
Windows resum loader ( Winresum.exe )  
  • Boot.ini는 BCD로 대체됐다.
  • boot option이 NVRAM에 저장되는 EFI-basedcomputer에서는 BCD를 사용해 boot option을 설정해야 한다.
  • 이 때 BIOS-based computer 처럼 boot.ini파일에 텍스트로 저장해놓은 boot parameter에 바로 접근하는 것이 아니라, BCD에 접근하기 위해 API와 tool ( BCDEdit ) 을 사용하기 때문에 비인가 접근을 막을 수 있다.
  • (EFI-based라고 BIOS를 아예 안쓰는 것은 아니다. 이것도 VBR까지 읽고 나서의 얘기니까.)
  • 즉, 구형 OS에서는 Boot sector를 감염시키는 등 복잡한 방법 안써도, boot.ini파일을 변형시키는 식으로 공격할 수 있다는 말이 된다.

GRUB이나 LILO는 windows와 다르게 동작하므로 참고한다.

참고
This post is licensed under CC BY 4.0 by the author.