Post

부트로더 - 2

현대의 MBR은 다음 세가지로 이루어져야한다.

1. Bootstrap Code

파티션 테이블을 참조해서 관련 코드를 불러오는 코드다.

2. Partition Table Entry

Boot Flag (1 Byte)

0x80 -> 부팅 가능 코드
0x00 -> 부팅 불가 코드

Starting CHS Address (3 Byte)

현재는 사용되지 않는 부분으로 파티션 시작 주소를 CHS 주소로 적은 부분이다.

Partition Type (1 Byte)

파티션이 어떤 종류인지 명시해둔 코드이다.
0x07 -> NTFS
0x0B, 0x0C -> FAT32
0x05, 0x06 -> Extended partition (확장 파티션)
0x83 -> 리눅스 파티션
0x82 -> 리눅스 스왑파티션

Ending CHS Address (3 Byte)

현재는 사용되지 않는 부분으로 파티션 끝 주소를 CHS 주소로 적은 부분이다.

Starting LBA Address (4 Byte)

현재도 쓰고 있는 부분으로 실제 파티션의 시작을 LBA 방식으로 기재해둔 곳이다.

Size in Sector (4 Byte)

섹터의 크기 (파티션의 총 섹터 갯수, 총 용량을 계산하려거든 512Bytes를 곱하면 된다.)

3. Signature

512Bytes 끝에 0xAA, 0x55가 들어가있어야한다. 리틀엔디안일때 이렇게 들어가야하고, 빅엔디안의 경우 0x55, 0xAA순으로 들어가 있다.
해당 시그니처가 없으면 MBR로 인식하지 않는다.

사실 2번인 Partiion Table Entry가 없어도 동작은 한다. 단지 BootStrap Code에서 어디부터 어디까지 가져와서 로딩할 것인지에 대한 부분을 다 정의해줘야하고 파일 시스템을 사용할 수 없다는 점에서는 좀 치명적이긴하지만, 구동자체는 가능하다. 그냥 현대의 OS가 이러한 형태라는 것이니까. 사실은 끝에 Signature만 제대로 지켜줘도 바이오스가 MBR 인식하는데는 문제가 없고, MBR의 앞부분 510Bytes에서 다음 구동할 코드만 제대로 명시가 된다면 코드 실행은 문제 없다고 볼 수 있다.

예시로는 적절할지 모르겠지만 실제로 파일을 암호화하여 복호화키를 얻고 싶다면 비트코인을 송금하라고 협박하는 이른바 PeTya 랜섬웨어의 경우. 파일만 암호화하는 경우도 있었지만 MBR를 변조시켜 보관한뒤 자기네들이 만든 MBR을 해당 위치에 덮어씌워 금전을 요구하는 화면을 띄웠었다.

당연하지만 내가 설치해둔 OS로 부팅은 안되지만 PeTya의 금전 요구화면은 잘 뜬다. 이게 가능한 이유가 자네들이 만든 MBR에서 3번 시그니쳐를 제외한 1,2번 부분을 짜서 해당 화면이 뜨게 끔 만들었기 때문이다. 때문에 MBR 시그니처만 잘 지키더라도 우리가 생각하는 OS는 아닐지라도 컴퓨터를 통해 코드 구동은 가능하다.

참고 문헌

  1. 64Bit 멀티코어 OS의 구조 - 한승훈 저
This post is licensed under CC BY 4.0 by the author.