부트로더 - 3
이전에 MBR에 대한 설명을 했을 때 PeTya 랜섬웨어의 금전요구 화면에 대한 이야기를 했는데 어떻게 그런 금전 요구 화면을 띄울 수 있었을까? OS가 부팅되지 않아 그래픽카드나 드라이버에 엑세스할 수 없는데 말이다. 이는 기본적으로 메모리의 특정 위치에 디스플레이가 매핑되어있어서 가능한 일이다.
비디오 메모리라고 불리는 것인데 메모리의 특정 부분이 디스플레이 화면에 매핑되어있어서 해당 메모리위치에 데이터를 기재하면 디스플레이에 나타나는 것이다.
이러한 비디오 메모리는 메모리 주소 A000:000H에서 B000:FFFH의 128KB가 미리 예약되서 사용되고 있는데 모두 사용되는건 아니고 비디오 어댑터에 따라서 일부만 사용된다.
기본적으로 구조는 아래와 같다.
그래픽 모드 비디오 메모리
A000:0000 ~ B000:0000
흑백 텍스트 모드 비디오 메모리
B000:0000 ~ B800:0000
컬러 텍스트 모드 비디오 메모리
B800:0000 ~ C000:0000
우리가 흔히들 매트릭스하면 생각나는 검은 바탕에 초록 글자나 PeTya에서 보이는 붉은 글자를 나타나게 하려면 B800:0000 ~ C000:0000 영역을 쓰면 된다. 가로 80문자, 세로 25문자에 한 문자당 문자값 1바이트, 속성값 1바이트로 전체 메모리는 80X25X2 = 4000바이트를 요한다.
문자값은 ASCII이며 1바이트를 그대로 사용하는데 속성값은 무엇일까? 속상값에 대한 세부 내용은 아래와 같다.
배경색 최상위 1bit
- 0x00 효과 없음
- 0x01 하위 3bit 색상에 깜박임 효과 혹은 밝기 상승 효과 (비디오 컨트롤러의 속성 모드 제어 레지스터의 Blink 피트가 1이면 깜박임 효과가 됨)
전경색 최상위 1bit
- 0x00 효과 없음
- 0x01 하위 3비트 색상에 밝기 상승 효과
배경색 & 전경색 하위 3bit
하위 3bit의 경우 색깔을 나타내는 것이다.
- 0x00 검은색
- 0x01 파란색
- 0x02 녹색
- 0x03 청색
- 0x04 빨간색
- 0x05 자홍색
- 0x06 노란색
- 0x07 흰색
이러한 방식을 이용하면 현재 제대로 부트로더가 작동하고 있는지, 혹은 커널 로딩 중간에 제대로 데이터를 불러오고 있는지 하드웨어에 문제가 없는지 등을 나타내는 로그를 찍고 싶을 때 매우 유용하게 사용할 수 있다.
참고 문헌
- 64Bit 멀티코어 OS의 구조 - 한승훈 저