最近几年来,Intel的酷睿处理器虽然在性能上的提升并不明显,但是在大家看不见的地方仍然在不断地更新硬件功能,Intel PT技术便是其中的一个。其实Intel的处理器发展以来,一直在开发很多有助于程序分析的新功能。在Intel引入PT技术之前,Intel CPU中已拥有Branch Trace Store(BTS)和Last Branch Record(LBR)分支记录功能。BTS作为最早引入的性能计数功能,能将程序的分支跳转信息记录在内存缓冲区中,并且可以配置内存缓冲区大小。当内存缓冲区被写满时,CPU会产生中断,从而通知操作系统进行相应处理。由于BTS机制开启后会带来较大的性能开销,在实际运行环境中并不适用。LBR机制完全采用MSR寄存器保存分支跳转地址,其性能较好,并且能够过滤不需要的分支跳转,弥补了BTS的缺点。由于LBR所拥有的寄存器的数量非常有限,LBR可能无法完整记录目标程序的所有跳转信息。
针对以上问题,Intel在第五代酷睿架构处理器中引入了Intel PT技术。该技术利用CPU内部的硬件机制,能在性能开销较小的情况下完整捕获程序的执行路径。针对目标程序的控制流信息,Intel PT会生成不同类型的控制流数据包:
(1)Taken-Not-Taken(TNT)包。TNT包代表条件分支跳转(例如jnz、jl等跳转指令)的方向,taken代表跳转,not taken代表不跳转。在实际编码中,只用记录一位。
(2)Target IP(TIP)包。TIP包记录了间接跳转、异常、中断和其他分支或事件的目标地址。(www.xing528.com)
(3)Flow Update Packets(FUP)包。FUP包能够提供异步事件(中断和异常)的源地址,以及一些其他无法从目标二进制程序中确定原地址的情况。
(4)模式数据包。这类数据包为解码器提供重要的处理器执行信息,便于解码器正确解释反汇编程序。执行模块有16位、32位、64位。
解码工具利用这些数据包与二进制程序反汇编工具,能够动态生成一个较为精确的程序控制流图。模糊测试工具利用符号执行技术早在20世纪70年代就被提出,但由于当时的计算能力的限制,未能在实际环境中应用。近年来,随着计算能力的增强,符号执行技术又开始兴起。不同于模糊测试,符号执行的核心思想是将程序外部输入作为一个符号值,然后通过某种方式对程序进行模拟执行。在执行的过程中,会使符号值进行实际计算,形成符号表达式。每当执行过程中遇到条件分支时,如果与符号表达式有关,那么此符号表达式便产生了约束限制,当程序执行到指定的位置时,便会形成相当多的约束限制,最后使用求解器对这些约束限制进行约束求解,生成输入。符号执行最明显的优势是能定量地探索目标程序的未知执行路径,并反推出程序的目标输入。经过近年来的发展,符号执行已形成了许多开源工具,例如KLEE、S2E、BAP和Angr。KLEE是针对源代码进行动态符号执行的工具,而后三个工具都可以对二进制代码进行符号执行。虽然目前这些系统已经比较成熟,但是如果只是纯粹的作为符号执行进行应用,则仍然存在较多的问题。例如,如果程序规模较大,则可产生路径爆炸问题;在符号执行过程中,需要对约束进行求解,在有些情况下由于约束比较复杂,难以在规定时间内进行求解。针对符号执行的问题,目前比较主流的方法是将模糊测试和符号执行相结合,以发现并测试程序更多的路径。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。