自动静态解包二进制文件

逆向工程 恶意软件 静态分析 开箱
2021-07-09 07:27:03

我读的文件的恶意软件二进制文件的自动静态开箱(凯文·库根等人)与试图重现给定的实验结果(与目标Hybris-CMyDoom.qtElock,等),并研究如何将它用于其他案件进行扩展。

据我了解,作者首先使用指针分析通过检测转换点(即该点将正常指令的执行与运行时生成的指令分开)来提取解包代码,然后使用反向切片分析提取解包代码从这一点来说。

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

虽然我可能能够想象论文中应用的静态分析的一些限制(例如向后静态切片的不准确、指针分析、副作用......),以及关于过渡点存在的隐含假设,但我仍然无法想象了解所描述的静态解包器是如何工作的。

首先,作者说由于问题的上下文是非结构化的二进制文件,所以应用向后静态切片(这是真的,因为恶意代码是非结构化的),但是

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

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

    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论文中引用的那样:

一个 s 对象...包含有关它所呈现的部分的元数据...这些元数据是从二进制文件的部分表中获得的...

问题二:如何确定解压后的代码一定能放入一个section(其信息可以通过解析二进制头获得)?

UPX在解压缩代码位于 节中的“纯”情况​​下,这可能是正确的UPX0,但通常情况下并非如此(例如,上述 的情况Hybris)。

由于其中描述地址转换步骤是由于V.B.3.1二进制的正常运行时解包过程与静态解包器的解包过程之间的差异而引起的,因此我假设此解器的输出是一个新的二进制文件,仅包含解包的代码和没有拆包存根。

问题三:如何处理多级打包程序?

例如,Figure 5论文中给出的实验结果Peed-44使用定制UPX包含至少2解包级别的情况:哪种形式应该被视为“真正的”解包代码?

所以我的问题是

我对论文的理解是否正确?(应该不是)那我哪里误解了?

2个回答

关于您的第二个问题,通常您使用的不是部分而是内存页(及其相关权限)。您知道解压后的代码最终必须在内存页中写入然后执行,并且您可以轻松检测到此类可写、写入和执行的内存页。

关于你的第三个问题,我想说一种天真的方法是运行到最后一个稳定的“过渡点”,然后根据定义,最后一层是解压后的代码。但是更复杂的保护可能会很快打破这种启发式。

关于你的第一个问题,我不确定我是否理解这些词中的任何一个。

关于你的第一个问题:

如果我理解正确回答问题所需的 3 篇论文,那么您的摘要位置将是ebx例如。

现在我满怀热情地讨厌学术论文,但是从浏览您提到的论文,引用的用于值集分析的算法的论文(“您所看到的不是您执行的”)以及引用那里的论文给出了回答甚至是值集分析是什么(“低级代码的通用值集分析”)。

基本上,他们通过一些代码跟踪变量的一些轻微抽象,其中包括寄存器(如其中一篇论文中所述,我不想回去找出它是哪一个)并观察它们如何变化。

在您的 Hybris 蠕虫示例中,ebx将是一个感兴趣的抽象位置,并且将使用值集分析来观察ebx在循环代码中假设的,以便推断解压缩代码的潜在位置。