'악성코드분석'에 해당되는 글 1건

  1. 2010.04.23 [Malware Analysis] Backdoor.Hacarmy 악성코드 분석

0x00 목 

실제 악성코드 샘플(Backdoor.Hacarmy)을 분석함에 있어서 동적 분석 및 정적 분석을 통하여 악성코드의 목적 및 작동 방식에 대해 이해한다.

0x01 사용 툴

① 바이너리 분석 도구

 - dumpbin : 프로그램의 import / export 엔트리 정보 및 section table 등의 정보를 출력

 - PEiD : PE파일의 개략적인 구조 및 작성 프로그램, 패킹 여부와 패킹의 종류 등에 대한 정보 출력

 - Stud_PE : PE 파일의 구조 분석

 - upx : 프로그램을 UPX 포멧으로 패킹 및 언패킹하기 위한 명령어

 

② 동적분석 도구

 - Winalysis : 윈도우 스냅샷을 이용하여 악성코드 실행 전/후의 파일, 레지스트리, 서비스 등의 변화를 검사

 - FileMon : 지정한 프로세스가 사용하는 파일을 보여주는 프로그램

 - RegMon : 지정한 프로세스가 사용하는 레지스트리의 목록을 보여주는 프로그램

 - TCPView : 사용되어지는 포트와 해당 포트를 사용하는 프로그램을 매핑해서 보여주는 프로그램

 - Process Explorer : 각 프로세스별 좀 더 자세한 정보 제공

 

③ 정적분석 도구

 - OllyDbg : 대표적인 디버거로 프로그램의 구조나, 실행시 레지스터나 스택의 상태 등을 분석시 사용


