ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • How to debug MBR on the Bochs
    kb 2010. 12. 27. 21:24
    MBR(Master Boor Record)을 감염시키는 악성코드가 있다면 기존의 MBR을 어떻게 변경하여 원하는 동작을 실행시키는지 궁금할 것이다. MBR은 BIOS(Basic Input/Output System)에서 POST(Power On Self-Test)과정을 거쳐 정상적으로 완료된 후 다음으로 호출되는 곳으로 하드디스크의 첫번째 옵셋(Offset 0x00)에 위치한 512 바이트의 바이너리를 말하는 것이다. MBR은 MBR 마지막 부분에 위치한 4개의 Partition Table 에 정보를 읽어 Partition Table 의 Boot Indicator 가 실행가능한 값(0x80)을 가지고 있을 경우 부팅 디스크로 판단하여 제어권을 넘겨주는 기능을 담당한다. MBR 에대한 자세한 내용은 여기에서 확인하고 이 글에서는 스킵한다.16비트 코드 디버깅하기 감염된 MBR을 디버깅 하기위해서는 매우 제한된 환경에서만 가능한 것 같다. 필자가 판단하기에 제한적이지만 가능한 방법들을 나열해보면 아래와 같은 정도 있지 않을까?
     
    1. OllyDbg
    올리에 바이트를 직접 입력하여 변환된 어셈코드를 보고 분석하기. 우선, MBR은 16비트 코드인데 올리는 32비트 전용 디스어셈블러이다. 게다가 바이너리 파일만을 불러오기가 안되서 직접 손으로 입력해야 하는 불편함이 있다.
      
    2. IDA Pro
    바이너리로 저장된 파일을 아이다로 열어 분석하기. 정적분석에서는 가장 손쉽게 분석하기 편한 환경을 제공한다. 하지만 필자가 지금 하고 싶은 것은 동적 분석이다.
     
    3. Debug.exe
    바이너리로 저장된 파일을 0x7C00 에 로드시켜 분석하기. 잘 될 것 같아서 해봤지만, 디버깅 도중에 종료되어 더이상 진행이 안된다.
     
    4. WinDbg
    사용자 모드에서 윈도우 실행프로그램에 달라붙어 분석할 MBR 데이터를 쓰기 가능한 공간에 넣고 디스어셈하기. 코드상에 고정된 주소값 때문에 디버깅하기 어렵다.

    예)
    0:001> .readmem c:\mbr.bin 120a0 120a0+0x1ff
    0:001> ur 120a0

    5. Bochs
    보쉬(Bochs)는 가상환경에서 에뮬레이터로 동작하는 공개용 프로그램이다. 보쉬는 환경설정하기가 다른 가상화 프로그램들 보다 어렵지만 세부적인 설정을 사용자가 설정할 수 있고 무엇보다 디버깅 모드를 지원하여 MBR 코드를 디버깅(애뮬레이팅)할 수 있다는 장점이 있다.

    Bochs 체험기
     
    기존에 보쉬에 대해 이야기는 들어봤지만 사용할 기회가 없어 이번기회에 보쉬를 이용하여 MBR 코드를 디버깅하고 싶었다. 제목에서 처럼 "체험기"이기 때문에 필자가 관련 작업을 수행하면서 실수한 내용도 같이 정리하였다.

    1. Bochs 설치하기

    보쉬를 윈도우 환경에서 설치하기는 매우 쉽다. 보쉬 사이트[http://bochs.sourceforge.net]에 방문하여 최신의 설치파일을 다운로드 받아 실행하면 그만 이다. 현재 2.4.5.1 이 가장 최신 버전이다.
     
    2. Bochs 설정하기

    보쉬가 설치된 폴더에 bochsrc-sample.txt 를 bochsrc.txt 로 복사한 다음 bochsrc.txt 를 편집하면 된다. 필자가 수정하거나 추가한 옵션은 아래와 같이 별다른 것이 없다.

    ata0-master: type=disk, mode=flat, path="hdd0.img", cylinders=203, heads=16, spt=63
    ata0-slave: type=cdrom, path=E:, status=inserted
    boot: floppy
    floppya: 1_44=a.img, status=inserted
     
    3. Bochs 부팅 이미지 만들기

    자~ 이제 보쉬설정은 어느정도 된 것 같다. 그렇다면 이제는 부팅할 수 있는 이미지가 필요한데, 윈도우 XP를 설치할 경우 시간이 너무 많이 걸리기 때문에 MS-DOS 를 설치하기로 결정했다.
     
    3.1 가상 하드디스크 만들기

    bximage.exe 를 이용하여 하드 디스크를 만든다. MS-DOS를 설치하기로 했기때문에 작은 용량으로 설정하여도 무방하다. 하드 디스크를 만드는 과정에서 출력되는 정보 중 cylinder 와 header, spt 를 기억해 두었다가 bochsrc.txt 에서 하드 디스크 설정하는 부분에 동일하게 기록하여야 한다. 여기까지 완료되었다면 실제로는 하드 디스크를 구입한 것이나 마찮가지다.^^;;
     
    3.2 fdisk 로 파티션 만들기

    지금껏 하드 디스크를 준비했으니 이제는 파티션을 나눠야 한다. 필자는 인터넷에서 Win98 부팅 디스켓 설치 파일을 구하여 플로피 디스크를 준비하였다. 그런데 보쉬에서는 물리적인 플로피 디스크에 접근이 안되어 Diskcopy.exe 라는 툴로 플로피 디스크를 이미지 파일로 만들어 사용했다. fdisk 로 파티션을 만드는 방법은 Memories of DOS::fdisk로 파티션 나누기 를 참고하길 바란다.
     
    팁!!!
    Diskcopy.exe 로 만든 이미지는 정확히 1.44 MB 가 아니여서 만들어진 이미지를 그대로 사용할 경우 보쉬가 부팅 디스크로 인식하지 못하는 문제가 발생한다. 그래서 Diskcopy.exe 를 헥사에디터로 열어 0x168000 이후 부분을 잘라내어 사용하면 정상적인 플로피 디스크 이미지로 사용할 수 있다.

    3.3 MS-DOS 설치하기


    인터넷에서 구한 MS-DOS이미지를 이용해 3.2 에서와 같은 방법으로 MS-DOS 설치 플로피 디스크 이미지를 만들었다. 설치파일 및 설치방법은 Memories of DO::영문 MS-DOS 6.0 설치하기 에서 참고하기 바란다.
     
    사실 여기까지 MS-DOS 관련 파일들이 없어서 많은 시간을 보내야 했다.
    그런데!!! 이게 왠일인가?!!! 보쉬 사이트에 가보면 Free-DOS 이미지를 다운로드 받을 수 있는 것이 아닌가. OTL 암튼 좋은 경험 했다고 생각하고 넘어갔다.

    4. Bochs 로 디버깅하기

    윈도우 환경에서 보쉬로 디버깅을 하려면 bochsdbg.exe 를 실행하면된다. 반면 리눅스에서는 별도의 컴파일 옵션을 주고 컴파일을 해야 된다고 하니 윈도우가 상대적으로 편한 것 같다. 암튼 bochsdbg.exe 를 이용한 배치파일을 아래와 같이 만들고 실행하면 편리하다.
     
    c:\Program Files\Bochs-2.4.5 > copy con bochs_start.bat
    @echo off
    set $BXSHARE="C:\Program Files\Bochs-2.4.5"
    bochsdbg.exe -qf bochsrc.txt
    ^Z

    bochsdbg.exe 를 실행하면 보쉬와 같이 실행된 도스 명령 프롬프트에서 아래와 같은 화면을 만날 수 있다.
     
    C:\Program Files\Bochs-2.4.5>bochsdbg.exe -qf bochsrc.txt
    ===============================================
                           Bochs x86 Emulator 2.4.5
                  Build from CVS snapshot, on April 25, 2010
    ===============================================
    00000000000i[     ] reading configuration from bochsrc.txt
    00000000000i[     ] Stopping on magic break points
    00000000000i[     ] installing win32 module as the Bochs GUI
    00000000000i[     ] using log file bochsout.txt
    Next at t=0
    (0) [0xfffffff0] f000:fff0 (unk. ctxt): jmp far f000:e05b         ; ea5be000f0
    <bochs:1> |

    여기까지 왔으면 이제 디버깅할 수 있다는 것이다. 디버깅에 필요한 명령어를 몇 가지 알아보면 다음과 같은 것이 있다. 자세한 내용은 보쉬 홈페이지에 있는 Using Bochs internal debugger 문서를 보면 된다.
     
    - b breakpoint
       ex) b 0:0x7C00
    - blist
    - c continue (F9)
    - s step into (F7)
    - r registers
    - q quit

     
    5. Bochs

    그럼 이제 감염된 MBR을 위에서 만든 이미지에 덥어 쓰고 보쉬를 재부팅시키면 처음에 목적한 바를 이룰 수 있을 것으로 생각했다.
     
    그럼 어떻게 감염된 MBR을 위에서 설치한 보쉬에다가 덥어쓸 수 있을까? 고민해봤다. 네트워크 드라이브 연결? CD-ROM? Floppy? 앗!!! 플로피... 
     
    번뜻 이런 생각이 들었다. 감염된 MBR 바이너리 파일을 플로피 이미지로 인식하게 한 후 플로피 디스크로 부팅하게만 하면 보쉬 부팅 이미지를 만들 필요 없이 간단하게 되는 것이 아닌가. OTL
     
    실제로 bochsrc.txt 에서 아래와 같이 수정한 후 위에서 만든 bochs_start.bat 를 실행해 보았다. 잘~~~ 된다.
     
    floppya: 1_44=a.img, status=inserted
    boot: floppy
     
    이제 디버깅 하면 된다.
     
    혹시 디버깅을 GUI 환경에서 하고 싶다면 BFE, Graphical Debugger Interface for the Bochs PC Emulator 를 설치하면 된다.
     
    즐~~~
     


    'kb' 카테고리의 다른 글

    HASH 의 세가지 성질  (0) 2011.04.03
    소수 이야기  (0) 2011.04.03
    Zone Identifier ADS's  (1) 2011.04.03
    Internet Explorer 9 Security  (0) 2011.03.25
    Address Space Layout Randomization (ASLR)  (0) 2011.02.06
Designed by Tistory.