到目前为止,已建立的二进制重写方法是动态重写,其中二进制在实际输入上运行时被重写。想想像PIN、DynamoRIO和Dyninst这样的检测工具,以及像qemu这样的二进制转换器。
与动态重写相比,静态重写工具有一个基本挑战,后者是精确的控制流图恢复。也就是说,对于二进制文件中的每个基本块,我们需要知道其跳转指令的可能目标集。难点在于二进制文件有很多间接跳转指令。举例来说,如果我们面临的一个基本模块,与两端bx r3
那么我们需要有一个精确和可靠的值设置分析(VSA),它可以告诉我们,可能的值r3
可以在运行时。不幸的是,这种分析通常是不可判定的。然而,行为良好的编译器会生成以某种方式结构化的二进制文件,这在很大程度上是有用的。
请注意,解决 CFG 恢复问题将使我们能够解决作为副产品的代码/数据分离问题。也就是说,在这种情况下,递归下降反汇编将允许我们将代码与代码字节流中的数据完美分离。
这里可以参考去年USENIX Security中介绍的如下论文:
王帅、王沛、吴丁浩:可
拆装。USENIX 安全 2015:627-642
他们的工具 Uroboros
是不开源的。它基于使用objdump 的迭代线性扫描反汇编。反汇编技术本身在之前的一篇论文中讨论过。尽管如此,它为实际工作的静态二进制重写提供了有趣的技术(或者至少这是他们的主张)。他们甚至多次重写相同的二进制文件而不会破坏它。最后,请注意静态二进制重写在很大程度上不适用于具有运行时代码生成的二进制文件。
更新:
似乎这里讨论的许多缺点Uroboros
已经得到解决 Ramblr
:
王等 阿尔。“ Ramblr:使重组再次伟大”,网络和分布式系统安全研讨会 (NDSS'17) 的论文集。2017年
特别是,他们提到他们重新组装的二进制文件没有执行开销或大小扩展。