多链哈希栈结构及检测函数返回地址被篡改的方法与流程

文档序号:18941851发布日期:2019-10-23 01:13阅读:248来源:国知局
多链哈希栈结构及检测函数返回地址被篡改的方法与流程

本发明涉及计算机技术领域,更具体地,涉及一种多链哈希栈结构及检测函数返回地址被篡改的方法。



背景技术:

堆栈溢出漏洞是一个极其严重的系统安全漏洞,它是通过向一个有限的内存空间写入过长的数据,破坏系统的内存空间,导致系统运行异常、死机或重启。通过堆栈溢出攻击,使用攻击代码的地址覆盖函数指针,可以让攻击者获取部分或全部的系统控制权,这是一种极具威胁的安全隐患。

现有技术中提供了一种链式哈希栈结构,是一种新型的保护函数返回地址的防御手段。它在硬件上添加了两个寄存器,top寄存器和salt寄存器,top寄存器用来保存哈希值,salt寄存器用来保存哈希函数的密钥。当调用子函数时,把哈希值和返回地址依次压入栈中。然后把密钥、哈希值和返回地址一起做哈希运算,运算结果用来更新top寄存器的值。在函数返回时,把哈希值和返回地址一同弹出栈,并做哈希运算。运算结果与top寄存器中的值做对比。如果不同,则抛出一个异常;如果相同,则用栈中的哈希值更新top寄存器,返回到父函数中。

链式哈希栈的安全性极高,即使攻击者能任意读写内存地址空间,也无法绕过这种防御机制。然而,现有技术中的链式哈希栈是一个单链结构,在单链实现中,深度为m的函数体保存的是第m个返回地址和第m-1个哈希值,也就是说,若第m-1个哈希值的运算未完成,第m个哈希值的运算必须进行等待,当哈希函数的运算周期增大时,链式哈希栈的性能损耗会急剧地加大,会引发流水线停滞问题。例如,当一次哈希运算需要80个时钟周期时,它的性能损耗大约为20%,极大地限制了链式哈希栈的实用性。



技术实现要素:

本发明实施例提供一种克服上述问题或者至少部分地解决上述问题的多链哈希栈结构及检测函数返回地址被篡改的方法。

第一方面,本发明实施例提供一种多链哈希栈结构,所述多链哈希栈结构包括n条链式结构,每条链式结构对应一个用于存储哈希值的top寄存器,所述多链哈希栈结构的任一帧中存储了当前帧所对应的函数体的返回地址和当前帧所在链式结构所对应的top寄存器中的哈希值;

其中,所述当前帧所在的链式结构是根据当前帧所对应的函数体在所述多链哈希栈结构中的深度来确定的;

其中,所述当前帧所在链式结构所对应的top寄存器存储的是所述当前帧所在链式结构上的最新的哈希值;

其中,n为大于1的自然数。

第二方面,本发明实施例提供一种检测函数返回地址被篡改的方法,基于如第一方面所述的多链哈希栈结构,包括:

将所述多链哈希栈结构中的任一帧作为当前帧,当所述当前帧所对应的函数体调用子函数时,确定所述当前帧所在的链式结构,获取所述当前帧所在的链式结构所对应的top寄存器中的哈希值;

将所述当前帧所对应的函数体的待验证返回地址和所述当前帧所在的链式结构所对应的top寄存器中的哈希值压入栈,并将入栈的返回地址和哈希值输入到一个哈希运算模块中进行哈希计算,获得一个新的哈希值,将所述新的哈希值存储至所述top寄存器中;

当所述当前帧所对应的函数体返回时,将所述当前帧中存储的返回地址和哈希值弹出栈,并将出栈的返回地址和哈希值输入到另一个哈希运算模块中进行哈希计算,获得一个待验证的哈希值;

若所述待验证的哈希值与所述top寄存器中存储的所述新的哈希值相等,则获知所述待验证返回地址未被篡改,并利用出栈的哈希值更新所述top寄存器;或者,若所述待验证的哈希值与所述top寄存器中存储的所述新的哈希值不相等,则获知所述待验证返回地址被篡改。

第三方面,本发明实施例提供一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现如第二方面所提供的检测函数返回地址被篡改的方法的步骤。

第四方面,本发明实施例提供一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现如第二方面所提供的检测函数返回地址被篡改的方法的步骤。

本发明实施例提供的多链哈希栈结构及检测函数返回地址被篡改的方法,在现有链式哈希栈的基础上,通过将链式哈希栈切分成多条链式结构,每条链式结构对应一个top寄存器,当函数体连续调用或者连续返回时,相比于单链,多链结构在其存在依赖关系的每条链上相邻两次哈希运算之间的“间隔”更大了,可以减少流水线的停顿时间,甚至不停顿,有效地缓解了由于相近的哈希运算的冲突造成的流水线停顿,减少了链式哈希栈的性能损耗。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1为本发明实施例提供一种多链哈希栈结构的示意图;

图2为本发明实施例提供的一种检测函数返回地址被篡改的方法的流程示意图;

图3为本发明实施例提供的电子设备的实体结构示意图。

具体实施方式

为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

首先对本发明中涉及的基本概念和相关术语进行解释:

栈(stack):又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。地址较低的一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。栈用来传递参数、存储返回信息,保存寄存器以及进行本地存储等。

栈帧:当某个函数运行时,机器需要分配一定的内存去进行函数内的各种操作,这个过程中分配的那部分栈称为栈帧。栈帧是一段有界限的内存区间,由最顶端的两个指针界定,寄存器%ebp为帧指针,寄存器%esp为栈指针,寄存器%ebp保存了所分配内存的最高地址,寄存器%esp保存了所分配内存的最低地址,当程序执行时,栈指针(栈顶)可以移动。

函数调用:计算机编译或运行时,使用某个函数来完成相关命令。当一个函数调用子函数时,在栈中会为这个子函数开辟一个新的帧。

返回地址:栈中存储的数据中一个最为重要的数据就是函数返回地址。当调用一个函数时,调用指令(例如call指令)会将函数返回地址压入栈中。当函数返回时,返回指令(例如return指令)会读取栈中保存的返回地址,根据返回地址跳转到原来调用函数的位置,继续往下执行下一条指令。利用栈溢出漏洞进行攻击最常用的方法就是利用栈溢出,覆盖返回地址,将返回地址改为一个攻击者设置的地址。当函数返回时,就会跳转到攻击者设置好的位置,执行攻击者希望执行的代码。

如图1所示,为本发明实施例提供一种多链哈希栈结构的示意图,所述多链哈希栈结构包括n条链式结构,每条链式结构对应一个用于存储哈希值的top寄存器,所述多链哈希栈结构的任一帧中存储了当前帧所对应的函数体的返回地址和当前帧所在链式结构所对应的top寄存器中的哈希值。

具体地,本发明实施例提供一种用于保护函数返回地址的多链哈希栈结构。

所述多链哈希栈结构包括n条链式结构,n为大于1的自然数。每条链式结构对应一个用于存储哈希值的top寄存器。可以理解的是,运行所述多链哈希栈结构的服务器上需要部署n个top寄存器。

所述多链哈希栈结构的任一帧中存储了当前帧所对应的函数体的返回地址和当前帧所在链式结构所对应的top寄存器中的哈希值。可以理解的是,同一条链上的各个帧使用的是同一个top寄存器。

其中,所述当前帧所在的链式结构是根据当前帧所对应的函数体在所述多链哈希栈结构中的深度来确定的。

具体地,若某个函数的深度为m,指的是在栈中从高地址(栈底)往低地址(栈顶)数第m个栈帧。

设当前帧所对应的函数体在所述多链哈希栈结构中的深度为m,则当前帧所在的链式结构为第m%n(模运算)条链式结构;其中,m为大于等于零的自然数。

举例来说,假设当前函数体的深度为m,它使用第p条链(即使用第p个top寄存器),当它调用一个子函数时,子函数使用第p+1条链;当它在自己函数体尾部返回时,使用的是第p条链;而返回到它的父函数后,父函数使用第p-1条链,即深度为m的函数体使用的是第m%n条链式结构所对应的top寄存器中的哈希值。

其中,所述当前帧所在链式结构所对应的top寄存器存储的是所述当前帧所在链式结构上的最新的哈希值。以上述例子进行说明,深度为m的函数体使用的是第m%n条链式结构所对应的top寄存器中的哈希值,而当前帧所在链式结构所对应的top寄存器中的哈希值,依赖于同一链式结构上的前一帧所对应的函数体是否完成哈希运算,即依赖于第m-n个函数体。

