论文部分内容阅读
作为一种典型的攻击方式,缓冲区溢出攻击由于能够获取系统的最高控制权,危害巨大。为此,操作系统不断引入新的安全防护机制,如数据执行保护(DEP)和地址空间分布随机化(ASLR)等。但是随着Return-into-libc和Return-oriented programming(ROP)等新型攻击技术的不断发展,基于缓冲区溢出攻击的威胁从来没被消除。Return-into-libc和ROP通过改变系统内核原有的控制流程实现对操作系统的攻击。因此,对内核控制流程提供保护就可以消除或缓解这一类攻击的威胁。而获取一个完整的内核控制流程图则是进行内核控制流程保护的前提。这里的内核控制流程图,需要记录的是函数调用的指令地址和其跳转的目的地址。函数调用会引发三种控制流程:直接函数调用、间接函数调用和函数返回。其中直接函数调用及其返回的目的地址比较直观,通过分析内核的反汇编代码很容易获得,而间接函数调用的目的地址则无法直接获取。为此,论文提出了一种基于编译器中间代码的内核流程图获取方法来解决这个问题。由于编译器中间代码具有较低的复杂性和较高的可读性,语义丰富,通过中间代码分析能够得到函数指针的传递过程,确定间接函数调用的目的函数地址,并进而构造出完整的内核控制流程图。在进行中间代码分析时,我们将函数指针的传递过程从逻辑上分为保存过程和使用过程两种。函数指针保存过程从所有与函数名相关的中间指令出发,分析得到函数指针被保存的位置,如全局变量、结构体、参数等。函数指针使用过程则从所有函数间接调用指令出发,分析所使用函数指针的来源,从包括全局变量和指针保存过程的分析结果中确定实际调用的目的函数名。然后,通过查找目的函数在内核反汇编代码中所对应的入口地址,最终确定间接函数调用的目的地址。最后,论文基于LLVM编译器实现了一个内核控制流程图获取原型系统,并使用该原型系统对Linux内核进行了试验分析,试验分析结果证明了论文方法的有效性。