论文部分内容阅读
ROP(Return-oriented programming)是一种全新的攻击方式,它利用代码复用技术.攻击者扫描已有的动态链接库和可执行文件,提取出可以利用的指令片段(gadget),这些指令片段均以ret指令结尾,即用ret指令实现指令片段执行流的衔接.最初ROP攻击实现在x86体系结构下,随后扩展到各种体系结构.与以往攻击技术不同的是,ROP恶意代码不包含任何指令,将自己的恶意代码隐藏在正常代码中.因而,它可以绕过WX的防御技术.但是,ROP也有其不同于正常程序的内在特征:(1)ROP控制流中,call和ret指令不操纵函数,而是用于将函数里面的短指令序列的执行流串起来,但在正常的程序中,call和ret分别代表函数的开始和结束;(2)ROP控制流中,jmp指令在不同的库函数甚至不同的库之间跳转,攻击者抽取的指令序列可能取自任意一个二进制文件的任意一个位置,这很不同于正常程序的执行.比如,函数中部提取出的jmp短指令序列,可将控制流转向其他函数的内部;而正常程序执行的时候,jmp指令通常在同一函数内部跳转.本文深入分析研究各种指令片段的特性,ROP攻击及其变种的内在本质与不正常行为.基于这些发现,我们提出新的检测方法:首先,鉴于我们检测系统只关注动态链接库,故先通过分析程序的ELF头文件,得到动态链接库加载的基址;再通过IDA进行库静态分析,得到库中每个函数相对的起始地址和结束地址;将相对的起始地址和结束地址加上动态链接库基址,便得到程序加载运行阶段,每个库函数线性起始地址和结束地址.其次,创建一颗AVL树,用于存储前面得到的库函数线性起始地址和结束地址,用于call完整性检测和jmp完整性检测.这之后,利用二进制插桩工具为待监控程序装配检测分析代码,并创建出一个影子栈用于记录函数返回地址.最后,由于我们的插桩级别是指令级,故每当待监控程序的一条指令执行结束之后,控制流就转向分析检测代码,检测代码判断刚刚执行完的这条指令是否是ret,call和jmp间接跳转,如果是,分别执行相应的ret完整性检测,call完整性检测和jmp完整性检测.为了测试此检测系统的误报和漏报,我们选取大量的正常程序和ROP恶意代码,实验结果表明,此检测系统没有误报和漏报,而且性能开销是正常程序的3.8倍,比DROP检测系统的6.1倍少很多.