CN105468965A - 一种动态堆栈内存管理方法 - Google Patents
一种动态堆栈内存管理方法 Download PDFInfo
- Publication number
- CN105468965A CN105468965A CN201410413067.8A CN201410413067A CN105468965A CN 105468965 A CN105468965 A CN 105468965A CN 201410413067 A CN201410413067 A CN 201410413067A CN 105468965 A CN105468965 A CN 105468965A
- Authority
- CN
- China
- Prior art keywords
- program
- stack
- local variable
- frame pointer
- return address
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Landscapes
- Devices For Executing Special Programs (AREA)
Abstract
本发明公开一种动态堆栈内存管理方法,其特征在于,在计算机程序执行时,每次子过程被调用并分配当前过程的堆栈空间时,象正常情况一样保存调用参数,返回地址,但是保存帧指针和分配局部变量的时候,在帧指针和局部变量起始地址之间分配一段额外内存空间或者在返回地址和帧指针之间额外分配一段额外内存空间,此额外空间的大小在程序执行的时候随机决定,这样堆栈内存中返回地址和局部变量的相对位置无法通过分析源程序或编译后的目标程序得到。本发明可以同时检测出当前执行程序是否正在被攻击并可以防止被攻击,有效地防止了攻击者利用堆栈缓冲区溢出进行攻击。
Description
技术领域
本发明涉及一种动态堆栈内存管理方法。
背景技术
缓冲区是程序运行时候在计算机内存中存放数据的地方。当程序试图将一段数据写到某一段内存缓冲区中时,如果数据的长度超过缓冲区的长度,就会发生缓冲区溢出。攻击者可以利用这一弱点对计算机进行攻击。攻击者把一个超过缓冲区长度的字符串写入到缓冲区。由于写入的超长的字符串覆盖了相邻的存储单元,常常会导致两种结果。一是引起程序运行失败,严重的可导致系统崩溃;另外一种结果就是利用这种漏洞执行恶意指令。如果被攻击的程序在超级用户权限上执行,那么攻击者也可以获得系统超级用户的权限。结果是一个匿名的因特网攻击者往往有机会获得一台主机的部分或全部的控制权。缓冲区溢出攻击已经成为操作系统、数据库,万维网服务器等大型应用程序最普遍的漏洞之一。现有的解决办法
针对上述的问题,目前为止已经存在多种解决办法。和本发明较为接近的主要有两种技术。一是美国IMMUNIX公司的StackGuard技术,另一个是日本IBM研究院的Proplice技术,这两种技术都是通过修改C语言的编译器,在生成的目标代码中附加上缓冲区溢出检测功能。其优点是在原来的程序在不需要任何的改动。拿技术来说,为了探测是否有攻击者对返回地址进行攻击,当一个新的函数被调用时,它将一个“canary”值(一个单字)放到返回地址的前面。如果当函数返回时,发现这个的值被改变了,就证明可能有人正在试图进行缓冲区溢出攻击。程序会立刻响应,并将被攻击的进程的相关信息记录下来,然后终止被攻击的进程。日本IBM研究院的Proplice技术在借鉴了StackGuard技术的基础上,重新安排了局部变量的顺序。这样当字符串变量被写入超长的字符串时,别的类型的局部变量的值不会遭到破坏,从而把攻击的危害减少到最小程度。
但是通过分析源程序或分析使用这两种技术编译后的目标程序,攻击者可以确定运行时堆栈具体结构。即攻击者通过分析代码可以确切获得返回地址和分配的局部变量之间的相对偏移。攻击者可以根据运行时候的堆栈结构来改变返回地址的值,但同时并不改变“canary”的值,从而绕过StackGuard技术和Proplice技术对返回地址的保护,有效地实行缓冲区攻击。
发明内容
为解决上述现有的缺点,本发明的主要目的在于提供一种实用的动态堆栈内存管理方法,它可以同时检测出当前执行程序是否正在被攻击并可以防止被攻击,有效地防止了攻击者利用堆栈缓冲区溢出进行攻击。
为达成以上所述的目的,本发明的一种动态堆栈内存管理方法采取如下技术方案:
一种动态堆栈内存管理方法,其特征在于,在计算机程序执行时,每次子过程被调用并分配当前过程的堆栈空间时,象正常情况一样保存调用参数,返回地址,但是保存帧指针和分配局部变量的时候,在帧指针和局部变量起始地址之间分配一段额外内存空间或者在返回地址和帧指针之间额外分配一段额外内存空间,此额外空间的大小在程序执行的时候随机决定,这样堆栈内存中返回地址和局部变量的相对位置无法通过分析源程序或编译后的目标程序得到,可以有效地防止利用堆栈缓冲区溢出来对计算机系统进行攻击,在分配局部参数内存空间时,在帧指针和局部变量起始地址之间多分配一段内存空间或者在返回地址和帧指针之间多分配一段内存空间,这样局部变量和返回地址之间的相对偏移就增加了一段额外的长度,这段额外长度的具体大小在每次运行的时候通过产生一个随机数获得,其中额外长度的内存缓冲区中也可以放入类似StackGuard技术中的“canary”值,从而检测出当前执行程序是否正在被攻击。
所述额外长度由随机函数发生器子程序来实现,计算机目标程序执行时具有上述权利要求1的特征,相应的编译器能产生权利要求1的特征的目标程序。
采用如上技术方案的本发明,具有如下有益效果:
本发明可以同时检测出当前执行程序是否正在被攻击并可以防止被攻击,有效地防止了攻击者利用堆栈缓冲区溢出进行攻击。
附图说明
图1传统程序运行时堆栈内存结构和使用本技术编译后的程序运行时堆栈内存结构(局部变量和返回地址之间增加了一段随即的长度)的示意图。
图2普通的程序执行时的堆栈内存结构。
图3使用缓冲区攻击后的程序执行时的堆栈内存结构。
图4使用本发明后堆栈调用时的结构。
具体实施方式
为了进一步说明本发明,下面结合附图进一步进行说明:
上面是本发明的基本原理,可以有多种实现方式。比如可以使用特别的内存设备(包括软件设备和硬件设备)来实现。也可以使用特别的计算机系统来实现。也可以改写编译器来生成具有上述功能的目标程序。总之本原理精神范围内的各种各样的实现方式都应该包括进来。下面举出一个示例来具体说明使用本方法的程序的执行过程。
Ⅰ.正常程序的执行过程:
我们以图2为例来说明正常的程序执行流程。我们使用函数foo被函数bar调用的例子来加以说明。假设函数被调用时堆栈帧从髙地址向低地址方向增长。图2中函数foo把环境变量ENV-_STR的内容使用C语言的库函数getenv得到后,使用C语言的库函数strcpy拷贝到大小为128字节的字符串数组buffer中。foo被调用后,为了保存foo的动态执行环境,下面的信息被保存在堆栈中。调用参数、返回地址、前堆栈帧指针、局部变量。
我们下面使用SP来代表堆栈指针,使用FP来代表帧指针,使用RA来代表返回地址。
●函数foo被调用前,堆栈指针(SP)指向堆栈帧的最底部,帧指针(FP)指向的前一堆栈帧的帧指针变量(FP)。从帧指针(FP)的下一个地址到堆栈指针(SP)之间存放了函数的局部变量。
●函数foo被调用后,首先在堆栈中保存了foo的调用参数,然后保存了返回1bar的返回地址。然后保存了前一帧指针(FP)。最后分配了foo的局部参数。此时堆栈指针(SP)指向最下位。函数化foo便可以开始执行了。
●函数foo执行后,函数foo执行终了后,按照上记的相反的顺序,堆栈指针(SP)和帧指针(FP)也回到了函数foo被调用前的值。然后返回到foo的返回地址以指向的程序,继续执行bar部分的程序。
Ⅱ.典型的缓冲区溢出攻击方式:
函数foo的堆栈构造很容易从foo的源程序和编译后的目标程序中分析出来。然后按照分析的结果来对执行的程序进行攻击。我们以图3来对攻击过程进行说明。假设攻击者已经改写了环境变量,在字符串拷贝的时候,返回地址被ADDR--_X给覆盖了,而局部变量的内容被恶意攻击代码覆盖了。并且ADDR--_X指向这段攻击代码。比如函数foo被调用后,会执行strcpy。由于strcpy一般不会检查输入字符串的大小,这样从局部变量一直到以返回地址部分都被改写。函数foo执行结束后,没有返回到bar程序中继续执行,而是返回到了那段恶意攻击代码处。这样恶意攻击程序就掌握了主动权并开始执行。而且由于前帧指针也被改写了,返回到bar时正确的帧指针也无法正确得到。这样可能会发生不可预测的执行错误。
Ⅲ.利用动态堆栈内存管理技术来防止缓冲区溢出攻击:
我们结合图4以函数foo被调用执行时候的堆栈构造过程为例来说明。首先目标程序象正常情况一样保存了调用参数,返回地址和帧指针,但是在分配局部变量的时候,本方法会动态地分配比正常的局部变量需要的空间更大的内存空间。比如在图4中分配大小为alpha空间。alpha的具体大小在运行的时候随机动态地决定。(这个大小为alpha的缓冲区也可以被用做它用)。
在增加alpha大小的缓冲区后,帧指计的值可以指向图中虚线,也可以指向图中实线的位置。程序将随之使用不同的办法来查找调用参数和局部变量。使用本发明的堆栈内存管理方法,即使是同一段程序,每次执行的时候局部变量部分分配的额外空间大小可能都不一样。通过分析源程序和编译后的程序无法检测出返回地址的准确位置。因此很难有效地实施堆栈攻击。
可以使用随机函数发生器来产生随机大小的额外缓冲区长度.一个具体的随机函数发生器的例子如下所示:
staticintrandval=0;
randomGenerator()
{
If(randval=0)
{
srand(time(0));
randval=rand()%100+10;
}
returnrandval;
}。
Claims (2)
1.一种动态堆栈内存管理方法,其特征在于,在计算机程序执行时,每次子过程被调用并分配当前过程的堆栈空间时,象正常情况一样保存调用参数,返回地址,但是保存帧指针和分配局部变量的时候,在帧指针和局部变量起始地址之间分配一段额外内存空间或者在返回地址和帧指针之间额外分配一段额外内存空间,此额外空间的大小在程序执行的时候随机决定,这样堆栈内存中返回地址和局部变量的相对位置无法通过分析源程序或编译后的目标程序得到,可以有效地防止利用堆栈缓冲区溢出来对计算机系统进行攻击,在分配局部参数内存空间时,在帧指针和局部变量起始地址之间多分配一段内存空间或者在返回地址和帧指针之间多分配一段内存空间,这样局部变量和返回地址之间的相对偏移就增加了一段额外的长度,这段额外长度的具体大小在每次运行的时候通过产生一个随机数获得,其中额外长度的内存缓冲区中也可以放入类似StackGuard技术中的“canary”值,从而检测出当前执行程序是否正在被攻击。
2.根据权利要求1所述的一种动态堆栈内存管理方法,其特征在于,所述额外长度由随机函数发生器子程序来实现,计算机目标程序执行时具有上述权利要求1的特征,相应的编译器能产生权利要求1的特征的目标程序。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410413067.8A CN105468965A (zh) | 2014-08-21 | 2014-08-21 | 一种动态堆栈内存管理方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410413067.8A CN105468965A (zh) | 2014-08-21 | 2014-08-21 | 一种动态堆栈内存管理方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN105468965A true CN105468965A (zh) | 2016-04-06 |
Family
ID=55606652
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410413067.8A Pending CN105468965A (zh) | 2014-08-21 | 2014-08-21 | 一种动态堆栈内存管理方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN105468965A (zh) |
Cited By (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107402759A (zh) * | 2017-07-20 | 2017-11-28 | 北京计算机技术及应用研究所 | 基于aadl扩展附件的软件系统堆栈分析方法 |
CN108573143A (zh) * | 2017-03-10 | 2018-09-25 | 南京大学 | 基于程序插桩和动态信息验证的栈保护方法 |
CN109784048A (zh) * | 2018-12-12 | 2019-05-21 | 江苏大学 | 一种基于程序图的栈缓冲区溢出脆弱性检测方法 |
CN109947476A (zh) * | 2019-02-25 | 2019-06-28 | 星汉智能科技股份有限公司 | 一种运行时栈空间的统计方法及系统 |
CN112463536A (zh) * | 2020-11-27 | 2021-03-09 | 宁波拓普集团股份有限公司 | 一种软件堆栈区域非法篡改监控系统及方法 |
CN112948818A (zh) * | 2021-03-02 | 2021-06-11 | 北京明略昭辉科技有限公司 | 一种防止堆栈溢出攻击的保护方法及系统 |
CN113238800A (zh) * | 2021-05-25 | 2021-08-10 | 上海安路信息科技股份有限公司 | 堆栈结构和函数调用方法及系统 |
CN113485716A (zh) * | 2021-09-03 | 2021-10-08 | 支付宝(杭州)信息技术有限公司 | 防内存越界的程序编译方法及装置 |
CN115705294A (zh) * | 2021-08-12 | 2023-02-17 | 华为技术有限公司 | 用于获取函数调用信息的方法、装置、电子设备和介质 |
-
2014
- 2014-08-21 CN CN201410413067.8A patent/CN105468965A/zh active Pending
Cited By (13)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108573143A (zh) * | 2017-03-10 | 2018-09-25 | 南京大学 | 基于程序插桩和动态信息验证的栈保护方法 |
CN107402759B (zh) * | 2017-07-20 | 2020-07-17 | 北京计算机技术及应用研究所 | 基于aadl扩展附件的软件系统堆栈分析方法 |
CN107402759A (zh) * | 2017-07-20 | 2017-11-28 | 北京计算机技术及应用研究所 | 基于aadl扩展附件的软件系统堆栈分析方法 |
CN109784048A (zh) * | 2018-12-12 | 2019-05-21 | 江苏大学 | 一种基于程序图的栈缓冲区溢出脆弱性检测方法 |
CN109784048B (zh) * | 2018-12-12 | 2023-12-01 | 天航长鹰(江苏)科技有限公司 | 一种基于程序图的栈缓冲区溢出脆弱性检测方法 |
CN109947476A (zh) * | 2019-02-25 | 2019-06-28 | 星汉智能科技股份有限公司 | 一种运行时栈空间的统计方法及系统 |
CN112463536B (zh) * | 2020-11-27 | 2022-08-05 | 宁波拓普集团股份有限公司 | 一种软件堆栈区域非法篡改监控系统及方法 |
CN112463536A (zh) * | 2020-11-27 | 2021-03-09 | 宁波拓普集团股份有限公司 | 一种软件堆栈区域非法篡改监控系统及方法 |
CN112948818A (zh) * | 2021-03-02 | 2021-06-11 | 北京明略昭辉科技有限公司 | 一种防止堆栈溢出攻击的保护方法及系统 |
CN113238800A (zh) * | 2021-05-25 | 2021-08-10 | 上海安路信息科技股份有限公司 | 堆栈结构和函数调用方法及系统 |
CN115705294A (zh) * | 2021-08-12 | 2023-02-17 | 华为技术有限公司 | 用于获取函数调用信息的方法、装置、电子设备和介质 |
CN113485716B (zh) * | 2021-09-03 | 2021-11-23 | 支付宝(杭州)信息技术有限公司 | 防内存越界的程序编译方法及装置 |
CN113485716A (zh) * | 2021-09-03 | 2021-10-08 | 支付宝(杭州)信息技术有限公司 | 防内存越界的程序编译方法及装置 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN105468965A (zh) | 一种动态堆栈内存管理方法 | |
US11777705B2 (en) | Techniques for preventing memory timing attacks | |
EP2324424B1 (en) | Apparatus and method for handling page protection faults in a computing system | |
CN109643345B (zh) | 用于确定性代码流完整性保护的技术 | |
US20060095895A1 (en) | Method and apparatus for inserting code | |
CN110442379A (zh) | 保护有条件的推测指令执行 | |
CN107220544A (zh) | 用于检测感兴趣指令序列的系统和方法 | |
CN1294468C (zh) | 一种防止缓冲区溢出攻击的动态堆栈内存管理方法 | |
CN101866406A (zh) | 一种栈溢出攻击防御方法 | |
CN112639789A (zh) | 用于存储器完好性检查的完好性树 | |
CN103995705A (zh) | 一种操作系统地址空间随机化分配系统及方法 | |
JP2019215847A (ja) | バッファオーバーフローの低減 | |
Mukhtar et al. | Flush+ prefetch: A countermeasure against access-driven cache-based side-channel attacks | |
CN109460237A (zh) | 代码的编译方法及装置 | |
US10083125B2 (en) | Method to efficiently implement synchronization using software managed address translation | |
CN112000484A (zh) | 栈帧地址随机化方法及相关设备 | |
US20100030967A1 (en) | Method and system for securing instruction caches using substantially random instruction mapping scheme | |
CN102521079A (zh) | 软件栈缓冲区溢出的容错方法 | |
CN107729747A (zh) | 一种面向二进制程序的堆溢出检测方法 | |
US7836434B1 (en) | Method and system for analyzing array access to a pointer that is referenced as an array | |
Zhang et al. | Cape: compiler-aided program transformation for htm-based cache side-channel defense | |
Feifei | The principle and prevention of windows buffer overflow | |
KR102324950B1 (ko) | 취약점을 효율적으로 탐지할 수 있는 아키텍처로 구성된 힙 영역 메모리 관리 방법 및 그 장치 | |
Hu et al. | FaultMorse: An automated controlled-channel attack via longest recurring sequence | |
US20210182175A1 (en) | Compilation scheme for tagged global variables |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication |