Metasploit它是一种开源安全漏洞检测工具,可以帮助安全IT专业人士识别安全问题,验证漏洞的缓解措施,管理专家驱动的安全评估,提供真实的安全风险信息。这些功能包括智能开发、代码审计、Web应用扫描,社会工程。团队合作,在Metasploit他们的发现是通过综合报告提出的。
本文研究恶意样本MD5哈希:9d7e34250477acf632c6c32fc2c50d3b。
Shllcode第一阶段:静态分析
首先,打开您选择的反汇编程序shellcode ,我个人更喜欢IDA Pro,但是我不会使用伪代码功能,而是将重点放在反汇编视图上,因此这应该适用于你选择的任何工具。通过IDA Pro,您可以选择如何加载二进制数据(16、32或64)。因此,我将首先选择32位。如果反汇编有任何错误,我们可以简单地更改它。加载二进制文件后,选择第一个字节并按下“ C”,这将试图将第一个字节转换为代码。因此,重新分析文件,然后尝试将其他字节汇编成组件。如下所示,入口点从位置0x00开始,shellcode一直到位0x2A,此时IDA剩余的字节不能转换为程序集。
基于这个事实,我们可以假设这部分数据是以某种方式加密的,并且上述数据是以上的shellcode解密并执行它。因此,让我们来看看第一个要操作的函数sub_0()这个函数只负责跳转到偏移量0x25,它将执行sub_2(),我叫它main_func(),因为它包含了大部分代码,让我们继续研究这个函数。
所以这个函数的内部解密相当简单,只是基本的XOR循环,它将[edi]指向的XOR数据与[esi]指向数据相结合。XOR操作之后,edi(存储地址)会增加,程序也会增加[esi:esi 1]与0x550D比较。在这种情况下,IDA以Little-Endian因此,它被显示为0x0D55。如果值匹配,它将跳到ecx指向地址,否则会增加esi,将其目前指向的数据与0x73如果匹配,将恢复原始地址(存储在中)ebx中)。如果不匹配,它会回到循环XOR并继续代码。
基于以上分析,我们知道esi和edi加密shellcode。我们还知道密钥长度可以是任何长度,并且ebx将包含指向密钥首字节的地址。
使用所有这些信息,让我们首先尝试找出加密数据的开始和停止位置。XOR循环(loc_F)开始并向上移动。我们可以首先看到存储edi移动到中间地址ecx这是有意义的,因为一旦解密完成,程序就会跳转ecx中的地址。
现在,我们找到了edi从ebx获取加密代码地址,弹出函数顶部堆栈顶部的值,并存储在ebx然后将值移到中间edi中,然后将0x73移动到eax低位,调用cld,然后输入a scasb循环。问题是,当它弹出时。ebx堆栈的顶部是什么?
好了,简单看一下调试器里的堆栈。可以发现,当调用函数时,堆栈顶部的值是要返回的地址,这是调用指令后的指令地址。如下图所示,返回地址为0x013B1CAB,调用函数的地址为0x013B1CA6(这里的调用指令占用5个字节)。那么,这是如何适用于我们的呢?shellcode?
我们上面说过,main_func是从位置0x25调用。无法识别的数据来自0x2A开始。位置0x25接下来的五个字节可以为调用指令腾出空间。main_func()堆栈顶部的数据值0x2A。现在,我们终于知道了加密数据的起始位置!
但是不要太快乐,记得0x73移入al后如何调用cld吗? cld删除指令(设置为0)EFLAGS寄存器中的DF(direction)标志。当标志为0时,任何字符串操作都会根据操作中使用的寄存器增加索引寄存器,特别是esi或edi。调用cld之后,它将进入一个连续执行的循环scasb,直到ZF(0)标志设置(设置为1)。scasb会做什么?它所做的就是它会做什么?al中的字节与[edi]比较并根据结果设置状态标志。如果不匹配,则ZF将被删除,否则将被设置,程序将跳出循环。此外,由于scasb它是字符串操作,所以它会在每个循环后增加edi中间地址,这意味着直到[edi]等于0x73到目前为止,程序永远不会执行解密功能。现在我们知道加密数据来自0x73密钥从地址开始0x2A一直到[address] = 0x73数据。如上图所示,0x73是ebx数据中的第二个字节。XOR密钥为0x06,加密数据从0x2B开始!向下滚动到函数的最后,我们可以找到字节0x550D,这意味着加密数据长401字节!
了解所有内容后,让我们进入解密阶段!
Shllcode第二阶段:解密
所以,我们现在有了XOR密钥:0x06,以及加密数据的开始:0x2B。有了这些知识,我们就可以容易地使用它们Python写一个基本的XOR该函数具有两个参数:密钥和加密数据。向函数添加一个简单的检查,以查看数据是否与0x550D匹配和脚本是否已经完成!
但是,为了实际使用它,我们需要手动或使用它YARA或Regex从IDA提取数据来定位它。然后我们必须是新的IDA在某些情况下,打开会话并进行第二次“阶段”从第一阶段开始调用函数,可能是另一部分数据XOR。幸运的是,我们可以将这个基本脚本转换为IDAPython格式,解密Shellcode覆盖加密的Shellcode!
别担心,迁移IDAPython过程很简单。首先,我们需要导入所需的库idaapi,然后将for循环更改为while循环,然后调用传入的数据len(),但在这种情况下,我们不知道数据的长度,因为我们现在正在传输加密数据的地址。
除此之外,只要在address i中间还有数据,可以做到while连续循环。这可以使用Byte()函数从给定地址获取字节数据。在本文的例子中,地址是我们的加密blob。现在,我们可以将数据字节分配到变量字节,然后与之相匹配0x55进行比较。我们还将address (i 1)与0x0D比较以确保这两个标记都存在。
如果没有这些标记,则使用给定的输入执行XOR然后调用字节操作PatchByte(),它将使用我们的变量byte在address i覆盖字节。最后,将i增加1,循环继续!
将它导入IDA,并在命令行中输入ida_xor_crypt(0x06,0x2B),如下图所示,我们的函数将被执行并覆盖数据!它不再以0x73一开始,因为现在是0x75。
将它导入IDA,并在命令行中输入ida_xor_crypt(0x06,0x2B),我们可以选择执行我们的函数并覆盖数据,如下图所示0x75再按一次“ C”,然后完全分解。
本文翻译自:https://0ffset.net/reverse-engineering/malware-analysis/common-shellcode-techniques/如果转载,请注明原始地址