훈훈훈

Mini-100 바이러스 분석 본문

정보보안/악성코드

Mini-100 바이러스 분석

훈훈훈 2018. 10. 30. 03:00

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

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



1) 특징 

  -  .com인 파일을  대상으로 감염 시킨다.

  -  감염된 파일은 100Byte 크기 증가

  -  전위형 바이러스



2) 실습 환경

  -  운영체제 : Windows 7 32bit

  -  분석도구 : MS-DOS DEBUG



3) 감염 대상


   

<감염 대상 - 1>


임의의 값을 입력하여 감염 대상인 "waveLab.txt" 란 파일을 생성했다.

 

<감염 대상 - 2>


"Mini-100" 바이러스는 확장자가 ".com" 대상으로 감염시키기 때문에  

감염 대상파일 확장자를 ".txt" => ".com" 으로 변환했다.


 <감염 대상 - 3>


감염되기 이전 파일의 크기는 8byte 이다.





4) 분석 과정


<분석 과정 - 1>


감염대상이 있는 폴더에서 CMD 창을 킨 후 "debug" 명령을 실행했다.

그 다음 바이러스 소스코드를 붙여넣기 해서 "g" 키를 눌러 실행시켰다.


<분석 과정 - 2>


실행을 시킨 후 감염대상 파일은 "wavelab"의 속성을 확인해보았다.

파일의 크기가 100byte 증가한것을 확인할 수 있다.


이제 바이러스 코드를 처음부터 살펴보자.


<분석 과정 - 3>


위 그림에 나와있는 부분까지 실행한 결과 시작주소는 100, 

그리고 현재 DS = 0B08, ES = 0B08 인것을 알 수 있다.

다음 몇개의 명령어를 더 실행해보자.


<분석 과정 - 4>


위 그림을 보면 REPZ 함수를 통해 Count(CX) 저장된 수 만큼 MOVSB를 반복수행하는 것을 알 수 있다.

이를 통해 바이러스가 감염시킬 파일을 탐색하는 것을 알 수 있다.

그리고 ES=0C08로 바뀐 것을 알 수 있다. 

따라서 MOVSB 명령을 통해 DS:SI(0B08:0100) => ES:SI(0C08:0100) 으로 메모리 내용을 옮기는 것을 알 수 있다.



<분석 과정 - 5>


INT 21h, AH=4Eh 일때 ASCIIZ 문자열에 따라 파일을 찾는다

CX는 파일의 속성을 나타낸다.

DS:DX 는 파일이름이 저장되어 있는 세그먼 오프셋이다.

따라서 "D DS:015E" 명령을 입력해서 찾고있는 파일이름을 확인해보자.


 <분석 과정 - 6>


위 그림에서 덤프된 문자열을 보면 "*.com"을 확인할 수 있다.

따라서 해당 바이러스는 .com 확장자인 모든 파일을 찾고 있는 것을 알 수 있다.



<분석 과정 - 7>


위 그림을 보았을 때 찾는 파일과 일치하는 파일을 찾았을때 CF = 0(캐리 플래그), AX=에러 번호를 확인 했을때  

".com" 확장자를 갖고있는 파일을 찾을 것을 확인할 수 있다.

그리고 그 다음 명령인 JNB를 실행시켰을때 CF = 0 이기 때문에 012D 주소로 점프할 것이다.


<분석 과정 - 8>


위 그림을 보면 INT 21h , AH = 3Dh 이므로 파일을 오픈하는 것을 알 수 있다. 

AL은 파일의 엑세스 모드를 의미하고 각 비트마다 의미가 다르다.


 1) 000 : 읽기 엑세스

 2) 001 : 쓰기 엑세스

 3) 010 : 읽기/쓰기 엑세스


AL=02h 이기 때문에 따라서 읽기/쓰기 엑세스 모드인 것을 알 수 있다.

그리고 DS:DX 는 파일이름이 저장되어 있는 세그먼트 오프셋이므로 "D DS:09E" 명령을 입력해서 확인해보자.


<분석 과정 - 9>


"D DS:9E" 명령을 입력하고 덤프된 문자열을 확인했을때 "WAVELAB.COM" 이라는 문자열을 확인할 수 있다.


<분석 과정 - 10>


덤프를 확인했으므로 다음 명령어를 실행하자, 그러면 함수가 성공적으로 실행된 것을 확인할 수 있다.


 1) 함수 성공시

   - CF = 0, AX = 파일 핸들

 2) 함수 실패시 

   - CF = 1, AX = 에러 번호 


이제 그 다음 코드인 "XCHG BX,AX" 부터 분석하기 이전에 바이러스 제작자가 XCHG 명령을 쓴 이유를 알아보자.

해당 바이러스는 100byte 이고 제작자는 최대한 바이트 수를 줄이기 위해 노력했을 것이다.

따라서 XCHG 명령을 사용함으로서 단지 1byte만을 사용함으로서 두 변수를 체인지 하는 효과를 볼 수 있다.


<분석 과정 - 11>


위 그림에서 INT 21을 호출하는 것을 알 수 있다. 

AX = 3Fh 이므로 파일의 내용을 읽는 함수인 것을 알 수 있다. 

해당 인터럽트에 대해 자세히 살펴보면


- 호출 

 BX = 파일 핸들

 CX = 읽을 바이트 개수

 DS:DX = 읽어 들인 파일의 내용을 저장할 버퍼의 세그먼트와 오프셋


- 복귀

 1) 함수 성공 시

  CF = 0

  AX = 읽은 바이트 수

 2) 함수 실패 시

  CF = 1

  AX = 에러 번호


이러한 동작으로 실행되는 것을 확인할 수 있다.

이제 함수가 실행됬는지 확인해보자.


<분석 과정 - 12>


위 그림을 보았을때 해당 함수는 성공적으로 실행된 것을 알 수 있다.

AX = 006Ch(108byte) 이므로 바이러스가 "wavelab.txt" 파일을 감염됬을때의 바이트 수와 같다.


<분석 과정 - 13>


위 그림을 보면 CWD 명령을 실행하는 것을 볼 수 있다.

CWD(Convert Word to Double word)는 부호가 있는 정수  표현에서 AX 워드 정보를 

DX:AX이 더블 워드형으로 확장하는 기능을 한다.

따라서 DX = 0000 이 되는 것을 알 수 있다.


그 다음 INT21을 호출하는 것을 볼 수 있다.

AX=42h 이므로 파일 포인터 설정하는 함수인 것을 알 수 있다.


 호출     AH = 42h

AL = 00h : 파일 시작에서 부터

       01h : 현재 포인터부터

       02h : 파일의 끝에서부터

BX = 파일 핸들 

CX = 파일 포인터를 옮길 거리의 상위 워드

DX = 파일 포인터를 옮길 거리의 하위 워드


이 과정을 거치면 바이러스가 파일의 모든 내용을 읽어 파일 포인터가 끝으로 이동된 것을 알 수 있다.


<분석 과정 - 14>


위 그림을 보면 함수가 성공한 것을 알 수 있다.

 

  복귀   

1) 함수 성공

   CF = 0

   DX = 옮겨진 파일 포인터의 상위 워드

   AX = 옮겨진 파일 포인터의 하위 워드

2) 함수 실패

   CF = 1

   AX = 에러 번호



이제 그 다음 명령어를 실행시켜 보자.


<분석 과정 - 15>

위 그림을 보면 INT 21을 호출하는 것을 볼 수 있다.

AX = 40h 이므로 파일 또는 장치 쓰기 함수인 것을 알 수 있다.


<분석 과정 - 16>


위 그림을 보면 함수가 성공한 것을 알 수 있다.

AX 에는 감염 된 "wavelab.com"의 바이트 수 만큼 저장되어있는 것을 알 수 있다.


<분석 과정 - 17>


위 그림을 보면 INT 21을 호출하는 것을 알 수 있다.

AX = 3Eh 이므로 오픈되어있는 파일을 닫는 함수인 것을 알 수 있다.

 

 호출    AH = 3Eh

     BX = 파일 핸들


 복귀    

  1) 함수 성공

     CF = 0

     AX = 파일 핸들

  2) 함수 실패

     CF = 1

     AX = 에러 번호


이제 함수가 실행에 성공했는지 알아보기 위해 다음 명령어를 실행시켜보자.


<분석 과정 - 18>

함수가 실행에 성공한 것을 알 수 있다.





  



Comments