可以理解的是,多链哈希栈结构将栈在逻辑上切分成了多条链式结构。现有的链式哈希栈是单链结构,在链式哈希栈的实现中,深度为m的函数体保存的是第m个返回地址和第m-1个哈希值,依赖于第m-1个函数体(栈帧)是否完成哈希运算,当第m-1个栈帧的哈希运算还未结束时,第m个栈帧的哈希运算只能在流水线上停顿等待。而本发明实施例提供的多链哈希栈结构,深度为m的函数体保存的是第m个函数体的返回地址和第m-n个哈希值,依赖于m-n个函数体是否完成哈希运算,相比于单链,多链结构在其存在依赖关系的每条链上相邻两次使用哈希运算之间的“间隔”更大了,可以减少流水线的停顿时间,甚至不停顿,有效地缓解了由于相近的哈希运算的冲突造成的流水线停顿,减少了链式哈希栈的性能损耗。

基于上述实施例的内容,所述当前帧所在链式结构所对应的top寄存器存储的是所述当前帧所在链式结构上的最新的哈希值,具体为:

当与所述当前帧处于同一链式结构上的前一帧所对应的函数体调用子函数时,将所述前一帧所对应的函数体的返回地址和哈希值压入栈,并将入栈的返回地址和哈希值输入到一个哈希运算模块中进行哈希计算,获得一个新的哈希值,将所述新的哈希值存储至所述top寄存器中;

当所述前一帧所对应的函数体返回时,将所述前一帧中存储的返回地址和哈希值弹出栈,并将出栈的返回地址和哈希值输入到另一个哈希运算模块中进行哈希计算,获得一个待验证的哈希值;

若所述待验证的哈希值与所述top寄存器中的哈希值相等,则获知所述前一帧所对应的函数体的返回地址未被篡改,利用出栈的哈希值更新所述top寄存器。

具体地,本发明实施例主要利用哈希运算来保护返回地址。选择哈希运算是因为很难通过hash的输出反推hash的输入,攻击者也很难通过控制输入来输出一个希望获得的输出值。

在函数调用时,当前帧所在链式结构所对应的top寄存器存储的是所述当前帧所在链式结构上的最新的哈希值是指根据入栈的返回地址和哈希值计算得到的新的哈希值。

在函数返回时,当前帧所在链式结构所对应的top寄存器存储的是所述当前帧所在链式结构上的最新的哈希值是通过检测与所述当前帧处于同一链式结构上的前一帧中所存储的返回地址是否被篡改来确定的。

本发明实施例中调用指令(call指令)的执行过程如下:1)将返回地址和top寄存器中的哈希(hash)值一起压入栈;2)将入栈的数据(即上一步中的返回地址和哈希值)以及salt寄存器中存储的随机数输入到哈希运算模块中进行哈希计算,计算得到一个新的哈希值(正确哈希值),将新的哈希值存入top寄存器中;3)跳转到调用指令的目标地址。

本发明实施例中返回指令(return指令)的执行过程如下:1)将待验证返回地址和栈顶帧中的hash值出栈,将出栈的数据(即上一步中的待验证返回地址和hash值)输入到另外一个哈希运算模块中进行哈希运算,获得待验证hash值;2)将待验证hash值与top寄存器中保存的hash值(正确hash值)进行比对,如果两者不相等,说明待验证的返回值和/或出栈的hash值被篡改了,出现了异常,应该报警并中断程序运行;如果两者相等,说明待验证返回地址和出栈的hash值均没有被篡改;3)利用出栈的hash值更新top寄存器。

值得说明的是,为了实现上述实施例,实际开发中,在执行本发明实施例的服务器中需要保证至少有两个top寄存器和一个salt寄存器。其中,top寄存器用于保存最新的hash值,salt寄存器中所存储的挑战值是hash函数的另一个输入,一般为一个随机值、也可以是其他类型的值,进一步加大hash函数被猜测破解的难度。

基于上述实施例的内容,所述获得一个待验证的哈希值之后,还包括:

若所述待验证的哈希值与所述top寄存器中的哈希值不相等,则获知所述前一帧所对应的函数体的返回地址被篡改,抛出一个异常。

具体地,若所述待验证的哈希值与所述top寄存器中的哈希值不相等,则说明所述前一帧所对应的函数体的返回地址和/或出栈的哈希值被篡改,抛出一个异常。

