一种面向内核栈溢出防御的指令修改虚拟平台执行方法与流程

文档序号:17443442发布日期:2019-04-17 05:08阅读:212来源:国知局
一种面向内核栈溢出防御的指令修改虚拟平台执行方法与流程

本发明涉及计算机安全领域,尤其涉及一种面向内核栈溢出防御的指令修改虚拟平台的方法。



背景技术:

计算机已经成为各领域广泛使用的信息处理工具,然而随着互联网时代的到来,以及网络对社会影响的逐渐增强,使通过网络散播的计算机病毒、恶意代码以及利用系统漏洞实现的网络攻击时时刻刻威胁着计算机的安全。缓冲区溢出是一类利用系统漏洞实现对计算机攻击的手段,通过向程序的缓冲区写入超过其定义长度的数据,将缓冲区相邻存储单元的数据覆盖,使程序的堆栈遭到破坏,进而迫使程序执行攻击者所定义的shellcode。2000年之后,windows系列操作系统和互联网的推广应用使缓冲区溢出攻击全面爆发,缓冲区溢出攻击在2000年至2004年期间达到一个爆发高峰,连续四年在所有漏洞排名中排名第一。

缓冲区溢出攻击通常分为栈缓冲区溢出攻击和堆缓冲区溢出攻击。因为栈缓冲区溢出攻击所占的比例比堆缓冲区溢出攻击大,攻击的方式也更加多样,且攻击形式更隐秘,所以本发明主要研究栈缓冲区溢出攻击。2005年,sans评选出20个威胁最大的漏洞,与栈溢出有关的漏洞占了40%左右。谷歌浏览器也在2012年被曝出存在栈溢出漏洞,该漏洞会造成浏览器拒绝服务。据统计2006年到2017年底,栈溢出攻击数量虽未明显上升,但其成为高危攻击漏洞的比例却在增加,栈缓冲区溢出攻击是一种极难检测防御的计算机系统漏洞。目前,在互联网上利用栈溢出实现的系统攻击占所有攻击总数的50%以上。栈溢出攻击可能造成程序运行失败、系统崩溃、网络瘫痪等问题,更严重的情况下,攻击者可以通过栈溢出攻击获得一台主机或者服务器的部分或者全部控制权。另外,栈溢出攻击广泛存在各种操作系统和应用软件中,攻击手段呈多样化发展趋势,因此从根本上解决栈溢出检测和防御问题存在诸多困难。

综上所述,虽然研究人员已经对栈溢出检测和防御做出了大量研究工作,但是栈溢出攻击仍然泛滥。针对现行防御技术单一、实用性不强等缺点,研究适用面广、实用性强的栈溢出检测防御技术来提高计算机系统的安全性具有非常重要的科学理论价值与实际应用意义。



技术实现要素:

本发明提供了一种面向内核栈溢出防御的指令修改虚拟平台的执行方法,本发明能够实时分析计算机运行时指令,以及监控call指令和ret指令。本发明的目的在于解决计算机终端中发生的栈溢出攻击可能造成的系统崩溃、数据丢失,甚至导致计算机终端被控制的危险。

本发明的目的是这样实现的:一种面向内核栈溢出防御的指令修改虚拟平台执行方法,包括如下步骤:

步骤一、在计算机终端启动时加载虚拟平台,初始化包括虚拟平台获取程序入口地址、虚拟平台初始化备份栈和虚拟平台初始化地址映射表;程序入口地址为第一地址,地址映射表为存储空间中以地址对形式存储的第一地址和第二地址,备份栈为备份原始程序中的压栈指令;

步骤二、虚拟平台缓存第一地址的运行环境,包括各类地址寄存器的值;

步骤三、虚拟平台通过地址映射表判断是否存在与第一地址对应的第二地址,如果存在,则直接修改地址寄存器的值,cpu跳转到以第二地址为入口地址的程序片段继续运行;如果不存在,则顺序执行步骤四;

步骤四、虚拟平台从第一地址指向的指令开始顺序获取,直到获取的指令的操作码为jmp跳转指令,该跳转指令为第一跳转指令,虚拟平台获取第一跳转指令的原始地址和参数存储在第三地址中,然后虚拟平台将从入口地址到jmp指令的指令组成第一指令片段,该指令片段不包括第一跳转指令;

步骤五、虚拟平台修改第一指令片段,在最后一条的后面以此增加第一控制指令和第二控制指令:第一控制指令为压栈指令,将第三地址压入栈中;第二控制指令为跳转指令,跳转指令的地址为虚拟平台的入口地址;经过上述修改,虚拟平台将第一指令片段修改为第二指令片段;

步骤六、虚拟平台轮询第二指令片段,查找其中的call指令和ret指令,根据指令修改备份栈:如果存在call指令和ret指令,在call指令前插入第三控制指令,该指令为压栈指令,将返回地址和返回地址的地址压入备份栈;在ret指令前插入第四控制指令,该指令为弹栈指令,将备份栈中的返回地址和返回地址的地址弹出;修改过的第二指令片段称为第三指令片段;将第三指令片段存储在单独划出的存储空间,该存储空间仅为虚拟平台存储修改的指令片段,存储第三指令片段的内存地址为第二地址,将第二地址和第一地址作为一对地址对存储在地址映射表中,地址寄存器中的值也修改为第二地址的参数;

步骤七、虚拟平台恢复计算机运行环境,入口地址为第二地址,在cpu中运行第二地址存储的指令片段;

步骤八、cpu运行第三指令片段,在运行到call指令和ret指令时,通过压栈指令和弹栈指令比较备份栈和真实栈中的返回地址的地址判断是否发生栈溢出攻击;如果发生栈溢出攻击,虚拟平台进行栈溢出防御;

步骤九、cpu运行完第三指令片段之后,根据第三指令片段中最后一条跳转指令,跳转到虚拟平台,虚拟平台根据第三地址获取下一段运行时指令片段,重复执行步骤二~步骤八,此时的第三地址为第一地址,建立面向内核栈溢出防御的指令修改虚拟平台。

步骤一所述虚拟平台初始化备份栈进一步包括:虚拟平台为每一个启动的线程创建备份栈,备份栈的大小为真实栈空间的2倍,创建线程id索引表,将线程id和备份栈基址作为一对键值关系加入到索引表;虚拟平台运行完一个完整程序之后释放程序的备份栈的过程为:虚拟平台获取即将消亡的线程的线程id,查找线程id索引表获取消亡线程对应的备份栈,虚拟平台释放该备份栈空间,并从线程id索引表中删除相应的键值对。

步骤六所述修改备份栈进一步包括:虚拟平台监控call指令,得到函数调用压栈时的返回地址和当前线程的线程id,通过查找线程id索引表获取相对应的备份栈,并将返回地址存储到备份栈中;虚拟平台监控ret指令,得到函数返回弹栈时的返回地址和当前线程的线程id,通过查找线程id索引表获取相对应的备份栈,并从备份栈中弹出函数返回地址。

步骤八所述判断是否发生栈溢出攻击进一步包括:

如果真实栈中返回地址的地址大于备份栈中返回地址的地址,则判断发生栈溢出攻击;

如果真实栈中返回地址的地址小于备份栈中返回地址的地址,则判断没有发生栈溢出攻击;

如果真实栈中返回地址的地址等于备份栈中返回地址的地址,则还需要进一步比较真实栈和备份栈中的返回地址进行判断:

如果真实栈中的返回地址不等于备份栈中的返回地址,则判断发生栈溢出攻击;

如果真实栈中的返回地址等于备份栈中的返回地址,则判断没有发生栈溢出攻击。

步骤一所述虚拟平台初始化地址映射表进一步包括:地址映射表由虚拟平台建立并维护,采用可变长度的链表结构,并且它的占用空间可以释放,释放地址映射表的操作可以随机进行,释放规则可以按照定时或定量的方式释放。

