没想到刚文章刚发出来,就有收到好几个朋友的邮件询问关于如何分析beacon.dll,为了能让一些真正想研究的朋友少走一些弯路,我这里就写写我分析当中的一些tips吧。特别需要声明一点的是,我这里不会写出整个过程(那还不如直接把分析后的文件直接提供下载更省事),目的是为了避免一些习惯于拿来主义而又不愿意去钻研分析的小P孩直接拿来做坏事,我相信那些有能力的朋友,看完我这些tips肯定能自己搞出来(甚至不需要看都能搞出来的,我这里就算是献丑了).文中又不当之处,欢迎各位朋友切磋指正。
用到的工具:FASM(我最爱的ASM编译器),OLLYDBG 2.01(你不知道这个就别往下看了:-),010EDITOR(我最爱的16进制编辑器)
1,首先是用压缩工具解压缩cobaltstrike.jar文件,找到"resources"目录里的beacon.dll,这里拷贝出来并改名为beacon_tpl.dll(此为模板文件)。
2,运行起cobalt strike,在"cobalt strike"菜单项中点选"Listeners",然后在下方弹出的新对话框里点击"add",配置如下图:
最后点击确定后,在你运行cobaltstrike的终端窗口中会有如下的输出信息:
[+] encoded beacon stage with x86/shikata_ga_nai in 1874ms [+] encoded beacon stage with x86/alpha_mixed in 16292ms [+] The patched DLL is: 424 => /tmp/beacon1505713488048363096.dll
3,把这个文件/tmp/beacon1505713488048363096.dll(这个就是生成好的dll,被两次encode了)拷贝出来改名为beacon_enc.dll。在这里大家注意上面的424这个数字无论你生成多少次都是这个数,你用IDA打开那个模板文件,看一下这里就知道了:
text:10003E76 loc_10003E76: ; CODE XREF: .text:10003E57j .text:10003E76 mov edx, [esp+4] .text:10003E7A mov dword_1001FCF0, edx .text:10003E80 xor eax, eax .text:10003E82 mov cl, 69h .text:10003E84 .text:10003E84 loc_10003E84: ; CODE XREF: .text:10003E90j .text:10003E84 xor byte ptr word_1001E040[eax], cl .text:10003E8A inc eax .text:10003E8B cmp eax, 1A8h .text:10003E90 jl short loc_10003E84 .text:10003E92 movzx eax, word_1001E042 .text:10003E99 movzx ecx, word_1001E040 .text:10003EA0 push offset unk_1001E168 .text:10003EA5 push offset unk_1001E048 .text:10003EAA push eax .text:10003EAB push ecx .text:10003EAC mov ecx, dword_1001E044 .text:10003EB2 mov edx, offset unk_1001E068 .text:10003EB7 call loc_100012B0
上面那个1A8h就是424,而这段代码就是用来解密配置信息并读取的.从这里看配置信息是被用69h异或过了.回头分析的时候自然会证明这一点。
4,到了这里可能有朋友就会问怎么能还原那个被加密的dll呢?这个其实很简单,我们可以让它自己跑起来解密完成后我们再把解密后的内容dump出来即可,因为不管你怎么加密,前面肯定是要有解密头的。由于它是个dll,所以我们这里用FASM写几行最简单的代码把它变成exe,代码如下:
format PE entry $ file "beacon_enc.dll"
用FASM编译它后生成出一个新的beacon.exe来,然后用ollydbg加载它,如下图:
这里你可以选择直接运行它(或者保险起见,你看到这句:MOV CX,7B81,这个7b81肯定就是长度了,在这里你可以设置个条件断点当ecx=1时断下,然后单步执行一下这样能保证不会执行到解密后的dll代码上),运行完解密头后的界面如下图:
选取这片红色的代码区,然后右键选择"EDIT"->binary copy,这时复制一份beacon_enc.dll为beacon_src.dll,用010editor打开beacon_src.dll,ctrl+a全选,然后选择
"Edit"菜单->"Paste From"->"Paste from Hex Text" 或者直接按下 ctrl+shift+v 将解密后的dll的内容复制过来,保存。这时,beacon_src.dll就是解密后的dll:
5,在010editor里的,直接按ctrl+M打开二进制比对对话框,设置如下:
对比完成后,你直接找到有个大小为1a8h(即424字节)的块是不一样的,点一下看看:
结合前面的分析,从上图可以看出模板中的那段"AAAABBBBCCCC….."应该就是配置信息存放的地方,我们可以尝试解密下看看.选中beacon_src.dll,选择"tools"->"Hex Operations"->"binary xor",如下图:
转换后的结果如下图:
看到原始的信息了吧?"50 00"就是端口号,剩下的不用我多说了啊?其实到这里就OK了,剩下的就看你想怎么做了。写着写着又成了教程了,唉。
其实细心的朋友可以注意到,文件开头(也就是"MZ"开头的地方)也是不一样的,那里其实是一段shellcode,"M"和"Z"其实就是"dec ebp"和"pop ebx",这里是个小猥琐的技巧,聪明的你看明白了吗?而这段shellcode其实就是:
dec ebp; M
pop edx; Z
call 0; call next instruction
pop ebx; get our location (+7)
push edx; push edx back
inc ebp; restore ebp
push ebp; save ebp
mov ebp, esp; setup fresh stack frame
add ebx, 0x???????? ; add offset to ReflectiveLoader
call ebx; call ReflectiveLoader
mov ebx, eax; save DllMain for second call
push edi; our socket
push 0×4; signal we have attached
push eax; some value for hinstance
call eax; call DllMain( somevalue,DLL_METASPLOIT_ATTACH, socket )
push 0x????????; our EXITFUNC placeholder
push 0×5; signal we have detached
push eax; some value for hinstance
call ebx; call DllMain( somevalue,DLL_METASPLOIT_DETACH, exitfunk )
; we only return if we don't set a valid
这里它这个dll是用了"Stephen Fewer"写的一个库,名字叫 "Reflective DLL Injection library",大家可以去github上下载这个DD一读代码便知分晓,剩下的分析就看你个人的想法了。有问题的可以发邮件给我:[email protected]。
Thanks for reading!Have fun,buddy!
关联阅读:
windows 2008如何安装Cobalt Strike
http://www.freebuf.com/articles/others-articles/18096.html
关于 windows 2008如何安装Cobalt Strike 的一些想法
http://www.freebuf.com/articles/system/18180.html