0x02 샘플 악성코드 정보
샘플 악성코드를 virus total(http://www.virustotal.com/)을 이용하여 분석요청을 하면 다음과 같은 결과를 얻을 수 있다.


0x03 동적 분석

① 바이너리 검사

먼저 dumpbin 명령어를 이용하여 Backdoor.Hacarmy.D 악성코드(이하 Hacarmy)헤더 정보와 import / export 엔트리 정보를 알아본다. import 되어 있는 DLL 파일 및 함수에 대한 정보를 보면 아래와 같다.

Dump of file Webcam Shots.scr

File Type: EXECUTABLE IMAGE

  Section contains the following imports:

    KERNEL32.DLL

                40E8F0 Import Address Table

                     0 Import Name Table

                     0 time date stamp

                     0 Index of first forwarder reference

 

                   0  LoadLibraryA

                   0  GetProcAddress

                   0  ExitProcess

    ADVAPI32.DLL

                40E900 Import Address Table

                     0 Import Name Table

                     0 time date stamp

                     0 Index of first forwarder reference

 

                   0  RegCloseKey

    CRTDLL.DLL

                40E908 Import Address Table

                     0 Import Name Table

                     0 time date stamp

                     0 Index of first forwarder reference

 

                   0  atoi

    SHELL32.DLL

                40E910 Import Address Table

                     0 Import Name Table

                     0 time date stamp

                     0 Index of first forwarder reference

 

                   0  ShellExecuteA

    USER32.DLL

                40E918 Import Address Table

                     0 Import Name Table

                     0 time date stamp

                     0 Index of first forwarder reference

 

                   0  CharUpperBuffA

    WININET.DLL

                40E920 Import Address Table

                     0 Import Name Table

                     0 time date stamp

                     0 Index of first forwarder reference

 

                   0  InternetOpenA

    WS2_32.DLL

                40E928 Import Address Table

                     0 Import Name Table

                     0 time date stamp

                     0 Index of first forwarder reference

 

                   0  bind

  Summary

 

        3000 .rsrc

        9000 UPX0

        2000 UPX1

특이사항으로 각 DLL 별로 하나의 임포트 엔트리만을 갖는 것이 많은 것을 알 수 있으며, 섹션 요약정보를 보면 프로그램의 코드가 올라가는 .text 등의 섹션이 보이지 않고 UPX0, UPX1이라는 섹션이 보이는 것을 알 수 있다.

PEiD를 이용하여 Hacarmy의 바이너리 정보를 알아보면 다음과 같다.

Hacarmy 악성코드의 경우 UPX로 패킹되어 있는 것을 알 수 있다. 패킹은 프로그램의 크기를 줄이거나 프로그램의 분석을 어렵게 하기위해 프로그램을 암호화할 목적으로 사용되며, UPX(Ultimated Packer for eXecutables)의 경우 프로그램의 크기를 줄이기 위한 용도로 사용된다. upx 명령어를 이용하여 Hacarmy의 정보를 확인하면 아래와 같이 압축되어 있는 것을 볼 수 있다.


unpacking 실행

upx 명령어를 이용하여 unpacking을 해보자.

(구 버젼의 upx를 이용할 경우 unpacking이 되지 않았으며 본인의 경우 최신 버젼인 3.04 버젼을 이용하여 진행)

unpacking된 파일을 이번에는 Stud_PE 프로그램을 이용하여 분석해 보자. Signature 탭을 보면 HaCarmy 악성코드가 lcc-win32로 컴파일된 프로그램인 것을 알 수 있다.

Stud_PE Funstions 탭에서 import된 함수들의 목록을 살펴보자.


KERNEL32.DLL

             DeleteFileA  ord:0 rva: 00006280

             ExitProcess  ord:0 rva: 00006284

             ExpandEnvironmentStringsA  ord:0 rva: 00006288

             FreeLibrary  ord:0 rva: 0000628C

             GetCommandLineA  ord:0 rva: 00006290

             GetLastError  ord:0 rva: 00006294

             GetModuleFileNameA  ord:0 rva: 00006298

             GetModuleHandleA  ord:0 rva: 0000629C

             GetProcAddress  ord:0 rva: 000062A0

             GetSystemDirectoryA  ord:0 rva: 000062A4

             CloseHandle  ord:0 rva: 000062A8

             GetTempPathA  ord:0 rva: 000062AC

             GetTickCount  ord:0 rva: 000062B0

             GetVersionExA  ord:0 rva: 000062B4

             LoadLibraryA  ord:0 rva: 000062B8

             CopyFileA  ord:0 rva: 000062BC

             OpenProcess  ord:0 rva: 000062C0

             ReleaseMutex  ord:0 rva: 000062C4

             RtlUnwind  ord:0 rva: 000062C8

             CreateFileA  ord:0 rva: 000062CC

             Sleep  ord:0 rva: 000062D0

             TerminateProcess  ord:0 rva: 000062D4

             TerminateThread  ord:0 rva: 000062D8

             WriteFile  ord:0 rva: 000062DC

             CreateMutexA  ord:0 rva: 000062E0

             CreateThread  ord:0 rva: 000062E4

            

ADVAPI32.DLL

             GetUserNameA  ord:0 rva: 000062FC

             RegDeleteValueA  ord:0 rva: 00006300

             RegCreateKeyExA  ord:0 rva: 00006304

             RegCloseKey  ord:0 rva: 00006308

             RegQueryValueExA  ord:0 rva: 0000630C

             RegSetValueExA  ord:0 rva: 00006310

            

CRTDLL.DLL

             __GetMainArgs  ord:0 rva: 0000636C

             atoi  ord:0 rva: 00006370

             exit  ord:0 rva: 00006374

             free  ord:0 rva: 00006378

             malloc  ord:0 rva: 0000637C

             memset  ord:0 rva: 00006380

             printf  ord:0 rva: 00006384

             raise  ord:0 rva: 00006388

             rand  ord:0 rva: 0000638C

             signal  ord:0 rva: 00006390

             sprintf  ord:0 rva: 00006394

             srand  ord:0 rva: 00006398

             strcat  ord:0 rva: 0000639C

             strchr  ord:0 rva: 000063A0

             strcmp  ord:0 rva: 000063A4

             strncpy  ord:0 rva: 000063A8

             strstr  ord:0 rva: 000063AC

             strtok  ord:0 rva: 000063B0

            

SHELL32.DLL

             ShellExecuteA  ord:0 rva: 00006274

            

USER32.DLL

             CharUpperBuffA  ord:0 rva: 000062F0

            

WININET.DLL

             InternetCloseHandle  ord:0 rva: 00006258

             InternetGetConnectedState  ord:0 rva: 0000625C

             InternetOpenA  ord:0 rva: 00006260

             InternetOpenUrlA  ord:0 rva: 00006264

             InternetReadFile  ord:0 rva: 00006268

            

WS2_32.DLL

             WSACleanup  ord:0 rva: 0000631C

             listen  ord:0 rva: 00006320

             ioctlsocket  ord:0 rva: 00006324

             inet_addr  ord:0 rva: 00006328

             htons  ord:0 rva: 0000632C

             getsockname  ord:0 rva: 00006330

             socket  ord:0 rva: 00006334

             gethostbyname  ord:0 rva: 00006338

             gethostbyaddr  ord:0 rva: 0000633C

             connect  ord:0 rva: 00006340

             closesocket  ord:0 rva: 00006344

             bind  ord:0 rva: 00006348

             accept  ord:0 rva: 0000634C

             __WSAFDIsSet  ord:0 rva: 00006350

             WSAStartup  ord:0 rva: 00006354

             send  ord:0 rva: 00006358

             select  ord:0 rva: 0000635C

             recv  ord:0 rva: 000063603000 .text

함수의 내용을 살펴봤을때 프로세스, 파일, 레지스트리 생성과 관련된 함수 및 네트워크 통신과 관련된 함수명을 볼 수 있다.

 

Winalysis를 이용한 스냅샷 변경 여부 점검

윈도우의 파일 및 레지스트리. 서비스등의 주요 자원에 대한 스냅샷을 만든 후 특정 이벤트 발생 후 일어나는 변화에 대해 쉽게 알아 볼 수 있는 도구인 Winalysis를 이용하여 Hacarmy 실행 후 어떤 변화가 일어나는지 살펴보도록 한다.

Winalysis를 실행하여 악성코드 실행 전 스냅샷을 작성한 뒤 악성코드를 실행하면 해당 파일은 자동으로 삭제되면서 아래와 같이 "C:\WINDOWS\System32\ZoneLookup.exe"라는 파일이 생성되는 것을 볼 수 있다.


Process explorer를 이용한 프로세스 점검

윈도우의 작업관리자 보다 프로세스에 대해 좀 더 자세한 정보를 제공해주는 Process Explorer를 이용하여 현재 실행되고 있는 프로세스 정보들을 살펴본다.

프로세스 정보를 보면 ZoneLookup.exe라는 프로세스가 새로 생성된 것을 볼 수 있으며, 클릭하면 현재 ZoneLookup.exe 프로세스가 사용하는 핸들(File, Key, Semaphore..)들에 대한 정보를 볼 수 있다.

 

Filemon을 이용한 악성코드의 동작 점검

이번에는 특정 프로세스가 사용하고 있는 파일에 대해서 살펴볼 수 있는 도구인 Filemon을 이용하여 현재 ZoneLookup.exe 프로세스가 사용하는 파일에 대한 정보를 보면 "C:\Documents and Settings\Administrator\Local Settings\Temporary Internet Files\Content.IE5\index.dat" 파일에 대하여 30초 단위로 어떤 정보를 요청하는 것을 볼 수 있다.

 

TCPView를 이용한 악성코드의 네트워크 사용여부 점검

TCPView를 이용하여 Hacarmy가 현재 네트워크 통신을 하고 있는지 여부를 점검한다. 점검 결과 특정 IP TCP연결을 하는 것을 볼 수 있다.


WireShark를 이용한 네트워크 통신 내용 점검

좀 더 자세한 네트워크 통신 내용을 보기위해 Wireshark를 이용하여 현재 악성코드가 접속하는 곳과 어떤 통신을 하고 있는지 살펴본다.

①번에서 볼 수 있듯이 특정 194.109.206.107 IP로 접속을 시도하는 것을 볼 수 있으며, 194.109.206.107 서버는 IRC 채팅 서버인 것을 확인할 수 있다.

0x04 정적분석

① 실행파일 생성 및 실행 부분

언패킹된 악성코드를 올리디버거를 이용하여 로딩한다. 프로그램의 시작 부분을 살펴보면 아래와 같은 내용을 찾을 수 있다.

GetModuleFileName 함수를 이용하여 악성코드가 실행된 경로와 악성코드 파일명을 읽어오는 것을 알 수 있으며  GetSystemDirectory 함수를 이용하여 시스템 디렉토리(C:\WINDOWS\system32)의 경로를 읽어오는 것을 알 수 있다.

위와 같이 윈도우 시스템 디렉토리에 ZoneLookup.exe라는 파일을 생성하는 것을 볼 수 있다.

이 후 위와 같이 ShellExecute 함수를 이용하여 ZoneLookup.exe 파일을 실행시키는 것을 볼 수 있으며, ExitProcess를 호출하여 종료하게 된다.

② 네트워크 연결 부분

아래 코드는 특정 호스트에 접근하는 것을 보여준다. 일단 마지막 명령어에서 볼 수 있듯이 전체적으로 무한 루프 구조를 띄고 있다.

InternetGetConnectedState 함수를 이용하여 현재 호스트가 인터넷에 연결되어 있는지 여부를 검사한 뒤 결과값이 FALSE 이면 30초 동안 Sleep 한다. 이후 다시 코드의 처음으로 돌아가는 것을 알 수 있다. 만약 검사 결과가 TRUE일 경우 결론적으로 004028B1 위치에 있는 함수를 호출하게 된다. 이 때 2개의 파라미터를 함께 전송하게 되며, 첫번째 스택에 PUSH되는 값은 g.hackarmy.tk라는 문자열이 저장되는 것을 볼 수 있다. 두번째 스택에 PUSH 되는 값은 6667로 접속하려는 곳의 포트번호라는 것을 유추할 수 있다.

0x05 해결방법

지금까지 유추한 내용을 바탕으로 Backdoor. Hacarmy 악성코드의 행동을 결론지으면 다음과 같다.

C:\WINDOWS\system32 폴더에 ZoneLookup.exe 파일을 생성한다.

ZoneLookup.exe 파일을 실행하며 프로세스를 확인하면 ZoneLookup.exe라는 프로세스가 동작 중인 것을 확인

   할 수 있다.

③ 감염된 호스트의 특정한 포트를 오픈한 뒤 IRC 서버에 접속하여 명령이 전달대기를 대기한다.

 

따라서 해당 악성코드를 해결하기 위한 방법은 다음과 같다.

ZoneLookup.exe 프로세스를 종료시킨다.

C:\WINDOWS\system32 폴더에 ZoneLookup.exe 파일을 찾아서 삭제해 준다.

 

                                                                                                    +---------------------------------+
                                                                                                    | Infinite Flow..                              |
                                                                                                    | mail : geekspark@gmail.com         |
                                                                                                    | Blog : http://sinun.tistory.com       |
                                                                                                    | twitter : @unpacker                      |
                                                                                                    | CISSP                                        |
                                                                                                    +----------------------------------+

저작자 표시 비영리 변경 금지
신고
Posted by By. PHR34K

티스토리 툴바