目标: Shellcode(密钥变化)
版本: -
代码来源: bbs.ikaka.com/showtopic-8680183.aspx
工具: Redoce 2.077 / OllyICE
语言: -
SAC#09007
www.sacour.cn 转载保留此行

生成exe的步骤我就不废话了,进入之后pusha,然后把值弹到eax中:

0040500D    68 6B52346D     push    6D34526B
00405012    58              pop     eax

此时eax的值为6D34526B。

然后两个跳转进入一个子过程:


0040501A   /EB 16           jmp     short 00405032
..
00405032    E8 E5FFFFFF     call    0040501C
00405037    F60422 5F       test    byte ptr [edx], 5F

下为40501C,进入后先弹个值到ebx中:

0040501C    5B              pop     ebx

此时ebx等于00405037(call在跳转以前会把紧接着它的下一条指令的地址压进堆栈),如果你用的不是Redoce来生成exe,那这个值可能不一样。

0040501D    33C9            xor     ecx, ecx

ecx置0操作。

0040501F    66:B8 1F5F      mov     ax, 5F1F

这时又把5F1F移到ax中,那么此时eax的值就是6D345F1F了。

00405023    66:31044B       xor     word ptr [ebx+ecx*2], ax
00405027    41              inc     ecx
00405028    40              inc     eax
00405029    66:81F9 5B01    cmp     cx, 15B                     ;解密部分

0040502E  ^ 7C F3           jl      short 00405023              ;用来循环
00405030   /EB 05           jmp     short 00405037
00405032   |E8 E5FFFFFF     call    0040501C

00405037   \F60422 5F       test    byte ptr [edx], 5F       ;解密自此开始(ebx+0时)
0040503B    2100            and     dword ptr [eax], eax
0040503D    48              dec     eax

解密过程的伪代码表示也就是:


 eax=0x5f1f ; ebx=00405037 (ptr) ; ecx=0;
   do 
    @(ebx+ecx*2)2字节 xor ax;
    ecx++;
    eax++;
   loop until cx=&H15b

也就是0x15b字节内密钥从0x5f1f到0x5f1f+0x15b变化,这样如果只是用一般枚举工具肯定是枚举不出来的,只能调试了。

至于我在那帖说的会卡住……我也查清楚原因了,原来是某个内存整理软件挂了些函数的结果,关闭后,程序段可以继续运行。

最后会在内存空间中发现下载地址(或者看函数的参数也行了):

明显的测试用shellcode。