我正在阅读恶意软件二进制文件的自动静态拆包(Kevin Coogan等人),目的是尝试复制给定的实验结果(使用Hybris-CMyDoom.qtElock等),并研究如何针对其他情况扩展据我了解,作者首先使用指针分析通过检测转换点(即,该点将正常指令的执行与运行时生成的指令分开)来提取解压缩代码,然后从这一点开始,使用向后切片分析来提取解压缩器代码。

经过“代码修剪”和“重组”(例如,修补防御代码,修复了一些重定位问题等),人们可以获得一个新的二进制文件,其每个未打包的块均被初始标记作为s-object(对于节对象缩写)。然后,可以模拟新的二进制文件(如果我理解正确的话),其中将通过解压缩的代码填充s-object

尽管我也许可以想象本文中应用的静态分析的一些局限性(例如,向后静态切片的不准确性,指针分析,副作用...)以及关于存在的隐式假设过渡点,我仍然无法弄清所描述的静态拆包器是如何工作的。因为恶意代码是非结构化的),但是


问题1:如何应用价值集分析?


因为我们没有希望恢复非结构化二进制文件中的抽象位置(用于值集分析)。例如,在下面的Hybris Worm拆包存根中:

    mov edx, 0x135
    mov ebx, 0x401000
    mov eax 0x6bf00803

unpack:
    sub [ebx], eax
    nop
    sub eax, 0x15e3c0
    add ebx, 0x4
    dec ecx
    jne unpack
    jmp _oep

_oep:
    ...


我想不存在抽象位置,没有吗?

其次,作者说每个s-object都包含有关某个部分的元数据(即名称,大小等),如本文V.B.3.1所述: ...包含有关其呈现的节的元数据...这些元数据是从二进制文件的节表中获得的...


但是


问题2:如何确定解压缩后的代码必须放在
节中(其信息可以通过解析二进制头获得)?


在“纯” UPX的情况下,这可能是正确的,其中未打包的代码位于UPX0部分中,但是通常情况并非如此(例如,上面Hybris的情况)。由于在V.B.3.1中描述了地址转换的步骤,该步骤是由于二进制文件的正常运行时解包过程与静态解包器的解包过程之间的差异而引起的,因此我假设此解包器的输出是一个新的二进制文件,其中仅包含未打包的文件代码,也没有拆包存根。但是


问题3:如何处理多层打包程序?例如,在Q4312079q中给出的实验结果本文使用的Figure 5案例使用自定义的Peed-44至少包含UPX拆包级别:哪种形式应被视为“实际”拆包代码? >
我对论文的理解正确吗? (应该不是)然后我在哪里误会了?


评论

如果不阅读本文,我将发表评论,不幸的是,当涉及到安全领域中的真实示例时,许多学术论文过于简单和不切实际。通常,通过过度安装工具,对工具进行调整,以处理本文中介绍的一小部分示例。这可能就是您所遇到的。

#1 楼

关于第二个问题,通常您不是在使用节,而是在使用内存页(及其相关权限)。您知道解压缩后的代码最终将必须写入然后在内存页中执行,并且您可以轻松地检测出可写,写入然后执行的内存页。 ,我想说一种幼稚的方法是一直运行到最后一个稳定的“过渡点”,然后根据定义,最后一层是解压缩的代码。但是更复杂的保护措施可能会很快打破这种启发式。

#2 楼

关于您的第一个问题:

如果我理解正确回答该问题所需的3篇论文,您的抽象位置例如是ebx

现在我讨厌带有充满激情,但通过浏览您提到的论文,引用了所用的价值集分析算法的论文(“您所看到的不是您所执行的”),然后引用了该论文以给出答案,即使是价值集分析是(“低级代码的通用值集分析”)。

基本上,它们跟踪变量的一些轻微抽象,包括寄存器(如其中一篇论文所述,我不想要回过头来查看某个代码),并观察它们的变化。分析将用于观察ebx在循环代码中假定的值是多少,以便推断出未包装的潜在位置代码。