步骤八所述虚拟平台进行栈溢出防御进一步包括:虚拟平台可选择的防御方式有两种,一种是还原真实栈,每次执行ret指令时,如果备份栈中弹出的返回地址和真实栈中的返回地址不相同,就用备份栈中的返回地址覆盖真实栈中的返回地址,然后函数正常返回;另一种是直接从备份栈中返回,通过修改线程的栈基址,使其指向备份栈,当执行ret指令时,系统就会从备份栈中直接返回,摒弃原来已经被破坏的栈空间。

与现有技术相比,本发明的优势在于:

1.本发明采用的内核栈溢出攻击的防御方法是一种屏蔽性好、识别度高的防御方法,可以降低计算机终端被攻击的风险,提高计算机终端的安全性;

2.通过地址映射表的建立,可以识别重复调用的指令片段,提高虚拟平台的运行效率,降低系统资源的重复利用;

3.通过随机释放地址映射表的方式,可以节约系内存资源;

4.在计算机终端抵御栈溢出攻击中,本发明通过构建虚拟平台分析计算机运行时指令,修改跳转指令和增加控制指令,提升了计算机终端在防御恶意攻击中的多样性。

附图说明

图1为本发明提供的虚拟平台的流程图;

图2为本发明提供的虚拟平台的比较子流程图;

图3为本发明提供的虚拟平台修改指令片段的运行逻辑图;

图4为本发明提供的虚拟平台中真实栈和备份栈的关系示意图。

具体实施方式

下面结合附图举例对本发明做进一步说明。

图1和图2为本发明实施例提供的一种面向内核栈溢出防御的指令修改虚拟平台执行方法的流程图和比较子流程图。本发明应用于windows系统中的内核栈溢出检测,包括以下步骤:

步骤一、在计算机终端启动时加载虚拟平台,虚拟平台的初始化包括获取程序入口地址、初始化备份栈和初始化地址映射表。程序入口地址为第一地址,地址映射表为存储空间中以地址对形式存储的第一地址和第二地址。备份栈为备份原始程序中的压栈指令。

虚拟平台为每一个启动的线程创建备份栈,备份栈的大小为真实栈空间的2倍。创建线程id索引表,将线程id和备份栈基址作为一对键值关系加入到索引表。地址映射表由虚拟平台建立并维护,采用可变长度的链表结构,并且它的占用空间可以释放,释放地址映射表的操作可以随机进行,释放规则可以按照定时或定量的方式释放。

步骤二、虚拟平台缓存第一地址的运行环境,包括各类地址寄存器的值。

步骤三、虚拟平台通过地址映射表判断是否存在与第一地址对应的第二地址,如果存在,则直接修改地址寄存器的值,cpu跳转到以第二地址为入口地址的程序片段继续运行;如果不存在,则顺序执行步骤四。

步骤四、虚拟平台从第一地址指向的指令开始顺序获取,直到获取的指令的操作码为jmp跳转指令,该跳转指令为第一跳转指令。虚拟平台获取第一跳转指令的原始地址和参数存储在第三地址中。然后虚拟平台将从入口地址到jmp指令的指令组成第一指令片段,该指令片段不包括第一跳转指令。

步骤五、虚拟平台修改第一指令片段,在最后一条的后面以此增加第一控制指令和第二控制指令。第一控制指令为压栈指令,将第三地址压入栈中;第二控制指令为跳转指令,跳转指令的地址为虚拟平台的入口地址。经过上述修改,虚拟平台将第一指令片段修改为第二指令片段。

结合图3中的第一指令片段a和第二指令片段a'的关系,101为第一跳转指令,在原有计算机运行逻辑中,执行完第一指令片段a之后,执行指令片段b。但是虚拟平台100改变了计算机的运行逻辑,在运行a之前,获取a的指令片段,加入压栈指令102和跳转指令103。102的作用是将101的地址和参数压入栈,103是为了循环调用虚拟平台,保证虚拟平台对计算机运行的实时监控。

