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
0.파워가 들어오고 CPU가 동작하면 multi-processor 또는 multi-core system의 경우 CPU 하나를
bootstrap processor (BSP)로 선택한다. BSP가 모든 BIOS, kernel initialization code를 수행한다. 나머지 프로세서들은 application processors (AP)라고 부르며 kernel에 의해 활성화 될 때 까지 halt상태다.
- 전기적 신호를 보내 PC를 초기화한다.초기화 값은 보통 0xFFFFFFF0 (
Reset vector)로 이 곳에 BIOS entry point로 jmp하는 instruction이 있다. 그래서 BIOS code로 jmp하게 된다.
- CPU는 BIOS code를 실행한다. 먼저 POST를 진행한다.POST에서는 시스템 버스나 클럭 동기화, 그래픽 카드, 램 등을 테스트 및 초기화한다. 여기서 그래픽 카드가 제대로 동작하면 모니터에 이것저것 출력되기 시작한다. POST가 끝나고 4로 넘어가기 전에 하드웨어에 따라SCSI BIOS 등 추가적인 BIOS를 램에 적재하는 경우도 있다.
- BIOS는 OS를 부팅하기 위해 boot device를 찾고, 운영체제 로드를 위한 기본적인 구성을 램에 적재한다.
- 운영체제를 로드하기 위해 드라이브의 첫 번째 섹터(MBR)를 읽는다. MBR의 내용을 0x7c00에 적재하고 이 주소로 jmp해서 MBR의 앞 440Byte에 있던 코드를 실행한다. 별 다른 검사루틴 없이 실행하기 때문에 MBR 감염시 위험하다.
- MBR code에 따라 Partition Table에서 부팅 가능한 파티션을 찾는다.부팅하다 파티션 테이블이 잘못되면, Invalid Partition Table 또는 Missing Operating System과 같은 문구가 나타난다. 이 문구는 BIOS에 있는게 아니라 MBR에서 확인할 수 있다. 그래서 MBR에 따라 다른 문구가 나타난다.
- 부팅 가능한 파티션을 발견하면 해당 파티션의 첫 번째 섹터(VBR)**로 이동한다.
**VBR(boot sector)은 파티션의 첫번째 섹터로 클러스터 크기, MFT 위치, 전체 섹터 등 해당 볼륨의 정보와 부팅에 필요한 시스템파일의 위치와 실행할 수 있는 코드가 포함되어 있다.**
- VBR code에 따라 진행한다. VBR의 첫번째 2Byte는 jmp instruction이다. (EB 52) VBR 내부의 code로 jmp한다.
Windows Vista 이전 OS boot process
- NT loader( ntldr )을 실행한다. Boot.ini도 읽는다.
- OS를 로드한다.
Windows Vista 이후 OS boot process
- Windows Boot manager ( bootmgr )을 실행한다. BCD도 읽는다.
- bootmgr은 boot menu를 보여주고, system-specific boot loader를 로드한 다음 boot parameter를 boot loader( winload.exe )에게 넘긴다.
- 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개 항목으로 대체됐다.
- 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와 다르게 동작하므로 참고한다.
참고
http://forensic-proof.com/archives/178?ckattempt=1
https://msdn.microsoft.com/en-us/library/windows/hardware/ff542273(v=vs.85).aspx
http://social.technet.microsoft.com/wiki/contents/articles/11341.the-windows-7-boot-process-sbsl.aspx- OS load phase에 대한 상세
http://thestarman.pcministry.com/
- 어셈블리를 볼 수 있다