论文笔记 TIE: Principled Reverse Engineering of Types in Binary Programs

      这篇论文讲述的是作者们发明的一种从二进制代码恢复到高级语言的逆向工程的一种新方法。这里只对其流程和思想进行介绍,详细的过程在后面再做讨论。高级语言在编译过程中丢失了buffer、structures和local variables等data abstractions。data abstractions恢复的逆向工程包括两个部分:  变量恢复(variable recovery),从low-level code 识别high-level variables。论文中举了一个例子:他们根据参数是通过ebp offsets获取的,通过不同ebp的数目推测参数的数目。类型恢复:确定每一变量的类型,这个更有挑战性。还好了解已编译代码中的按字节编址的内存(byte-addressable memory)和寄存器。例如一个变量被放入eax(一种32位通用寄存器),我们可以推测它的类型和32位寄存器相匹配,却很难推测他是高级语言中的有符号整形、指针还是结构体。类型还可以通过控制流来推断。

     TIE(Type Inference on Executables)的核心是基于二进制代码分析的变量类型恢复方法。概括来说类型重建(type reconstruction)是通过代码调用的hints来推断类型。type reconstruction 根据这些hints建立了一些列规则。

    变量恢复:首先用BAP(Binary Analysis Platform)将二进制程序装换成二进制中间语言BIL(Binary Intermediate Language),SSA(Static Single Assignment)解决寄存器使用冲突问题,处理之后的BIL我们称之为SSA形式的program。DVSA算法处理SSA形式的program,输出变量在内存中的地址信息和别名信息。

  类型恢复:首先建立一个类型系统(type system),对不同类型进行抽象表示,type system是分析的基础,根据BIL program的内容生成类型约束(Type Constraints),包括内存操作、进程间的约束、结构数据间的约束,用发明的算法解这些约束得到我们能推断出的最保守、最精确的类型。

      


你可能感兴趣的:(论文笔记)