虚拟平台修改备份栈的方法为:虚拟平台监控call指令,得到函数调用压栈时的返回地址和当前线程的线程id,通过查找线程id索引表获取相对应的备份栈,并将返回地址存储到备份栈中。

步骤六、虚拟平台轮询第二指令片段,查找其中的call指令和ret指令。如果存在call指令和ret指令,在call指令前插入第三控制指令,该指令为压栈指令,将返回地址和返回地址的地址压入备份栈;在ret指令前插入第四控制指令,该指令为弹栈指令,将备份栈中的返回地址和返回地址的地址弹出。修改过的第二指令片段称为第三指令片段。

结合图3中的第二指令片段a'和第三指令片段a"的关系,如果a'中存在call指令和ret指令,再结合图4,虚拟平台在call指令之前加入控制指令104,该控制指令将call指令的返回地址x和返回地址x的地址y压入备份栈中;在ret指令之前加入控制指令105,该控制指令将备份栈中的返回地址x和返回地址的地址y弹出,与真实栈中的内容进行比较,为判断栈溢出攻击提供依据。

虚拟平台修改备份栈的方法为:虚拟平台监控ret指令,得到函数返回弹栈时的返回地址和当前线程的线程id,通过查找线程id索引表获取相对应的备份栈,并从备份栈中弹出函数返回地址。

将第三指令片段存储在单独划出的存储空间,该存储空间仅为虚拟平台存储修改的指令片段。存储第三指令片段的内存地址为第二地址,将第二地址和第一地址作为一对地址对存储在地址映射表中。地址寄存器中的值也修改为第二地址的参数。

步骤七、虚拟平台恢复计算机运行环境,入口地址为第二地址,在cpu中运行第二地址存储的指令片段。

结合图3说明,计算机运行并没有运行虚拟平台,而是运行虚拟平台修改的第三指令片段,当运行完成之后,依据第三指令片段的最后一条指令为第二控制指令,即跳转指令,跳转指令的入口地址为虚拟平台的入口地址,即可完成虚拟平台的实时监控。

步骤八、cpu运行第三指令片段,在运行到call指令和ret指令时,通过压栈指令和弹栈指令比较备份栈和真实栈中的返回地址的地址判断是否发生栈溢出攻击。如果发生栈溢出攻击,虚拟平台将进行栈溢出防御。

判断栈溢出攻击的依据如图2所示,如果真实栈中返回地址的地址大于备份栈中返回地址的地址,则判断发生栈溢出攻击;如果真实栈中返回地址的地址小于备份栈中返回地址的地址,则判断没有发生栈溢出攻击;如果真实栈中返回地址的地址等于备份栈中返回地址的地址,则还需要进一步比较真实栈和备份栈中的返回地址进行判断。

如果真实栈中的返回地址不等于备份栈中的返回地址,则判断发生栈溢出攻击;如果真实栈中的返回地址等于备份栈中的返回地址,则判断没有发生栈溢出攻击。

当发生栈溢出攻击是,虚拟平台采用两种方法进行防御,一种是还原真实栈,每次执行ret指令时,如果备份栈中弹出的返回地址和真实栈中的返回地址不相同,就用备份栈中的返回地址覆盖真实栈中的返回地址,然后函数正常返回;另一种是直接从备份栈中返回,通过修改线程的栈基址,使其指向备份栈,当执行ret指令时,系统就会从备份栈中直接返回,摒弃原来已经被破坏的栈空间。

步骤九、cpu运行完第三指令片段之后,根据第三指令片段中最后一条跳转指令,跳转到虚拟平台。虚拟平台根据第三地址获取下一段运行时指令片段。重复执行步骤二~步骤八,此时的第三地址为第一地址,建立面向内核栈溢出防御的指令修改虚拟平台。

结合图1,当一段程序运行完成之后,需要释放为程序分配的备份栈空间,节约系统资源。虚拟平台获取即将消亡的线程的线程id,查找线程id索引表获取消亡线程对应的备份栈。虚拟平台释放该备份栈空间,并从线程id索引表中删除相应的键值对。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1