本发明另一实施例,在上述各实施例的基础上,进行哈希计算时,轮番使用第1,2…,m个哈希运算模块,其中,m为大于等于n的自然数。

具体地,若当前哈希运算使用第p个哈希模块,则下一次使用第p+1个哈希模块,保证哈希模块的均衡使用。为了满足同一条链上的哈希运算,哈希运算模块的数量大于等于链式结构的数量。

本发明实施例不对哈希运算模块使用的哈希算法作限制。

在多链的实现中,除了哈希模块增加与top寄存器同样的倍数的实现方法外,还可以通过增加哈希模块的吞吐量来实现多链。例如,如果哈希模块由m个矩阵变换组成,则可以将这个哈希模块内的中间寄存器增加到m倍,在进行哈希计算时,通过轮番利用第1,2…,m个中间寄存器来复用所述哈希运算模块已有的矩阵变换电路,达到多个哈希模块同时计算的效果。

这种方案的优点是仅增加中间寄存器的倍数,硬件开销相对较小。缺点是相较于哈希模块加倍的多链来讲,会增加部分流水线停顿;而且吞吐量受限于该哈希模块单轮运算的周期数。

本发明另一实施例,在上述各实施例的基础上,所述每条链式结构还对应一个tmp寄存器,所述tmp寄存器用于存储最近一次从该条链式结构的栈中取出的哈希值。

具体地,当函数体在某条链上反复调用、返回时,例如call-return-call,该函数体使用的是同一个top寄存器和不同的哈希模块。不同的哈希模块保证了这些哈希运算可以并行执行,但是注意到,如果在return的哈希运算还没结束时就执行call指令了,由于top寄存器的值还没回退到上一次的值,则call指令保存到栈中的值可能会出错。对于这种情况,可以通过对每条链式结构再添加一个tmp寄存器来解决。即return的时候,利用出栈的哈希值进行校验的同时,也将出栈的哈希值保存到对应的tmp寄存器中,这样一来,即使return的哈希运算还没结束,下一次call时依然可以保存对应的哈希值,开始哈希值的更新运算;如果return读出来的哈希值被篡改过,流水线依然会报错,只是延迟了而已。

如图2所示,为本发明实施例提供的一种检测函数返回地址被篡改的方法的流程示意图,基于上述各实施例所述的多链哈希栈结构,包括:

步骤100、将所述多链哈希栈结构中的任一帧作为当前帧,当所述当前帧所对应的函数体调用子函数时,确定所述当前帧所在的链式结构,获取所述当前帧所在的链式结构所对应的top寄存器中的哈希值;

具体地,设当前帧所对应的函数体在所述多链哈希栈结构中的深度为m,则当前帧所在的链式结构为第m%n(模运算)条链式结构。

步骤200、将所述当前帧所对应的函数体的返回地址和所述当前帧所在的链式结构所对应的top寄存器中的哈希值压入栈,并将入栈的返回地址和哈希值输入到一个哈希运算模块中进行哈希计算,获得一个新的哈希值,将所述新的哈希值存储至所述top寄存器中;

具体地,将所述当前帧所对应的函数体的返回地址和所述当前帧所在的链式结构所对应的top寄存器中的哈希值压入栈,并将入栈的返回地址和哈希值以及salt寄存器中的随机数输入到一个哈希运算模块中进行哈希计算,获得一个新的哈希值,并将所述新的哈希值存储至所述top寄存器中。

步骤300、当所述当前帧所对应的函数体返回时,将所述当前帧中存储的返回地址和哈希值弹出栈,并将出栈的返回地址和哈希值输入到另一个哈希运算模块中进行哈希计算,获得一个待验证的哈希值;

具体地,验证当前帧中存储的返回地址是否被篡改,当所述当前帧所对应的函数体返回时,将所述当前帧中存储的返回地址和哈希值弹出栈,并将出栈的返回地址和哈希值以及salt寄存器中的随机数输入到另一个哈希运算模块中进行哈希计算,获得一个待验证的哈希值。

每次进行哈希运算时使用不同的哈希运算模块,能够避免哈希运算需要等待还处于计算状态的哈希运算模块的问题。

步骤400、若所述待验证的哈希值与所述top寄存器中存储的所述新的哈希值相等,则获知所述待验证返回地址未被篡改,并利用出栈的哈希值更新所述top寄存器;或者,若所述待验证的哈希值与所述top寄存器中存储的所述新的哈希值不相等,则获知所述待验证返回地址被篡改。

