1. 개요 악성코드는여러분류로나누어볼수가있다. 이중일반사용자의입장에서 악성코드 라는단어보다친숙한 바이러스 가있다. 사실필자도보안을공부하기이전에는 악성코드 라는단어는아예들어보지못했고, 대신 바이러스 라는단어로모든악성코드를지칭했었다. 바이러스는악성코드분류의한종류로 스스로를

Similar documents
Deok9_PE Structure

Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3

*2008년1월호진짜

슬라이드 1

07_alman.hwp

ActFax 4.31 Local Privilege Escalation Exploit

MODBUS SERVO DRIVER( FDA7000 Series ) STANDARD PROTOCOL (Ver 1.00) 1

chap 5: Trees

SRC PLUS 제어기 MANUAL

Microsoft Word - building the win32 shellcode 01.doc

DLL Injection

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202839C1D6C2F7207E203135C1D6C2F >

BMP 파일 처리

-. Data Field 의, 개수, data 등으로구성되며, 각 에따라구성이달라집니다. -. Data 모든 의 data는 2byte로구성됩니다. Data Type는 Integer, Float형에따라다르게처리됩니다. ( 부호가없는 data 0~65535 까지부호가있는

Tablespace On-Offline 테이블스페이스 온라인/오프라인

lecture4(6.범용IO).hwp

PowerPoint Presentation

슬라이드 1

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

API 매뉴얼

PowerPoint 프레젠테이션

목 차 1. 개요 2. PE(Portable Executable) 이란? 3. IMAGE_DOS_HEADER 4. IMAGE_NT_HEADER 1) IMAGE_FILE_HEADER 2) IMAGE_OPTIONAL_HEADER 3) IMAGE_DATA_DIRECTORY

목차 1. 개요 배경 파일정보 상세분석 SMB 취약점공격흐름 특징적인행위 대응

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

목차 ⓵ VA and RVA 4p. ⓶ RVA to RAW 5p. ⓷ PE 7p. PE의개념. PE Header가생기는과정. PE의필요성. ⓷ DOS Header 8p. e_magic e_lfanew ⓸ DOS Stub 9p. 1

[ 악성코드상세분석보고서 ] SK 커뮤니케이션즈해킹관련상세분석보고서 nateon.exe 대응 2 팀

1. Execution sequence 첫번째로 GameGuard 의실행순서는다음과같습니다 오전 10:10:03 Type : Create 오전 10:10:03 Parent ID : 0xA 오전 10:10:03 Pro

<4D F736F F F696E74202D C61645FB3EDB8AEC7D5BCBA20B9D720C5F8BBE7BFEBB9FD2E BC8A3C8AF20B8F0B5E55D>

제목을 입력하세요

Secure Programming Lecture1 : Introduction

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

2) 활동하기 활동개요 활동과정 [ 예제 10-1]main.xml 1 <LinearLayout xmlns:android=" 2 xmlns:tools="

PowerPoint 프레젠테이션

Microsoft PowerPoint - ch07 - 포인터 pm0415

11장 포인터

제목

Microsoft PowerPoint - polling.pptx

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

PowerPoint 프레젠테이션

제1장 Unix란 무엇인가?

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C4C656D70656C2D5A69762E637070>

[8051] 강의자료.PDF

Microsoft PowerPoint - chap06-2pointer.ppt

10.

Win-Trojan/Scar U 악성코드분석보고서 Written by extr Win-Trojan/Scar U 악성코드분석보고서 Page 1 / 14

슬라이드 1

<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A638C0CFC2F72E BC8A3C8AF20B8F0B5E55D>

PowerPoint 프레젠테이션

The Pocket Guide to TCP/IP Sockets: C Version

$ret = ""; $socket = fsockopen(" ", 8888, $errno, $errstr, 100); fgets( $socket, 50); fgets( $socket, 50); $ret.= fgets( $socket, 50); $

