论文部分内容阅读
近年来,代码复用攻击成为安全领域研究的重点。一些新型的代码复用攻击层出不穷,典型的有Return-Oriented Programming(ROP), JIT Spraying等等。与传统的注入式攻击不同,代码复用攻击不需要引入恶意代码,仅利用程序或者库函数中已有的代码进行攻击,而且被证明是图灵完备的。代码复用攻击打破了传统攻击防御方法所依赖的假设,即程序内部的代码不会产生攻击行为,而恶意行为均由外部引入。本文围绕增强现有代码复用攻击技术以及构建针对代码复用攻击的防御系统展开研究。本文研究内容大致包括以下两个方面:新型的代码复用攻击技术的研究,增强对代码复用攻击的理解;针对代码复用攻击依赖的必要条件,提出三种防御的方法,这些方法整合形成一个有效防御代码复用攻击的系统。本文主要研究内容具体描述如下。·为了防御代码复用攻击,本文首先研究代码复用攻击的攻击方式,并且提出了增强的攻击手段—Jump-Oriented Programming(JOP)及其自动构造JOPShellcode的工具。并利用JOP技术构造了内核Rootkit攻击。其目的是为了更好的理解代码复用攻击的原理及其特点。·针对代码复用攻击的利用对象—程序已有代码,本文分别提出了基于寄存器随机化的代码混乱方法,以及基于JIT(Just-in-time)虚拟机立即数随机化的代码混乱方法。通过编译时将程序中寄存器以函数为粒度进行重新分配以及对立即数进行拆分,指令替换等方法,打破了攻击者对复用对象代码的先验知识,使得攻击者很难利用已有的代码产生攻击。·假设攻击者可以通过逆向工程的方法获得已有代码进行攻击。针对代码复用攻击可能利用的数据对象—程序中的数据结构,本文提出基于数据结构随机化的数据混乱方法,包括基于修改数据结构定义的静态随机化方法以及基于动态修改数据结构内存结构的随机化方法。一方面使得攻击者不能通过复用程序中的数据结构及其操作来构造攻击,如内核Rootkit攻击以及虚拟机Blue Pill攻击。另一方面使得攻击者很难通过修改程序中的数据结构达到攻击的目的,如控制流攻击和非控制流攻击。·在对程序的代码和数据进行混乱后,攻击者已经很难利用已有的代码产生恶意行为,但仍然有机会用逆向工程的方法找到可以复用的代码以及数据对象进行攻击,甚至复用上述由代码及数据随机化方法引入的额外代码。为了更进一步的防御可能的代码复用攻击,本文分析了代码复用攻击的控制流与正常程序的控制流之间的区别,提出基于函数粒度的控制流检测方法。此外,本文分析了代码复用攻击指令序列与正常程序指令序列的不同,提出基于指令序列的代码复用攻击的检测方法。这两种动态运行时异常检测方法是对前面两种程序混乱技术的补充。将以上的方法整合起来构成一个系统,该系统不仅能够抵御已知的代码复用攻击,而且可以抵御未知的攻击。