值得说明的是,为了实现上述各具体实施例,实际开发中,在执行本发明实施例提供的一种检测函数返回地址被篡改的方法的处理器中需要保证有至少两个top寄存器和一个salt寄存器。其中,top寄存器用于保存最新的hash值,salt寄存器中所存储的挑战值是hash函数的另一个输入,一般为一个随机值、也可以是其他类型的值,进一步加大hash函数被猜测破解的难度。

本发明实施例提供的检测函数返回地址被篡改的方法,能够严格保证返回地址不会被恶意篡改,同时减少了链式哈希栈的性能损耗。

基于上述实施的内容,所述检测函数返回地址被篡改的方法还包括:

若还未算出待验证的哈希值,而当前帧所对应的函数体又调用了一个子函数,则将当前帧所在的链式结构所对应的tmp寄存器中的哈希值压入栈,并与所述当前帧的返回地址输入到一个哈希运算模块中进行哈希计算,获得另一个新的哈希值,将所述另一个新的哈希值存储至所述top寄存器中。

而待验证的哈希值一算出来,也便验证了tmp寄存器中的哈希值是否正确。

图3为本发明实施例提供的电子设备的实体结构示意图,如图3所示,该电子设备可以包括:处理器(processor)310、通信接口(communicationsinterface)320、存储器(memory)630和通信总线340,其中,处理器310,通信接口320,存储器330通过通信总线340完成相互间的通信。处理器310可以调用存储在存储器330上并可在处理器310上运行的计算机程序,以执行上述各方法实施例所提供的检测函数返回地址被篡改的方法,例如包括:将所述多链哈希栈结构中的任一帧作为当前帧,当所述当前帧所对应的函数体调用子函数时,确定所述当前帧所在的链式结构,获取所述当前帧所在的链式结构所对应的top寄存器中的哈希值;将所述当前帧所对应的函数体的待验证返回地址和所述当前帧所在的链式结构所对应的top寄存器中的哈希值压入栈,并将入栈的返回地址和哈希值输入到一个哈希运算模块中进行哈希计算,获得一个新的哈希值,将所述新的哈希值存储至所述top寄存器中;当所述当前帧所对应的函数体返回时,将所述当前帧中存储的返回地址和哈希值弹出栈,并将出栈的返回地址和哈希值输入到另一个哈希运算模块中进行哈希计算,获得一个待验证的哈希值;若所述待验证的哈希值与所述top寄存器中存储的所述新的哈希值相等,则获知所述待验证返回地址未被篡改,并利用出栈的哈希值更新所述top寄存器;或者,若所述待验证的哈希值与所述top寄存器中存储的所述新的哈希值不相等,则获知所述待验证返回地址被篡改。

此外,上述的存储器330中的逻辑指令可以通过软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明实施例的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(rom,read-onlymemory)、随机存取存储器(ram,randomaccessmemory)、磁碟或者光盘等各种可以存储程序代码的介质。

本发明实施例还提供一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现上述各方法实施例提供的检测函数返回地址被篡改的方法,例如包括:将所述多链哈希栈结构中的任一帧作为当前帧,当所述当前帧所对应的函数体调用子函数时,确定所述当前帧所在的链式结构,获取所述当前帧所在的链式结构所对应的top寄存器中的哈希值;将所述当前帧所对应的函数体的待验证返回地址和所述当前帧所在的链式结构所对应的top寄存器中的哈希值压入栈,并将入栈的返回地址和哈希值输入到一个哈希运算模块中进行哈希计算,获得一个新的哈希值,将所述新的哈希值存储至所述top寄存器中;当所述当前帧所对应的函数体返回时,将所述当前帧中存储的返回地址和哈希值弹出栈,并将出栈的返回地址和哈希值输入到另一个哈希运算模块中进行哈希计算,获得一个待验证的哈希值;若所述待验证的哈希值与所述top寄存器中存储的所述新的哈希值相等,则获知所述待验证返回地址未被篡改,并利用出栈的哈希值更新所述top寄存器;或者,若所述待验证的哈希值与所述top寄存器中存储的所述新的哈希值不相等,则获知所述待验证返回地址被篡改。

以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。

通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如rom/ram、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。

最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。

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