一种代码复用攻击的防御方法技术

技术编号:13986902 阅读:80 留言:0更新日期:2016-11-13 04:21
本发明专利技术公开了一种代码复用攻击的防御方法,包括在库文件中增加新段,令所述新段中保存的语句为库文件的代码段的数据语句;然后加载所述库文件;最后将所述代码段分别加载至只读的内存页以及只执行的内存页;通过所述新段中保存的语句,判断只读的内存页以及只执行的内存页中加载的代码段中的语句为数据语句或者指令语句,并将所述只读的内存页中的指令语句以及只执行的内存页中的数据语句替换为无效语句。本发明专利技术通过以不同的内存页分别储存指令语句和数据语句,从而防御代码复用攻击,本发明专利技术不依赖于具体的处理器硬件平台,任何基于windows平台的虚拟系统都可以实施本发明专利技术提出的技术方案。

【技术实现步骤摘要】

本专利技术属于系统安全
,更具体地,涉及一种代码复用攻击的防御方法
技术介绍
代码复用攻击是指在系统共享库文件中(动态链接库,如Windows系统System32目录下的ntdll.dll)或者程序运行时的内存空间(内核空间、可执行进程空间等)已有的代码中搜索可利用的具有特定特征的指令片段(gadgets,通常以ret等汇编指令结尾),并将其链接成可连续执行的指令序列(以ret等汇编指令实现跳转),再结合缓冲区溢出覆盖函数的返回地址等技术,使程序转而执行构造好的指令序列(由gadgets链接而成),最终可执行系统调用(如system()函数)获得系统权限或调用系统函数(如VirtualProtect)修改内存属性(读、写、执行),执行预先构造的攻击程序。代码复用攻击利用了系统执行程序时的以下几个特点:(i)程序执行时内存中的代码页为可读和可执行权限(代码页中存在需要读的数据);(ii)ret指令在共享库文件或内存中大量存在;(iii)每个gadget包含的指令条数(即由gadgets组成的指令序列中两个ret指令之间的指令数目)很少;(ⅳ)ret/call指令对数目严重失衡(call指令调用函数,ret指令返回,这两条指令在大多数情况下成对出现)。针对构建代码复用攻击的这些特点,出现了不少的防御方法。其中,Hidem方法利用一些早期处理器(CPU)架构独有的Split-TLB特性(分别通过不同的高速缓存访问数据页和代码页)将可执行的代码页中存在的数据和代码进行分离,为程序在内存中执行时的每一个代码页额外分配一个具有只执行权限的内存页面,用于保存代码页中的代码。这样攻击者在执行程序搜索内存空间时就会因为不能读取代码页中的代码而无法构造具有攻击能力的指令序列,从而达到防御代码复用攻击的目的。但这种方法消耗的内存受到执行的程序的影响,最高可能达到程序可执行代码使用内存的两倍,约为2MB~20MB,同时现有的处理器已经没有Split-TLB特性,因此Hidem所能防御的平台十分有限。
技术实现思路
针对现有技术的以上缺陷或改进需求,本专利技术提供了一种代码复用攻击的防御方法,其目的在于以不同的内存页分别储存指令语句和数据语句,从而防御代码复用攻击。为实现上述目的,按照本专利技术的一个方面,提供了一种代码复用攻击的防御方法,包括以下步骤:S1.在库文件中增加新段,令所述新段中保存的语句为库文件的代码段的数据语句;S2.将所述库文件加载至内存;S3.将所述库文件的代码段分别加载至内存中只读的内存页以及只执行的内存页;通过所述新段中保存的语句,判断加载后的代码段中的语句是否为数据语句,并将所述只读的内存页中的非数据语句以及只执行的内存页中的数据语句替换为无效语句。优选地,所述步骤S1具体包括如下子步骤:S11.将库文件的代码段的数据语句储存于临时文件;S12.在库文件中增加新段,并将临时文件中储存的数据语句复制至新段。作为进一步优选地,所述步骤S11具体为:根据库文件的代码段的语句的操作码是否为空,判断该语句是否为数据语句,是则将该语句储存入临时文件,否则对该语句不作任何处理。作为进一步优选地,所述步骤S12具体为:将库文件的头部中的段的数值+1;在库文件的bound import段以及security段之前插入新段,令所述新段中保存的语句为临时文件中的数据语句;修改库文件的头字节以及校验和。优选地,所述方法用于基于windows平台的虚拟系统。总体而言,通过本专利技术所构思的以上技术方案与现有技术相比,具有下列有益效果:1、采用不同的内存页分别储存数据语句和指令语句,仅需多分配和原有页面数量相同的内存页,经验证仅消耗2MB内存,优于现有技术中的Hidem方法;2、不依赖于具体的处理器硬件平台,任何能够模拟完整硬件环境的开源虚拟系统的windows平台都可以实施本专利技术提出的技术方案。附图说明图1为现有技术和本专利技术实施例1进行内存访问的示意图;图2为本专利技术实施例1将所述只读的内存页中的指令语句以及只执行的内存页中的数据语句替换为无效语句的示意图;图3为本专利技术实施例1的页面写回示意图;图4为本专利技术实施例1虚拟多TLB系统处理COW的过程。具体实施方式为了使本专利技术的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本专利技术进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本专利技术,并不用于限定本专利技术。此外,下面所描述的本专利技术各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。本专利技术提供了一种代码复用攻击的防御方法,该方法可用于基于windows平台的虚拟系统,包括以下步骤:S1.在库文件中增加新段,令所述新段中保存的语句为库文件的代码段的数据语句,该步骤又包括如下子步骤:S11.根据库文件的代码段中的语句的操作码是否为空,判断该语句是否为数据语句,是则该语句为数据语句,将数据语句储存入临时文件;否则该语句为非数据语句,即指令语句,不对该语句作任何处理;S12.将库文件的头部中的段的数值+1;在库文件的bound import段以及security段之前插入新段(如果库文件既没有bound import段或security段,则可在任意位置插入新段,但为了加载时的便利,一般将新段插入至除bound import段以及security段以外其它所有段的尾部),令所述新段中保存的语句为临时文件中的数据语句;修改库文件的头字节以及校验和。S2.将所述库文件加载至内存;S3.将所述库文件的代码段分别加载至内存中只读的内存页以及只执行的内存页;通过步骤S1中的所述新段中保存的语句,判断加载后的代码段中的语句是否为数据语句,并将所述只读的内存页中的非数据语句(除了数据语句以外的其它语句,即指令语句)以及只执行的内存页中的数据语句替换为无效语句。实施例1本实施例的目的在于针对现有Windows系统对内存中代码段赋予可读可执行权限的缺点,结合能够模拟完整硬件环境的开源虚拟机系统提出了一种代码复用攻击的防御方法,包括以下步骤:S1.在库文件中增加新段,所述新段为数据段,在添加后设置为只读;将库文件的代码段的数据语句保存于新段中;所述代码段由数据语句和指令语句组成;S11.对Windows系统库文件进行静态分析,结合IDA Pro用python语言编写插件采用递归下降反汇编算法识别库文件的代码段中的数据语句。首先,获得库文件预设的加载基址及库文件中包含的段数目;接着,遍历其中的所有段以获得代码段的起始地址和结束地址;然后,依次分析代码段中的每一条语句,根据语句的操作码是否为空来判断该条语句为指令语句或数据语句;如该语句为数据语句,则将此数据语句的首地址和尾地址以相对偏移的形式写入临时文件,直至代码段中所有的数据语句均写入临时文件;S12.由于Windows系统提供了成百上千的动态链接库,如果将从库文件的代码段提取到临时文件的数据语句保存到额外的文件,那么加载器在加载库文件的同时必须加载保存了数据语句的文件,这样会加重加载器的负担。为了解决这一问题,本专利技术在库文件的尾部插入一新段,并设置为只读,用于保存临时文件中的数据语句,并给该新段命名为“.cdata”。具体操作如下:S121.获取库文件的头部(IM本文档来自技高网
...

【技术保护点】
一种代码复用攻击的防御方法,其特征在于,包括以下步骤:S1.在库文件中增加新段,令所述新段中保存的语句为库文件的代码段的数据语句;S2.将所述库文件加载至内存;S3.将所述库文件的代码段分别加载至内存中只读的内存页以及只执行的内存页;通过所述新段中保存的语句,判断加载后的代码段中的语句是否为数据语句,并将所述只读的内存页中的非数据语句以及只执行的内存页中的数据语句替换为无效语句。

【技术特征摘要】
1.一种代码复用攻击的防御方法,其特征在于,包括以下步骤:S1.在库文件中增加新段,令所述新段中保存的语句为库文件的代码段的数据语句;S2.将所述库文件加载至内存;S3.将所述库文件的代码段分别加载至内存中只读的内存页以及只执行的内存页;通过所述新段中保存的语句,判断加载后的代码段中的语句是否为数据语句,并将所述只读的内存页中的非数据语句以及只执行的内存页中的数据语句替换为无效语句。2.如权利要求1所述的防御方法,其特征在于,步骤S1包括如下子步骤:S11.将库文件的代码段的数据语句储存于临时文件;S12.在库文件中增加新段,并将临时文件中储...

【专利技术属性】
技术研发人员:李伟明王文清
申请(专利权)人:华中科技大学
类型:发明
国别省市:湖北;42

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1