Blast's Security Lab
26 Nov 2009
目标: 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。
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。