반응형

*부트 로더를 메모리에 정상적으로 복사하려면 부트섹터 512 byte에서 마지막 2 byte를 0x55, 0xAA로 저장해야 한다


해당 포스팅에서는 어셈블리를 사용할 것이므로 

http://gijadi.tistory.com/category/system/shellcode 포스팅을 먼저 보고 와주기를 바란다.


QEMU를 실행할 것인데,실행할 때마다 옵션을 입력하기는 불편하니까 배치 파일로 실행을 자동화 시킬 것이다. QEMU 디렉토리로 넘어가서  qemu-x86_64.bat 파일을 찾아 에디터로 열고 다음과 같이 수정해준다.

qemu-system-x86_64.exe -L . -m 64 -fda c:/MINT64/Disk.img -localtime -M pc

~>64mb의 물리 메모리 할당, 플로피 디스크 이미지로 MINT 64 OS이미지(Disk.img)설정 , 가상 머신을 일반 PC환경으로 설정


이제부터 화면에 문자를 띄울것인데 그 이전에 세그먼트 레지스터를 초기화하는 코드가 필요하다. 왜냐하면 BIOS가 부트 로더를 실행했을 때 세그먼트 레지스터에는 BIOS 값이 들어있기 때문이다 세그먼트 레지스터를 초기화 하지 않는다면 이상한 어드레스에 접근할 수 있으므로 미리 초기화하고 사용해야 한다.

해당 OS에서는 0x7c0으로 초기화 하였다(BIOS가 부트 로더를 디스크에서 읽어 메모리에 복사하는 위치가 0x7c0이기 때문)

또한 ES 세그먼트 레지스터는 화면 출력에 관련된 세그먼트로 사용하려고 0xB800을 설정하였다.


ex. 세그먼트 레지스터에 접두사를 사용하는 방법

mov byte [es:0x00], 'M' ;ES 세그먼트: 오프셋 0xB800:0x0000에 'M'을 복사

mov byte [es:0x01], 0x4A    ;ES 세그먼트:오프셋 0xB800:0x0001에 0x4A를 복사


화면 정리, 부팅 메세지를 출력하는 어셈블 코드를 모두 정리해보면 다음과 같은 소스가 나오게 된다.

<최종 부트로더 소스>





반응형
,