InsertColumnNonNullableError(#colName) 에해당하는메시지출력 존재하지않는컬럼에값을삽입하려고할경우, InsertColumnExistenceError(#colName) 에해당하는메시지출력 실행결과가 primary key 제약에위배된다면, Ins

Microsoft PowerPoint - es-arduino-lecture-03

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202834C1D6C2F7207E2038C1D6C2F729>

Reusing Dynamic Linker For Exploitation Author : Date : 2012 / 05 / 13 Contact : Facebook : fb.me/kwonpwn

금오공대 컴퓨터공학전공 강의자료

untitled

Lab 4. 실습문제 (Circular singly linked list)_해답.hwp

(Asynchronous Mode) ( 1, 5~8, 1~2) & (Parity) 1 ; * S erial Port (BIOS INT 14H) - 1 -

PowerPoint Template

Microsoft Word - FS_ZigBee_Manual_V1.3.docx

슬라이드 1

vi 사용법

2015 CodeGate 풀이보고서 김성우 1. systemshock strcat(cmd, argv[1]); 에서스택버퍼오버플로우가발생합니다

이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다. 2

Lab 3. 실습문제 (Single linked list)_해답.hwp

슬라이드 1

Mango-E-Toi Board Developer Manual

Malware Analysis

Microsoft PowerPoint - Lecture_Note_7.ppt [Compatibility Mode]

Chapter 4. LISTS

hlogin7

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

#WI DNS DDoS 공격악성코드분석

MPLAB C18 C


디지털포렌식학회 논문양식

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

Chapter #01 Subject

CKKeyPro 적용가이드

Index Process Specification Data Dictionary

Microsoft PowerPoint - lab14.pptx

2015 년정보보호학과졸업작품보고서 USB 를이용한 System Lock 및 File Security Service 팀명 : Team IU ( Intelligent USB ) 지도교수 : 양정모교수님 조장 : 조상일 유승우 조한슬 중부대학교정보보호학과

3.20 테러 악성코드바이너리분석 손충호 (StolenByte) WOWHACKER Group 해당문서는 WOWHACKER Group 의문서이므로, 무단도용및수 정및변조는할수없습니다. 페이지 1 / 20

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning

ATmega128

1장. 유닉스 시스템 프로그래밍 개요

Microsoft PowerPoint - ch10 - 이진트리, AVL 트리, 트리 응용 pm0600

<4D F736F F D20B9D9C0CCB7B5B9D9C0CCB7AFBDBA5FBCF6C1A42E646F63>

QYQABILIGOUI.hwp

C프로-3장c03逞풚

Android Master Key Vulnerability

#HNS-WI 북한의심 APT 공격에대한 Kaspersky 의분석정리

Frama-C/JESSIS 사용법 소개

버퍼오버플로우-왕기초편 10. 메모리를 Hex dump 뜨기 앞서우리는버퍼오버플로우로인해리턴어드레스 (return address) 가변조될수있음을알았습니다. 이제곧리턴어드레스를원하는값으로변경하는실습을해볼것인데요, 그전에앞서, 메모리에저장된값들을살펴보는방법에대해배워보겠습

<41736D6C6F D20B9AEBCADBEE7BDC42E687770>

02.Create a shellcode that executes "/bin/sh" Excuse the ads! We need some help to keep our site up. List Create a shellcode that executes "/bin/sh" C

Microsoft Word - src.doc

Transcription:

Malware Analysis Report Mad Angel 2016.09.17 By Kali-KM

1. 개요 악성코드는여러분류로나누어볼수가있다. 이중일반사용자의입장에서 악성코드 라는단어보다친숙한 바이러스 가있다. 사실필자도보안을공부하기이전에는 악성코드 라는단어는아예들어보지못했고, 대신 바이러스 라는단어로모든악성코드를지칭했었다. 바이러스는악성코드분류의한종류로 스스로를복제하여악의적목적을수행하는악성소프트웨어 (Wiki) 라는의미를가지고있다. 컴퓨터바이러스가아닌우리가알고있는메르스 (MERS) 나감기와유사하다. 바이러스에감염된사람으로부터다른사람도감염시키듯이, 컴퓨터바이러스는감염된파일을실행시키면다른파일을감염시킨다. 컴퓨터바이러스는동작방식에따라차이가있겠지만, 일반적으로악의적인코드를파일에삽입하여공격자가지정한악의적인행동을수행한다음에서야원래의정상적인동작을수행하도록한다. 그렇기에일반사용자의입장에선모든파일이잘실행되기때문에모를수도있다. 하지만이미바이러스가실행된사용자 PC 는대부분속도가현저히저하되거나, CPU 사용량이크게증가하는등으로사용자의 PC 사용을방해한다. 이번에분석하고자하는컴퓨터바이러스는 Mad Angel 로해당악성코드의동작방식과감염방식등에대하여알아보자.

2. 분석정보 해당악성코드에대한정보는아래와같다. 분석중필자가가진샘플이감염된파일인것을알수가있었다. 대신드롭되는 Serverx.exe 가감염된파일에삽입된부분의코드와유사한코드라는점과, 감염된파일이다른파일을감염시키는동작을수행하는중해당프로세스를강제로종료하면 Serverx.exe 가실행되어감염을재개하는점으로미루어보아실질적으로숙주와같다는것을알수있었다. Sample #1 File Name sample.exe ( 임의의파일명 ) File Size 82,718 bytes MD5 BA2F39EFEEDBE9BC77F063A8385B34B3 Dropped #1 File Name File Size MD5 Serverx.exe 8,591 bytes F5E7E34E0078FBA7C8BAFD971641E369 아래그림과같이 sample.exe 를실행시켰을때두개의 sample.exe 프로세스가존재하고있는것을확인할수있다. 이중부모프로세스 (PID:2540) 가악성동작 ( 파일감염 ) 을수행하는것이며, 자식프로세스 (PID:2548) 는감염된파일의원래동작을수행하는것이다. 감염된파일인 sample.exe 를실행할경우바이러스에의해삽입된악성동작을수행하는부분에서루프를돌게된다. 그러므로 MadAngel 은파일이원래의동작을수행하는자식프로세스를생성한다.. [ 그림 ] 감염된샘플파일 감염행위를하고있는 sample.exe 프로세스를강제로종료시키면아래그림과같이 Severx.exe 가생성되는것을확인할수있다. 하지만여기서의문을가져야할점은바로 ctfmon.exe 프로 세스의자식프로세스로생성되었다는점이다.

[ 그림 ] 다른프로세스의자식프로세스로생성된 Serverx.exe ctfmon.exe 는해당샘플을실행하기이전부터존재하고있던정상적인프로세스이다. 그렇다면어떻게 ctfmon.exe 가 Serverx.exe 를자식프로세스로가질수있을까? 이는 sample.exe 가동작하면서임의의프로세스에 Code Injection 을하기때문이다. Injection 되는코드는감염행위를하고있는프로세스가종료되면, Serverx.exe 를다시실행시킨다. 결국 Serverx.exe 프로세스를종료시켜도다시 Serverx.exe 가실행된다. 감염된샘플과 Serverx.exe 는 Serverx.exe 를자동실행레지스트리에등록하여 PC 를재부팅하여도다시감염을실행하도록한다. [ 그림 ] 자동실행에등록된 Serverx.exe

3. 상세분석 MadAngel 을실행할경우아래와같이뮤텍스를통해이미 MadAngel 이동작중인지확인한다. 뮤텍스의이름이 Angry Angel v3.0 인것을알수있으며, 동작중이라면감염동작을수행하지 않고파일원래의기능이동작하도록한다. [ 그림 ] 뮤텍스생성 만약동작중이지않다면, 실행된 MadAngel 은 WinExec API 를통해정상동작을수행하는자기 자신을실행한다. 실행된또다른자기자신은위와마찬가지로뮤텍스를확인하고, 뮤텍스가이미 존재하기때문에정상동작을수행하는루틴으로가게된다. [ 그림 ] 파일실행 악성코드는 System32 폴더에 Serverx.exe 라는파일을드롭한다. Serverx.exe 는 MadAngel 의핵심코드가들어있는실행파일로, 실질적으로 Serverx.exe 가감염될코드와같다. 드롭후 Serverx.exe 를자동실행레지스트리에등록하여 PC 가종료되더라도다시부팅될때감염동작을수행하도록한다. [ 그림 ] Serverx.exe 생성 [ 그림 ] 자동실행레지스트리등록 아래와같이새로운스레드를생성한다. 생성된스레드는 RegNotifyChangeKeyValue API 를통해 위에서등록한레지스트리의값이삭제될때까지기다린다. 만약해당값에변화가생기면다시 레지스트리에등록한다.

[ 그림 ] 스레드생성 자신에게스레드를생성한뒤 FindWindow 를통해임의의윈도우를탐색하고해당윈도우에 대한프로세스 ID 를가져온다. 그리고 OpenProcess API 를통해해당프로세스의핸들을얻는다. [ 그림 ] 프로세스핸들얻기 얻어온프로세스핸들에대해 VirtualAllocEx 를통해메모리공간을할당해준다. 할당한메모리공간에새로운데이터를기록을해주는것을확인할수있다. 메모리에데이터를기록한후현재프로세스의 ID 를가져온다. 이는현재프로세스 ID 를 CreateRemoteThread 를통해생성할스레드의인자로, 넘겨받은프로세스 ID 가종료되는지확인하기위함이다. CreateRemoteThread 를통해데이터를기록한메모리공간을실행하는스레드를생성해준다. [ 그림 ] 코드인젝션

위의동작을수행한뒤파일감염을시작한다. 우선 FindFirstFile 과 FindNextFile API 를통해각 폴더를탐색한다. 그리고폴더에있는파일의이름에서끝의네글자가아래와같이.exe 나.scr 인지확인한다. 이두확장자가아닐경우감염시키지않는다. [ 그림 ] 파일확장자비교 감염에사용된코드를디컴파일하면아래와같은결과를얻을수있다. FileInfection() data = f.read(0x1000); pdos = &data; pnt = pdos + pdos.lfanew; psec = pnt + 0xf8; NumberofSection = pnt+6; //pdos + 0x3c for(int i=0; i<numberofsection; i++) psec += 0x28; // Find a Last Section if(pnt.addressofentrypoint > psec.rva) tmp = pnt.addressofentrypoint - psec.rva + psec.pointertorawdata; SetFilePointer(hFile, tmp, FILE_BEGIN); ReadFile(hFile, Buffer:data-4, size:4); psec.characteristics = psec.characteristics 0xe0000000; FileEndPoint = SetFilePointer(hFile, 0, FILE_END); if(fileendpoint == -1) return; psec.sizeofrawdata = FileEndPoint + 0x118f - psec.pointertorawdata; if(psec.sizeofrawdata > psec.virtualsize) dworigvirtualsize = psec.virtualsize; psec.virtualsize = psec.sizeofrawdata;

calc = (pnt.sectionalignment - 1); /* 이크기만큼 SizeofImage 에더함 */ pnt.sizeofimage += ((psec.virtualsize + calc) & NOT(calc)) - ((dworigvirtualsize + calc) & NOT(calc)); Orig.AddressofEntrypoint = pnt.addressofentrypoint; pnt.addressofentrypoint = psec.rva + FileEndPoint - psec.pointertorawdata; MalCode[0x1B] = Orig.AddressofEntrypoint + pnt.imagebase; /* Write a OEP */ WriteFile(hFile, MalCode, size:0x118f); /* Write a MalData to FileEndPoint */ SetFilePointer(hFile, 0, FILE_BEGIN); WriteFIle(hFile, pdos, size:0x1000); /* Write a new pe header */ 위와같은방식으로파일이감염되면아래와같은구조를띄게된다. 기존의 AddressofEntrypoint 에 ImageBase 를더한값 (EP) 가덧붙여지는악성코드의 0x1b 지점에 기록되어, 감염되기이전의 AddressofEntrypoint 를알수있다. [ 그림 ] 감염전후파일구조비교 다음표는임의의샘플의감염전후 PE 구조차이다. 감염전 File Size 0x2000 0x318F AddressofEntrypoint 0x1000 0x6200 SizeofImage 0x6000 0x8000 LastSection.VirtualSize 0x1000 0x238F 감염후

LastSection.SizeofRawData 0x400 0x238F LastSection.Characteristics 0x50000040 0xF0000040

4. 진단및치료 해당샘플의경우다형성을띄고있지않다. 그렇기에진단이나치료에있어상대적으로어렵지않다. 아래바이너리는감염된두파일에덧붙여진코드를나타낸다. 코드에있어다른부분은 0x1B 부터 4 bytes 만다른것을확인할수있으며, 여기에있는값은감염되기이전의 EP 값이다. 따라서이를토대로진단코드를선정할수있다. [ 그림 ] 감염된파일바이너리비교 우선위바이너리를확인하기전에파일의특징적인면이있다. 바로감염된파일의 AddressofEntrypoint 가덧붙여진코드의첫지점 ( 상 :0x26200, 하 :0x2B200) 을가리킨다는것이다. 이와함께해당지점에서파일의끝 (EOF) 까지의크기가 0x118F 다. 따라서 EOF 0x118F 와 AddressofEntrypoint 가가리키는 Offset 이동일한위치가된다. 이를코드로짜면아래와같다. BOOL FirstDetection(HANDLE hfile) DWORD lpnumberofbytesread; DWORD NumberofSections; DWORD AddressofEntrypoint; DWORD dwsize = GetFileSize(hFile, &dwsize); DWORD CheckOffset = dwsize - 0x118f; PVOID lpaddr = VirtualAlloc(0, 0x1000, MEM_COMMIT, PAGE_READWRITE); ReadFile(hFile, lpaddr, 0x1000, &lpnumberofbytesread, 0); pdos = (PIMAGE_DOS_HEADER)lpAddr; pnt = (PIMAGE_NT_HEADERS)(pDos->e_lfanew + (BYTE *)pdos); pfile = (PIMAGE_FILE_HEADER)(0x4 + (BYTE *)pnt); poption = (PIMAGE_OPTIONAL_HEADER)(0x18 + (BYTE *)pnt); psection = (PIMAGE_SECTION_HEADER)(pFile->SizeOfOptionalHeader + (BYTE *)poption); AddressofEntrypoint = poption->addressofentrypoint; NumberofSections = pfile->numberofsections; for (int i = 0; i < NumberofSections; i++)

if (AddressofEntrypoint > psection->virtualaddress && AddressofEntrypoint < (psection->virtualaddress + psection->misc.virtualsize)) EPOffset = AddressofEntrypoint - psection->virtualaddress + psection- >PointerToRawData; psection++; if (CheckOffset == EPOffset) //printf("checkoffset = 0x%X, EPOffset = 0x%X, EP_VA = 0x%X\n", CheckOffset, EPOffset, AddressofEntrypoint); return TRUE; return FALSE; [ 코드 ] 선진단코드 위코드를통해선진단을하여 1 차분류를한다. 조건에부합한파일에다시진단을하여핵심코드부분을비교하여야한다. 본진단에서사용할바이너리는두부분으로나누었다. 하나는선진단에서찾은 EP Offset 에서의바이너리를비교할것이고, 다른하나는아래그림에나타낸 0x100 만큼의크기이다. 해당부분은파일을감염시키는부분의코드로감염형악성코드에서중요한부분이라할수있다. [ 그림 ] 진단대상바이너리 이러한조건들을다음과같은코드로구성하여비교할수있다. BOOL LastDetection(HANDLE hfile) DWORD lpnumberofbytesread; char ReadBuffer1[0x20]; char ReadBuffer2[0x100]; char CheckBuffer1[0x20] =

'\x60','\x78','\x03','\x79','\x01','\xeb','\xe8','\x74','\x11','\x00','\x00','\x8b','\x74','\x24', '\x20','\xe8','\x11','\x00','\x00','\x00','\x61','\x78','\x03','\x79','\x01','\xeb','\x68'; char CheckBuffer2[0x100] = '\xc8', '\x00', '\x00', '\x00', '\x60', '\x81', '\xec', '\x00', '\x10', '\x00', '\x00', '\x8b', '\xfc', '\x68', '\x00', '\x10', '\x00', '\x00', '\x57', '\xff', '\x75', '\x08', '\xff', '\x56', '\x34', '\x0f', '\xb7', '\x47', '\x3c', '\x03', '\xf8', '\x3b', '\xfd', '\x0f', '\x87', '\xe4', '\x00', '\x00', '\x00', '\x66', '\x81', '\x3f', '\x50', '\x45', '\x0f', '\x85', '\xd9', '\x00', '\x00', '\x00', '\x81', '\xbf', '\x9b', '\x01', '\x00', '\x00', '\x79', '\x6c', '\x50', '\x7a', '\x0f', '\x84', '\xc9', '\x00', '\x00', '\x00', '\x8d', '\x9f', '\xf8', '\x00', '\x00', '\x00', '\x0f', '\xb7', '\x4f', '\x06', '\x49', '\x83', '\xc3', '\x28', '\xe2', '\xfb', '\x3b', '\xdd', '\x0f', '\x87', '\xb1', '\x00', '\x00', '\x00', '\x8b', '\x47', '\x28', '\x2b', '\x43', '\x0c', '\x72', '\x23', '\x03', '\x43', '\x14', '\x6a', '\x00', '\x50', '\xff', '\x75', '\x08', '\xff', '\x56', '\x3c', '\x50', '\x8b', '\xc4', '\x6a', '\x04', '\x50', '\xff', '\x75', '\x08', '\xff', '\x56', '\x34', '\x58', '\x66', '\x3d', '\x60', '\xe8', '\x0f', '\x84', '\x86', '\x00', '\x00', '\x00', '\x81', '\x4b', '\x24', '\x00', '\x00', '\x00', '\xe0', '\x6a', '\x02', '\x6a', '\x00', '\xff', '\x75', '\x08', '\xff', '\x56', '\x3c', '\x83', '\xf8', '\xff', '\x74', '\x70', '\x50', '\x05', '\x8f', '\x11', '\x00', '\x00', '\x2b', '\x43', '\x14', '\x89', '\x43', '\x10', '\x8b', '\x53', '\x08', '\x3b', '\xc2', '\x72', '\x16', '\x89', '\x43', '\x08', '\x8b', '\x4f', '\x38', '\x49', '\x03', '\xc1', '\x03', '\xd1', '\xf7', '\xd1', '\x23', '\xc1', '\x23', '\xd1', '\x2b', '\xc2', '\x01', '\x47', '\x50', '\x59', '\x2b', '\x4b', '\x14', '\x03', '\x4b', '\x0c', '\x87', '\x4f', '\x28', '\x03', '\x4f', '\x34', '\xe8', '\x00', '\x00', '\x00', '\x00', '\x5f', '\x81', '\xef', '\x13', '\x0e', '\x00', '\x00', '\x89', '\x0f', '\x83', '\xef', '\x1b', '\x68', '\x8f', '\x11', '\x00', '\x00', '\x57', '\xff', '\x75', '\x08', '\xff', '\x56', '\x38', '\x83', '\xf8', '\xff', '\x74', '\x18', '\x6a', '\x00', '\x6a', '\x00', '\xff', '\x75', '\x08', '\xff', '\x56', '\x3c', '\x8b', '\xc4', '\x68'; SetFilePointer(hFile, EPOffset, 0, 0); ReadFile(hFile, ReadBuffer1, 0x20, &lpnumberofbytesread, 0); SetFilePointer(hFile, EPOffset + 0xd58, 0, 0); ReadFile(hFile, ReadBuffer2, 0x100, &lpnumberofbytesread, 0); for (int i = 0; i < 0x1b; i++) if (ReadBuffer1[i]!= CheckBuffer1[i]) /* Check a aml data size at mal's data[0xdf6]&[e3c] */ return FALSE; for(int i=0; i< 0x100; i++) if(readbuffer2[i]!= CheckBuffer2[i]) return FALSE; return TRUE; [ 그림 ] 진단코드 이러한진단코드를통해감염된파일들을탐색하면올바르게진단하는것을확인할수있다.

[ 그림 ] 진단결과 위와같이진단을한다음감염된파일들을치료하여야한다. 우선파일뒷부분에덧붙여진 0x118F 만큼을잘라내는것과 PE 헤더의 AddressofEntrypoint 를올바르게수정해주어야한다. 그리고파일을실행에직접적으로관련이있는 SizeofRawData 의값도수정해주어야한다. 이는 다음과같은코드로나타낼수있다. VOID Requre(HANDLE hfile, char *FileName) DWORD OrigSizeofRawData; DWORD lpnumberofbytesread; PVOID lpdata = VirtualAlloc(0, dwsize - 0x118f, MEM_COMMIT, PAGE_READWRITE); SetFilePointer(hFile, 0, 0, FILE_BEGIN); ReadFile(hFile, lpdata, dwsize - 0x118f, &lpnumberofbytesread, 0); CloseHandle(hFile); DeleteFile(FileName); HANDLE htemp = CreateFile(FileName, GENERIC_WRITE, FILE_SHARE_WRITE, 0, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, 0); WriteFile(hTemp, lpdata, dwsize-0x118f, &lpnumberofbytesread, 0); poption->addressofentrypoint = OrigEP; psection->sizeofrawdata = dwsize - 0x118F - psection->pointertorawdata; SetFilePointer(hTemp,0,0,FILE_BEGIN); WriteFile(hTemp, lpaddr, 0x1000, &lpnumberofbytesread, 0); CloseHandle(hTemp); [ 코드 ] 치료코드

5. 결론 제작한코드로치료한결과는아래의표와같다. 아래의표는국내모백신이치료한파일들의 MD5 값과직접제작한코드로치료한파일의 MD5 를비교한것으로해시값이동일한것을 확인할수있다. 제작한코드로치료후 MD5 국내모백신으로치료후 MD5 Sample#1 0D7E522E17538992E77E1263B232B97A 0D7E522E17538992E77E1263B232B97A Sample#2 7BCE5B90298C1B5E422E24C5786C4EBB 7BCE5B90298C1B5E422E24C5786C4EBB Sample#3 2A16BB6514425A5E0ECBE9BDF58EB74A 2A16BB6514425A5E0ECBE9BDF58EB74A Sample#4 D4F80CA83101177799FD33636F8EDB57 D4F80CA83101177799FD33636F8EDB57 Sample#5 3C6EA25679B8089EEDC8D63962ECDDFA 3C6EA25679B8089EEDC8D63962ECDDFA Sample#6 D6D0EC9B06CC0769CA5718422EEC58CA D6D0EC9B06CC0769CA5718422EEC58CA [ 표 ] 치료결과 1 감염전 감염후 치료후 File Size 0x2000 0x318F 0x2000 AddressofEntrypoint 0x1000 0x6200 0x1000 SizeofImage 0x6000 0x8000 0x8000 LastSection.VirtualSize 0x1000 0x238F 0x238F LastSection.SizeofRawData 0x400 0x238F 0x1200 LastSection.Characteristics 0x50000040 0xF0000040 0xF0000040 [ 표 ] 치료결과 2 하지만위두번째표와같이감염형악성코드를 치료 했다는것이감염이전과완전히동일하는것을뜻하지는않는다. 물론가능하다면이전과완전히동일하게하는것이가장이상적이지만, 감염형악성코드가동작할때기존파일의정보를모두보존하지는않는다. 그렇기에복구할수없는부분도존재하게된다. 또한정책적인면에서위험의소지가있다면최소한만큼만수정하는경우도있다. 그러므로치료되었음에도감염이전과해시값이다르게나타나는경우도빈번하다.