2017년 11월 13일 월요일

MBR 공부 정리 III - MBR의 부트 코드 분석 방법

다음은 MBR의 부트코드를 어떻게 분석해야할지에 대해 정리한다. 정리하면서 보니까 결국 그전 보고서 처럼 쭉쭉 분석한 내용만 다룬듯 해서, 분석하면서 정리된 내용을 정리?! 하려고 한다. 그럼 Start~!


우선, MBR에서 가장 먼저 실행되는 영역은 MBR의 BootCode 영역이다. 보통 악성코드들은 해당 영역에 악성행위를 실행하는 코드를 삽입하여 감염된 PC에서 악성행위가 발행하도록 만든다. 물론 해당 영역에서 악성행위를 직접적으로 실행하는 경우도 있지만, 과거에는 해당 영역에서 공격자(해커)가 삽입해둔 다른 영역(악성 행위 코드)으로 점프하도록 만들어서 코드를 실행 시키고 다시 정상적인 부팅을 통해, 사용자가 느끼지 못하게?! 혹은 탐지가 어렵게 만든다. 

BootCode는 BIOS에서 해석할 수 있는 16bit 형태로 이루어져 있기때문에 보통 분석하는 PE와는 다르게 어셈코드를 직접 하나하나 분석해야한다. 하지만, BootCode 영역의 크기가 작기 때문에 그렇게 큰 시간이 들진 않는다. 물론, BootCode 영역 밖에 영역을 사용한다면 상당히 긴 분석이 된다. 


다음 코드를 보면 알 수 있뜻이, 하나하나 어셈블리언어들의 행위를 정리한 것을 확인할 수 있다. 해당 부분에 대해서 설명하면 끝도 없으니 패스 (참조 링크에 Forensic-proof에 정상 부팅 bootcode 분석 내용을 보면 많은 도움이 된다.)

여기서 다루고자 하는 내용은 BootCode에서 호출에서 특정 함수를 호출하기 위해 발생하는 인터럽트(Interrupt)에 대해서 정리하려고 한다.

우선 인터럽트란 무엇일까? 인터럽트는 마이크로프로세서(CPU)가 프로그램을 실행하고 있을 때, 입출력 하드웨어 등의 장치나 또는 예외 상황이 발생하여 처리가 필요할 경우에 프로세서에게 알려 처리할 수 있도록 만들 때 사용된다. 본인은 과거 인터럽트는 예외처리시에 사용하기 위해 존재한다고 생각했다. 하지만 그외에 시스템 콜시에도 사용됬다.

사용 목적
  • 예외 처리
  • 시스템 콜

인터럽트는 보통 x86에서 INT 명령어를 사용해 실행된다. 리눅스 커널과 같은 운영체제에서 응용프로갦의 저수준 입출력 함수가 실행되면, 해당 실시간 라이브러리 함수에 의해 소프트웨어 인터럽트가 실행된다. 이를 바로 시스템 콜(System Call)이라고 하며, 함수의 기능에 따라 드라이버를 구별하고 드라이버 내의 함수를 지정함과 동시에 데이터를 레지스터를 통해 넘겨 준다.

그럼 어떤식으로 사용되는지 확인 해보자! (대상은 전에 확인한 Petya로!)

우선 Boot 코드를 처음 확인하면 다음과 같이 인터럽트 플래그(Interupt Flag)를 활성화 시키는 코드를 확인할 수 있다.

lea     sp, ds:7C00h    ; SP = 0x7C00
sti                     ; Interrupt Flag enable
mov     eax, 20h        ; EAX = 0x20
mov     ds:7C93h, dl    ; [0x7C93] = 0x80(HDD)
mov     ebx, 1          ; EBX = 1
mov     cx, 8000h       ; CX = 0x8000

다음과 같이 IF가 활성화작업을 진행한 후 부터 정상적으로 인터럽트가 실행 할 수 있게 된다.  다음은 인터럽트를 이용해 어떤식으로 함수가 실행되는지 코드를 통해 확인해보자.

다음은 비디오 서비스를 호출하게 되는 INT 10h함수로 다음과 같다.

push    bp
mov     bp, sp          ;
                        ; Scroll Window Up (AH = 0x06)
mov     bh, [bp+arg_0]  ; BX = 0x0742(BH = 0x07, BL = 0x42)
xor     cx, cx          ; CX = 0x0000 (CH=0x00, CL= 0x00)
mov     dx, 184Fh       ; DX = 0x184F (DH = 0x18, DL=0x4F)
mov     ax, 600h        ; AX = 0x0600(AH=0x06, AL = 0x00)
                        ; INT 10h function set
int     10h             ; Interrupt !
                        ; Set Cursor Position (AH = 02)
xor     bh, bh          ; BX =0x0020(BH=0x00, BL= 0x20)
xor     dx, dx          ; DX = 0x0000
mov     ah, 2           ; AX = 0x0200(AH=0x02, AL = 0x20)
                        ; INT 10h Function set
int     10h             ; Interrup !
leave
retn


코드를 보면 두개의 인터럽트가 발생하는 것을 확인할 수 있으며, 각각 발생하는 시스템 콜은 다음과 같다.



곧 악성 MBR 내 화면 처리를 하는 코드인 것을 확인할 수 있다.

내가 알기론 10~13까지 아마 시스템 콜로 알고 있는데 확인이 필요함

여튼 이런 식으로 MBR에서는 시스템 콜이 되니, 분석할때 멘붕 하지 말고 하나하나 검색하면서 어떤 행위인지 확인하면 분석이 가능하다. AH와 AL이 뭔지 모르면 레지스트리 공부를 하면 됨! 이상 끝

참고
Wiki : 인터럽트
Wiki : INT 10h

댓글 1개:

  1. casino - Dr.D.
    Casino. Dr.D. specializes in 삼척 출장마사지 casino and hotel gaming, 아산 출장마사지 providing our guests with the most 구미 출장샵 comfortable accommodations in 아산 출장마사지 the industry. As a  Rating: 3.6 · ‎3,397 reviews 삼척 출장안마

    답글삭제