Virut 바이러스공격 ASEC 분석 1 팀고흥환선임연구원 해마다접수되는악성코드의통계를보면대부분이인터넷웜또는트로이목마가대부분을차지하며, 파일에기생하는바이러스는그수가적어지는것이추세이다. 그도그럴것이최근의악성코드특징은개인의능력과시가아닌돈과연관되는악성코드작성이대부분이기때문이다. 그렇다면 Virut 바이러스가인터넷웜과트로이목마를제치고국내뿐만아니라해외에서도큰피해를입히고있는이유가무엇인지, 그특성과방법을자세히살펴보자. 1. Virut 바이러스의발전 2006 년초처음등장한 Virut 바이러스는이제까지의후위형파일바이러스와많이다르지않다. 그러나이전바이러스와차별되는중요한특징은시스템의공통라이브러리 API 를후킹하여다른 PE 파일을감염시킨다는점이다. 이후에등장한변형에서는바이러스본체를암호화시키고복호화루틴은매감염때마다변경되는다형성알고리즘이사용되었다. 그러나감염루틴의버그로인하여크게문제가되지는않는것으로보인다. 근래발견된바이러스변형은 4 가지의다양한형태의감염방식과중복감염문제, IRC 서버에접속하여 DDoS 공격을하는등의종합적인악성코드특성을지니게되었다. 2. 바이러스의전파 Virut 바이러스자체는시스템의실행파일만을감염대상으로하기때문에네트워크를통한감염은이루어지지않는다. 그러나최근의 Virut 바이러스는국내에만수십만의시스템을감염시킨것으로보이며, 해외의감염보고에서도높은수치를나타내고있다. 많은시스템들은타시스템에의해서감염이되었다기보다는해킹된웹사이트에추가된 Exploit Script 또는 Script 에추가된 IFrame 등의원인에의해서감염된파일을특정서버서부터다운로드되는것으로판단된다. 글을작성중인현재까지도새로운바이러스가특정사이트로부터배포되고있는것으로확인되었기에사용자들은항상최신의윈도우취약점업데이트와바이러스엔진업데이트를해야만바이러스로부터안전할수있다. 3. Virut.C & D 의특성 Win32/Virut.C, Win32/Virut.D 로명명된근래의바이러스의특징들을먼저살펴보면다음과같은것들을찾아볼수있다. 첫째, 4가지의다양한감염방식 - 다형성,EPO(Entry-Point Obscuring), 암호화둘째, PE 파일감염 특정확장자 (.EXE,.SCR) 셋째, 실행된모든프로세스의공통라이브러리 (NTDLL.DLL) 의 API 후킹을이용한파일감염 ZwCreateFile ZwOpenFile
ZwCreateProcess ZwCreateProcessEx 넷째, 시스템프로세스인 Winlogon.exe에 RemoteThread 생성다섯째, 외부연결및파일다운로드여섯째, 특정 IRC 서버접속및명령대기 4. 감염방식 [ 그림 1] Win32/Virut A 형의감염방식 [ 그림 1] 과같이 A 형인감염방식은일반적인후위형바이러스와크게다르지않다. PE 파일의시작점인 EntryPoint 를파일후미에추가된바이러스복호화루틴의시작지점으로변경하여바이러스가먼저동작하도록만든다.
[ 그림 2] Win32/Virut.B 감염방식 B 형은 PE 파일의시작점인 EntryPoint 를변경하지않고바이러스복호화루틴을파일의시작위치특정코드위에덮어씌워버렸다. 물론본래의코드는파일후미의암호화된바이러스코드뒷부분에암호화하여백업한다. [ 그림 3] Win32/Virut.C 감염방식 C 형식은 EPO(Entry-Point Obscuring) 방식을취하는데, 이는정상적인특정 CALL 함수호출 (5 바이트 ) 에대해서파일후미에추가된바이러스복호화루틴의시작점으로함수호출옵셋 (Offset) 을변경하여바이러스가동작하도록하는방법이다.
[ 그림 4] Entry-Point Obscuring 를이용한코드 [ 그림 4 ] 는 EPO 를이용한코드를비교한것이다. 상단의밑줄코드가감염전의호출이며하단의밑줄코드는감염된이후의호출을보여준다. [ 그림 5] Win32/Virut.D 감염방식 D 형식은이전의 C 형식과같다. 다만바이러스복호화루틴이코드섹션영역의마지막부분에덧붙여있다는것이다르다. 코드섹션영역에복호화루틴이추가되므로코드섹션의 VirtualSize 가증가할수있다.
5. 바이러스복호화루틴 Virut 의바이러스복호화루틴은실제바이러스코드에대한복호화알고리즘으로이루어져있다. 문제는이복호화루틴이다형성으로구성되었기때문에감염된파일마다기계어코드가다르다는점이다. 이러한다형성코드를분석하기위해서는다양한감염샘플에서동일한분석방법을사용하여공통된코드나알고리즘을찾아내야한다. 하나의복호화루틴을예로살펴보면파란색으로표시된부분의코드들이복호화에중요하게이용되고있는부분임을알수있을것이다. 01006AE0 60 01006AE1 55 01006AE2 8BEC 01006AE4 E8 0C000000 PUSHAD PUSH EBP MOV EBP,ESP CALL 01006AF5 // Exception Handler 01006AE9 F8 CLC ; 01006B2D, 01006B4D 에서 Exception 발생시호출 01006AEA F8 CLC 01006AEB E8 B4000000 CALL 01006BA4 01006AF0 E9 5E000000 JMP 01006B53 ; 01006B53 분기 01006AF5 67:64:FF36 0000 PUSH DWORD PTR FS:[0] 01006AFB 892D 546B0001 MOV DWORD PTR DS:[1006B54],EBP 01006B01 67:64:8926 0000 MOV DWORD PTR FS:[0],ESP ; Exception Handler 등록 0x01006AE9 01006B07 31C0 XOR EAX,EAX 01006B09 68 00000080 PUSH 80000000 01006B0E 50 01006B0F 68 00000080 PUSH 80000000 01006B14 68 00000080 PUSH 80000000 01006B19 68 00000080 PUSH 80000000 01006B1E 68 01000000 PUSH 1 01006B23 68 00000080 PUSH 80000000 01006B28 50 01006B29 50 01006B2A 50 01006B2B 50 01006B2C 50 ; FileName => NULL 01006B2D FF15 CC100001 CALL DWORD PTR DS:[<&KERNEL32.LoadLibraryA>] ; LoadLibraryA 01006B33 31D2 XOR EDX,EDX 01006B35 52 PUSH EDX 01006B36 68 00000080 PUSH 80000000 01006B3B 52 PUSH EDX 01006B3C 52 PUSH EDX 01006B3D 68 00000080 PUSH 80000000 01006B42 68 00020000 PUSH 200 01006B47 68 40000000 PUSH 40 01006B4C 52 PUSH EDX ; FileName => NULL 01006B4D FF15 CC100001 CALL DWORD PTR DS:[<&KERNEL32.LoadLibraryA>] ; LoadLibraryA 01006B53 BD A0FF0600 MOV EBP,6FFA0 01006B58 8B75 F8 MOV ESI,DWORD PTR SS:[EBP-8] 01006B5B 67:64:8936 0000 MOV DWORD PTR FS:[0],ESI 01006B61 F8 CLC 01006B62 89C9 MOV ECX,ECX 01006B64 E8 00000000 CALL 01006B69
01006B69 59 POP ECX ; 0x01006B69 01006B6A 81C1 973E0100 ADD ECX,13E97 ; 복호화위치 01006B70 51 PUSH ECX 01006B71 31D2 XOR EDX,EDX 01006B73 81CA D1290000 OR EDX,29D1 ; 복호화크기 01006B79 87DB XCHG EBX,EBX 01006B7B 87DB XCHG EBX,EBX 01006B7D 90 NOP 01006B7E 90 NOP 01006B7F BE E8000000 MOV ESI,0E8 ; 복호화키 01006B84 F5 CMC 01006B85 F8 CLC 01006B86 F8 CLC 01006B87 F9 STC 01006B88 8A01 MOV AL,BYTE PTR DS:[ECX] 01006B8A 66:31F0 XOR AX,SI ; 복호화연산 01006B8D 8601 XCHG BYTE PTR DS:[ECX],AL 01006B8F 83C1 01 ADD ECX,1 01006B92 83EA 01 SUB EDX,1 01006B95 F5 CMC 01006B96 83FA 00 CMP EDX,0 01006B99 75 ED JNZ SHORT 01006B88 01006B9B 59 POP ECX 01006B9C C9 LEAVE 01006B9D 894C24 18 MOV DWORD PTR SS:[ESP+18],ECX 01006BA1 61 POPAD 01006BA2 FFE1 JMP ECX ; 복호화된위치로분기 6. 바이러스코드 [ 그림 6] Winew/Virut 의복호화루틴 복호화된바이러스코드는몇가지의흥미로운방식으로감염루틴을생성하게되는데시간의흐름에따른동작들을살펴보면다음처럼작성될수있다. (1) 중복감염루틴설치를피하기위한이벤트객체생성 ( Vx_4 ) (2) 감염루틴을모든프로세스에메모리매핑 (MemoryMapping) 하기위한오브젝트섹션 (ObjectSection) 생성 ( \BaseNamedObject\VtSect ) (3) 실행된모든프로세스의공통메모리영역에이미생성한오브젝트섹션을매핑 (4) 공통라이브러리인 NTDLL.DLL 의특정 Export 함수에대한후킹 (ZwCreateFile, ZwOpenFile, ZwCreateProcess, ZwCreateProcessEx) (5) 시스템프로세스인 Winlogon.exe 의메모리영역에매핑한 RemoteThread 실행 7. NTDLL.DLL Export API 후킹 앞서언급했던것처럼 Virut 바이러스는 API 후킹 (Hook) 을이용해서다른 PE 파일들을감염시킨다. [ 그림 7] 은 Visual Studio 의유틸리티인 Depends 를이용하여살펴본 NTDLL.DLL 의 Export 함수이다. Virut 바이러스가후킹 (Hook) 할함수 ZwCreateFile 의 EntryPoint 는 0x0002595E 이다. NTDLL.DLL 의 Base 주소는 0x77F50000 이므로실제 VirtualAddress 는 0x77F7595E 일것이다.
[ 그림 7] NTDLL.DLL 의 Export 함수인 ZwCreateFile EntryPoint [ 그림 8] 은후킹되기전과후킹된후의어셈블리코드상태에대한캡쳐이미지이다. 왼쪽의후킹전코드는 EAX 레지스터에 ZwCreateFile 의서비스번호인 0x25 번을넣는코드이며, 오른쪽의후킹후코드는바이러스의특정함수를호출하는코드로변경되어있다. [ 그림 8] 후킹전후의어셈블리코드상태비교 이와동일한방법으로나머지 ZwOpenFile, ZwCreateProcess, ZwCreateProcessEx Export 함수에대한 5 바이트메모리패치 ( 후킹 ) 가이루어진다. (NTDLL.DLL 의모든 Export 함수들은시스템서비스함수를호출하기위한시스템서비스번호 (System Service Number) 를 EAX 레지스터에, 스택에존재하는인자값을 EDX 레지스터에옮긴다음, 커널서비스인터럽트를발생시키는 INT 0x2E 혹은 SYSENTER 를발생시킨다.)
[ 그림 9] ZwCreateFile 의후킹전, 후의시스템호출관계 8. Winlogon.exe 의바이러스쓰레드 Virut 이생성한오브젝트섹션 ( \BaseNamedObject\VtSect ) 에는 RemoteThread 를위한코드와후킹된 API 함수에대한감염코드가존재한다. 오브젝트섹션은메모리매핑을통해모든실행된프로세스의메모리에공유되며, 그중에서 Winlogon.exe 에대해서만매핑된오브젝트의 Thread 를실행시킨다. RemoteThread 의순서화된동작을보면다음과같다. (1) 시스템 OS 에따른 WFP(Windows File Protection) 무력화 윈도우자체파일보호를위한 WatcherThread(SFC.DLL or SFC_OS.DLL) 를중지시키는방식을통하여시스템파일도감염대상으로하고있다. (2) 중복감염방지에대한이벤트객체를통한동기화 ("Vx_4") (3) 외부연결파일다운로드및실행 분석중에는 Win-Trojan/Agent.40960.HB 악성코드를다운로드하여실행하였으며, 다운로드된악성코드는중국사이트 (alexa.xxxxxx.cn) 로연결또다른악성코드를다운로드하는등의연속적인감염이이루어지고있다. (4) IRC 채팅서버로의연결을통한명령대기 - Ircd.XXXX.pl (NICK qsfzqiie, USER I, JOIN &virtu) - Proxim.ircXXXXXX.pl ( 접속 URL 주소는악용방지를위해 X 로일부문자를변경, 표기했다.) 이상으로 Virut 바이러스에대한전반적인사항에대해서살펴보았다. Virut 의특징인 API 후킹에의한감염때문에사용자가수동으로치료한다는것은거의불가능하다. 대부분의바이러스백신업체에서전용백신을따로만들어배포하는것도이러한특징때문이다. 문제가발생하기전에사전방역을확실히하는것이더중요하다는원리는바이럿바이러스에서도마찬가지라고할수있다.