防止缓冲区溢出杜绝如今最常见的程序缺陷方案
浅析缓冲区溢出攻击技术以及防范策略
下 面我 们 就列 举 一个 简 单 的缓 冲 区溢 出的例 子 :
sa kl C tc , #n ld <sdi. > icu e t o h
it an it g ,hr rv( nm i ( a cc a* ag ) nr c abf1 ] hru[O ; s c yb f rv 1) t p (u, g【 ]; r a
p it ” h sr gs k ,u ) r f T et n i%s n( i n”b r;
r t mO; eu
e ix O 8 d 3 51 6 6 d0 8 4 3 O1 4 3 1
ep x 41 41 x 41 41 iO 41 41 O 41 41
当 覆 盖 3 B 'S 的 “ 时 , 仅 覆 盖 了 程 序 的 其 他 数 据 , 且 覆 2 YI K A” 不 而 盖 了 程 序 的 EP 地 址 , 时 程 序 无 法 正 常 返 回 。 们 就 可 以 改 变 程 序 I 此 我 的 执 行 流 程 , 果 攻 击 者 利 用 了 程 序 的 这 个 缺 陷 。 覆 盖 E P地 址 的 如 将 I
这 是 一 个 存 在 缓 冲 区 溢 出 漏 洞 的 程 序 。 构 造 一 个 1 B T S的 被攻 击 者 控制 的 危 险 。 先 0Y E 二 缓 冲 区 溢 出 的 预 防 与 检 测 技 术
2 1缓 冲 区 溢 出 攻 击 的 防 护 ,
1B T S时 , 会 造 成缓 冲 区溢 出 , 体 操作 : 0YK 就 具
技 术 中 , 冲 区溢 出对 计 算 机 系 统 造 成 的 危 害 最 大 。 史 上 最 著 名 寄 存 器 中 的 值 变 化 如 下 : 缓 历
a00 的 缓 冲 区溢 出攻 击 可 能 要 算 是 18 9 8年 1 1月 2 日的 Mor Wom ( rs r 莫 ex x 0 i c O 42 2e2 8 3 8 4 1 尔 斯 蠕 虫 ) 。 它 可 以 使 攻 击 者 有 机 会 获 得 一 台 主 机 的 部 分 获 全 部 ex x 1 e 01 O 5 6 6 了
缓冲区溢出原因及解决
第三讲缓冲区溢出n1 缓冲区溢出问题简介n2 几种典型的缓冲区溢出n3 防范措施缓冲区溢出1 缓冲区溢出问题简介缓冲区溢出是一种常见的漏洞.据统计,通过缓冲区溢出进行的攻击占所有系统攻击总数的80%以上.这种错误的状态发生在写入内存的数据超过了分配给缓冲区的大小的时候,就像一个杯子只能盛一定量的水,如果放到杯子中的水太多,多余的水就会一出到别的地方。
由于缓冲区溢出,相邻的内存地址空间被覆盖,造成软件出错或崩溃。
如果没有采取限制措施,可以使用精心设计的输入数据使缓冲区溢出,从而导致安全问题。
缓冲区溢出缓冲区溢出问题的历史很长一段时间以来,缓冲区溢出都是一个众所周知的安全问题, C程序的缓冲区溢出问题早在70年代初就被认为是C语言数据完整性模型的一个可能的后果。
这是因为在初始化、拷贝或移动数据时,C语言并不自动地支持内在的数组边界检查。
虽然这提高了语言的执行效率,但其带来的影响及后果却是深远和严重的。
•1988年Robert T. Morris的finger蠕虫程序.这种缓冲区溢出的问题使得Internet几乎限于停滞,许多系统管理员都将他们的网络断开,来处理所遇到的问题. •1989年Spafford提交了一份关于运行在VAX机上的BSD版UNIX的fingerd的缓冲区溢出程序的技术细节的分析报告,引起了部分安全人士对这个研究领域的重视•1996年出现了真正有教育意义的第一篇文章, Aleph One在Underground发表的论文详细描述了Linux系统中栈的结构和如何利用基于栈的缓冲区溢出。
缓冲区溢出Aleph One的贡献还在于给出了如何写开一个shell的Exploit的方法,并给这段代码赋予shellcode的名称,而这个称呼沿用至今,我们现在对这样的方法耳熟能详--编译一段使用系统调用的简单的C程序,通过调试器抽取汇编代码,并根据需要修改这段汇编代码。
•1997年Smith综合以前的文章,提供了如何在各种Unix变种中写缓冲区溢出Exploit更详细的指导原则。
一种防止堆缓冲区溢出的有效方法
一种防止堆缓冲区溢出的有效方法
缓冲区溢出的漏洞随着冯·诺依曼构架的出现就已经开始出现了。
在1988年随着莫里斯互联网蠕虫的广泛传播他们开始声名狼藉。
不幸的是,同样的这种攻击一直持续到今天。
一方面,根据程序运行存储设计的缺陷,攻击者通过各种渠道能够准确无误的攻击目标地址,并让自己的恶意代码来肆意运行,以破坏计算机系统安全;另一方面,对于攻击者的攻击,我们没有有效的方法从根本上来制止。
到目前为止,防范无穷无尽的缓冲区溢出攻击变种的唯一方法是对所有的应用程序进行完善的设计、编码和测试。
相比于其他因素,缓冲区溢出属于攻击中最典型的一类攻击。
对于缓冲区溢出,我们可以分为两类,一类是基于栈缓冲区的溢出,另一类是基于堆的缓冲区溢出,虽然基于栈的攻击仍然是更加频繁和重要,并取得了一定的进展;但基于堆的溢出最近获取了更多注意。
本文详细分析了进程的内存组织形式、堆缓冲区溢出的基本理论和堆缓冲区溢出的各种类型。
总结出堆缓冲区溢出是因为攻击者对堆中的关键数据进行篡改,或向堆缓冲区中注入恶意代码,以破坏计算机系统。
针对攻击者的攻击目标——堆元数据(堆管理结构信息),提出了一种新的堆缓冲区溢出的防范机制,其基本思想是通过分离堆元数据和堆中用户数据来防止堆缓冲区溢出,对堆元数据进行特殊存储,使得攻击者很难对其进行更改,以达到防止堆缓冲区溢出的目标。
实验表明新的堆缓冲区防范机制能够有效地防止堆缓冲区溢出。
缓冲区溢出攻击与防范实验报告
缓冲区溢出攻击与防范实验报告——计算机网络(2)班——V200748045黄香娥1·缓冲区溢出的概念:缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量溢出的数据覆盖在合法数据上,理想的情况是程序检查数据长度并不允许输入超过缓冲区长度的字符,但是绝大多数程序都会假设数据长度总是与所分配的储存空间想匹配,这就为缓冲区溢出埋下隐患.操作系统所使用的缓冲区又被称为"堆栈". 在各个操作进程之间,指令会被临时储存在"堆栈"当中,"堆栈"也会出现缓冲区溢出。
2·缓冲区溢出的危害:在当前网络与分布式系统安全中,被广泛利用的50%以上都是缓冲区溢出,其中最著名的例子是1988年利用fingerd漏洞的蠕虫。
而缓冲区溢出中,最为危险的是堆栈溢出,因为入侵者可以利用堆栈溢出,在函数返回时改变返回程序的地址,让其跳转到任意地址,带来的危害一种是程序崩溃导致拒绝服务,另外一种就是跳转并且执行一段恶意代码,比如得到shell,然后为所欲为。
3·缓冲区溢出原理:由一个小程序来看://test.c#include "stdio.h"#include "stdlib.h"#include "string.h"void overflow(void){char buf[10];strcpy(buf,"0123456789123456789");}//end overflowint main(void){overflow();return 0;}//end main按F11进入"Step into"调试模式,如下:按F11跟踪进入overflow,让程序停在6,现在再看一下几个主要参数:esp=0x0012ff30,eip发生了变化,其它未变。
c语言缓冲区溢出原理
c语言缓冲区溢出原理摘要:1.缓冲区溢出概念2.C语言中可能导致缓冲区溢出的原因3.缓冲区溢出的防范方法4.总结正文:正文:缓冲区溢出是计算机科学中的一种常见错误,它在编程中可能导致严重的安全问题。
本文将解释缓冲区溢出的概念,探讨其原因、危害以及如何预防。
一、什么是缓冲区溢出缓冲区溢出是指程序中的缓冲区无法容纳输入的数据,从而覆盖了其他内存区域。
这种情况通常发生在程序没有正确处理输入数据长度的情况下,导致数据超过了缓冲区的容量。
二、缓冲区溢出的原因1.字符串操作函数:在C语言中,一些字符串操作函数(如gets、strcpy 等)没有对输入数据长度进行限制,可能导致缓冲区溢出。
2.动态内存分配:在使用动态内存分配函数(如malloc)分配内存时,如果未正确初始化或超量分配,可能导致缓冲区溢出。
3.函数调用:在调用函数时,如果传入的参数长度超过预期,可能导致缓冲区溢出。
三、缓冲区溢出的危害1.程序崩溃:缓冲区溢出可能导致程序崩溃,因为覆盖的内存区域可能包含程序的重要数据或代码。
2.数据损坏:缓冲区溢出可能导致数据损坏,因为覆盖的内存区域可能包含程序处理数据的正确结果。
3.安全漏洞:缓冲区溢出可能被恶意利用,攻击者可以通过注入恶意数据来覆盖内存中的安全关键数据,如密码、加密密钥等。
四、如何预防缓冲区溢出1.检查输入数据长度:在对输入数据进行处理之前,应检查数据长度,确保不会超过缓冲区容量。
2.使用安全的字符串操作函数:尽量使用带有长度限制的字符串处理函数,如strncpy、strncat等。
3.初始化缓冲区:在使用动态内存分配时,应初始化缓冲区,并确保分配的内存空间足够大。
4.使用边界检查:在编写程序时,对输入数据进行边界检查,确保数据长度符合预期。
常见系统漏洞的处理方案
常见系统漏洞的处理方案常见的系统漏洞包括操作系统漏洞、网络协议漏洞、应用程序漏洞等,针对这些漏洞的处理方案主要包括以下几点:2.定期漏洞扫描和测试:企业应建立和实施定期的漏洞扫描和渗透测试机制,通过使用专业的漏洞扫描工具或安全服务提供商,对系统进行全面的扫描和测试,及时发现并修复潜在的漏洞。
3.强化访问控制:通过完善的访问控制机制,包括身份验证、权限管理和安全策略等,限制用户的访问权限,防止未经授权的访问和操作。
应该采用最小权限原则,确保用户只能访问他们需要的资源和功能。
4.安全配置和加固:对于操作系统、网络设备、服务器和应用程序等,实施安全配置和加固,禁用或限制不必要的服务和功能,关闭或限制不必要的端口和协议,提高系统的安全性和防护能力。
5.日志管理和监控:建立完善的日志管理和监控机制,记录和分析系统的日志信息,监测和检测异常行为和安全事件。
及时发现和响应安全事件,追踪攻击者的行为,提供安全审计和溯源功能。
6.应用程序安全开发:在应用程序的开发过程中,应采用安全的开发方法和编码规范,进行安全代码审计和漏洞测试。
避免常见的应用程序漏洞,如缓冲区溢出、SQL注入、跨站脚本等,并及时修复已知的漏洞。
7.网络隔离和安全分区:将复杂的网络划分为不同的安全区域,采用防火墙、安全设备和安全策略等措施,实现网络隔离和安全分区,避免攻击者一次性获取全部资源和权限。
8.加密和安全传输:对于重要的数据和敏感信息,应使用加密技术进行保护,包括数据加密、通信加密和存储加密等。
确保数据在传输和存储过程中的安全性和完整性。
9.应急响应和恢复:建立和实施应急响应计划和措施,及时响应安全事件,快速恢复系统和服务。
及时备份和存档重要的数据和系统配置,以便在出现安全事件时能够快速恢复。
综上所述,处理系统漏洞需要综合考虑多个方面,从修复漏洞、加强安全设置、加固系统、加强访问控制、加密传输等多个层面入手,以确保系统的安全性和稳定性。
此外,定期漏洞测试和监控,加强用户意识和培训也是非常重要的。
简述缓冲区溢出攻击的原理以及防范方法
简述缓冲区溢出攻击的原理以及防范方法
一、缓冲区溢出攻击原理
缓冲区溢出攻击(Buffer Overflow Attack)是一种非法异常的程序运行行为,它发生的目的是让受害者的程序运行出现崩溃,从而获得机器控制权限,可以获取机器中存有的敏感资料,并进行恶意操作,如发送垃圾邮件,拒绝服务攻击(DoS attack),远程控制等行为破坏网络安全。
缓冲区溢出攻击的基本原理,就是恶意程序使用某种方法,将程序缓冲区中存放的数据或者信息溢出,超出缓冲区的容量,而这种溢出的数据又存放了受害者程序控制机器的恶意命令,从而给受害者程序植入恶意代码,使恶意程序获得了机器的控制权限,进而达到攻击系统的目的。
二、防范方法
1、使用受检程序,受检程序是一种编译技术,通过对程序源代码进行类型检查、安全检查等操作,来把漏洞修复好,从而起到防止缓冲区溢出攻击的作用。
2、使用数据流分析技术,它是一种动态分析技术,可以识别出恶意代码并阻止其危害,对程序运行的漏洞进行检查,从而防止攻击者利用缓冲区溢出攻击系统。
3、实行严格的安全审计制度,对程序源码、程序诊断、数据加密技术等进行严格的审计,确保程序运行的安全性,以及防止攻击者利用缓冲区溢出攻击系统。
4、采用虚拟化技术,虚拟化技术可以在不同的安全层次上对程序进行控制,对程序运行的过程进行审查,从而防止攻击者使用缓冲区溢出攻击系统。
5、对网络环境进行安全审计,包括电脑中存在的安全漏洞,系统的安全配置,网络设备的稳定性以及系统的社会工程学攻击等,从而确保网络环境能够不被缓冲区溢出攻击所侵袭。
缓冲区溢出原理及防范
摘要:正文:大纲:1.引言;随着网络安全技术的飞速发展,缓冲区溢出漏洞已经成为当前最具安全威胁的漏洞之一,缓冲区溢出攻击也成为一种非常有效而常见的攻击方法。
如Internet上的第1例蠕虫(Morris)攻击,就是利用了fingerd的缓冲区溢出漏洞。
SANS评选出的2005年威胁最大的20个漏洞中,有8个跟缓冲区溢出有关。
根据CNCERT最近几周的计算机安全漏洞的统计数据,与缓冲区溢出有关的安全事件占了很大的比例。
这些都充分说明了研究缓冲区溢出的重要性。
本文主要介绍了windows下的缓冲区溢出的相关知识。
2.漏洞原因和原理;2.1 产生原因;当向一个已分配了确定存储空间的缓冲区内复制多于该缓冲区处理能力的数据时,就会发生缓冲区溢出,溢出包括堆溢出和堆栈溢出。
它与程序在内存中的分布有关,而它产生的直接原因是由于C/C++程序中的一些函数调用时,没有进行边界检查,如C函数库中的strcpy(),strcat(),sprintf(),gets()等都是不安全的。
由上面的分析可知要产生缓冲区溢出,需要有几个条件: 1) 程序编译时在堆栈上分配了固定大小的缓冲区,并且在对缓冲区进行访问时没有提供边界检查。
这条在C/C ++语言中就满足,而对于有边界检查的语言,如Pascal 等,就没有这样的溢出问题。
2) 程序调用了没有进行边界检查的函数来访问(写操作) 缓冲区,这些函数没有对访问的缓冲区的大小进行判断。
由于在C语言中,字符串以0字节来标识结尾,其中没有字符串的长度信息,所以几个没有判断字符串长度的字符串拷贝函数就是容易出现问题的函数。
这些函数有: strcat()、strcpy()、sprintf()等。
3) 即使程序使用了上面所说的问题函数也不一定会出现溢出漏洞,漏洞发生的最后一个条件是程序员由于粗心,未检查用户输入数据的长度就将其直接复制到缓冲区中去。
虽然这看起来是一件小事,很容易杜绝。
可惜的是正因为有大量粗心的程序员的存在,使得溢出漏洞变得非常的普遍。
论缓冲区溢出攻击的分析和防范策略
论缓冲区溢出攻击的分析和防范策略摘要:本文主要针对缓冲区所产生的网络安全漏洞等问题进行分析和研究,并对如何维护网络的安全和稳定,保护计算机内数据信息不被外界攻击者攻击破坏而带来不便进行探讨。
并重点论述如何加强对缓冲区的注重和保护,如何对产生的网络安全问题进行及时的防范和解决。
关键词:缓冲区;缓冲区溢出;网络安全;防范策略1引言缓冲区溢出是一种常见且危害很大的系统攻击手段,通过向程序的缓冲区写入超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈使程序转而执行其它指令,以达到攻击的目的。
2缓冲区溢出攻击原理分析2.1缓冲区溢出的概念和原理缓冲区是程序运行的时候机器内存中的一个连续块,它保存了给定类型的数据,随着动态分配变量会出现问题。
大多时为了不占用太多的内存,一个有动态分配变量的程序在程序运行时才决定给它们分配多少内存。
这样想下去的话,如果说要给程序在动态分配缓冲区放入超长的数据,它就会溢出了。
一个缓冲区溢出程序使用这个溢出的数据将汇编语言代码放到机器的内存里,通常是产生root 权限的地方,这就不是什么好现象了。
仅仅就单个的缓冲区溢出惹眼,它并不是最大的问题根本所在。
但如果溢出送到能够以root权限运行命令的区域,一旦运行这些命令,那可就等于把机器拱手相让了。
2.2攻击原理引起缓冲区溢出问题的根本原因是C(与其后代C++)本质就是不安全的,没有边界来检查数组和指针的引用,也就是开发人员必须检查边界(而这一行为往往会被忽视),否则会冒遇到问题的风险。
标准C 库中还存在许多非安全字符串操作,包括:strcpy() 、sprintf() 、gets() 等。
当程序写入超过缓冲区的边界时,这就是所谓的“缓冲区溢出”。
发生缓冲区溢出时,会覆盖下一个相邻的内存块。
由于C 语言本质上的不安全性,所以它允许程序随意(或者更准确地说是完全出于偶然)溢出缓冲区。
没有运行时检查来这一防止写入超过缓冲区末尾,所以程序员必须在其自己的代码中执行这一检查,否则继续下去会出现问题。
详解缓冲区溢出攻击以及防范方法
详解缓冲区溢出攻击以及防范⽅法缓冲区溢出是⼀种在各种操作系统、应⽤软件中⼴泛存在普遍且危险的漏洞,利⽤缓冲区溢出攻击可以导致程序运⾏失败、系统崩溃等后果。
更为严重的是,可以利⽤它执⾏⾮授权指令,甚⾄可以取得系统特权,进⽽进⾏各种⾮法操作。
第⼀个缓冲区溢出攻击--Morris蠕⾍,发⽣在⼗多年前,它曾造成了全世界6000多台⽹络服务器瘫痪。
⼀、缓冲区溢出的原理:当正常的使⽤者操作程序的时候,所进⾏的操作⼀般不会超出程序的运⾏范围;⽽⿊客却利⽤缓冲长度界限向程序中输⼊超出其常规长度的内容,造成缓冲区的溢出从⽽破坏程序的堆栈,使程序运⾏出现特殊的问题转⽽执⾏其它指令,以达到攻击的⽬的。
造成缓冲区溢出的原因是程序中没有仔细检查⽤户输⼊的参数,属于程序开发过程考虑不周到的结果。
当然,随便往缓冲区中填东西造成它溢出⼀般只会出现“分段错误”(Segmentation fault),⽽不能达到攻击的⽬的。
最常见的⼿段是通过制造缓冲区溢出使程序运⾏⼀个⽤户shell,再通过shell执⾏其它命令。
如果该程序属于root且有suid权限的话,攻击者就获得了⼀个有root权限的shell,可以对系统进⾏任意操作了。
缓冲区溢出攻击之所以成为⼀种常见安全攻击⼿段其原因在于缓冲区溢出漏洞普遍并且易于实现。
⽽且缓冲区溢出成为远程攻击的主要⼿段其原因在于缓冲区溢出漏洞给予了攻击者他所想要的⼀切:植⼊并且执⾏攻击代码。
被植⼊的攻击代码以⼀定的权限运⾏有缓冲区溢出漏洞的程序,从⽽得到被攻击主机的控制权。
在1998年Lincoln实验室⽤来评估⼊侵检测的的5种远程攻击中,有2种是缓冲区溢出。
⽽在1998年CERT的13份建议中,有9份是是与缓冲区溢出有关的,在1999年,⾄少有半数的建议是和缓冲区溢出有关的。
在Bugtraq的调查中,有2/3的被调查者认为缓冲区溢出漏洞是⼀个很严重的安全问题。
缓冲区溢出漏洞和攻击有很多种形式,会在第⼆节对他们进⾏描述和分类。
针对服务器的缓冲区溢出攻击及防范
缓 冲 区 溢 出 的 实 现
下 面 较 详 细 的 讨 论 一 下 缓 冲 区溢 出 攻 击 在
类 UNI 平 台和 W id ws 台上 的 实 现 。 我 们 X no 平 仅讨 论较常 见的一种情 况 ,即上述 的第一种 一 通 过 改 写 函数 返 回 地 址 的转 跳 方 法 实 现 的 缓 冲 区溢 出 攻 击 。 这 时 候 缓 冲 区是 过 程 的 局 部 变 量 。缓 冲 区 溢 出攻 击 出 现 的 原 因 是 没 有 仔 细 检 查 用 户 输 入 的参 数 , 没有 检 查 参 数 是 否 溢 出 了 缓 冲 区 的 边
出 的 的 ln j o gmp缓 冲 区 , 然 后 诱 导 进 入 恢 复 模 式 ,这 样 就 使 P r 的解 释 器 跳 转 到 攻 击 代码 上 el 。
出漏洞的程序的 一个入口 参数, 并执行这个有
错 误 的 程 序 。 通 常 ,这 个 有 错 误 的 程 序 是 有 一
定特 权 的 程 序 ,如 UNI X下 的 S I o t 序 、 U D ro 程 wid wsNT 下 由 系统 管 理 员启 动 的服 务 器 进 no 程等。 其 中 ,设法 使 被攻 击程 序 的控 制 转移 到攻 击 代码 ( e o e上是 关键 ,主要 有 以 下方 法 : s lcd ) hl ()函数 调 用 返 回地 址 1 每 当一 个 函数调 用 发 生时 ,被调 用 的 函数 的
在 系 统管 理 员没 有 察觉 的 情 况下 ,以特权 用 户 的 身份 ,如 ro ot
用 户 ,对 系 统进 行任 意 操 作 。
缓 冲 区 溢 出程 序 的 原 理
一
特别 是对 于 金融 系统 ,服务 器 很多 ,服 务器 不 仅都联 入 了
常见安全漏洞和解决方案
常见安全漏洞和解决方案安全漏洞是指软件、系统或网络中存在的导致安全风险的弱点或缺陷。
恶意黑客可以利用这些漏洞来入侵系统、获取敏感信息、破坏数据等。
为了确保系统和网络的安全,以下是几种常见的安全漏洞及其解决方案。
1.弱密码漏洞弱密码是指使用简单字典单词、常见数字或符号的密码,容易被猜测或破解。
解决方案是加强密码策略,包括密码长度要求、复杂性要求、定期更新密码等,并鼓励用户使用密码管理工具来生成和存储安全密码。
2.未经身份验证的访问漏洞这种漏洞使得未经身份验证的用户可以访问系统或应用程序的敏感信息。
解决方案是使用身份验证机制,例如用户名和密码、双因素认证等,来确保只有合法用户可以访问系统。
3.缓冲区溢出漏洞缓冲区溢出是指向程序的缓冲区中写入超过容量的数据,导致覆盖相邻内存空间并可能执行恶意代码。
解决方案包括输入数据验证和限制,使用安全的编程语言和编程实践来避免缓冲区溢出。
4.未授权访问漏洞此漏洞允许未经授权的用户或程序访问系统或资源。
解决方案是实施访问控制机制,如权限模型、角色授权、访问审计等,以确保只有授权用户可以访问敏感资源。
5.SQL注入漏洞SQL注入是指通过在应用程序的输入中插入恶意的SQL代码来执行未经授权的数据库操作。
解决方案包括使用参数化查询或存储过程,对输入数据进行严格验证和转义以预防SQL注入攻击。
6.跨站脚本攻击(XSS)XSS攻击是指在网页中插入恶意脚本,以获取用户的敏感信息或执行其他恶意操作。
解决方案是对输入数据进行验证和过滤,使用安全的编码实践来防止XSS攻击。
7.跨站请求伪造(CSRF)8.不安全的文件上传漏洞9.反射型XSS漏洞反射型XSS漏洞是指将恶意脚本作为参数传递给Web应用程序,然后被服务器直接返回给用户执行。
解决方案是对输入数据进行严格验证和转义,将用户输入和参数分开处理。
10.Wi-Fi安全漏洞Wi-Fi安全漏洞包括WEP、WPA和WPA2等加密协议的弱点,使得黑客可以窃听或篡改Wi-Fi通信。
缓冲区溢出攻击的分析及防范策略
缓冲区溢出攻击的分析及防范策略【摘要】缓冲区溢出攻击是一种常见的攻击手段,通过利用程序中的缓冲区溢出漏洞,攻击者可以在程序内存中写入恶意代码并执行。
这种攻击方式具有很高的危害性,可能导致系统崩溃、信息泄露甚至远程控制。
本文对缓冲区溢出攻击的原理进行了分析,并介绍了常见的攻击方法。
还提出了防范缓冲区溢出攻击的措施,包括编程语言中的防范措施、操作系统和网络安全设备中的防范措施等。
结论部分强调了缓冲区溢出攻击的风险不可忽视,建议综合使用多种防范策略以及加强安全意识培训和定期安全漏洞检测来有效防范这种攻击手段。
通过本文的介绍,读者可以更加深入地了解缓冲区溢出攻击,并掌握防范措施。
【关键词】关键词:缓冲区溢出攻击、危害、常见攻击方法、防范策略、原理分析、编程语言、操作系统、网络安全设备、风险、多种防范策略、安全意识培训、安全漏洞检测。
1. 引言1.1 什么是缓冲区溢出攻击缓冲区溢出攻击是指攻击者利用软件缓冲区溢出的漏洞,将大量数据输入超出缓冲区尺寸的内容,从而覆盖程序正常的运行空间,改变程序的执行路径,插入恶意代码或者执行恶意操作。
缓冲区溢出攻击是一种常见的计算机安全威胁,由于许多程序在设计上没有考虑到缓冲区的大小和输入数据的合法性,导致了这一漏洞的存在。
攻击者可以通过缓冲区溢出攻击来实现对系统的控制、数据泄露、拒绝服务等恶意目的。
了解缓冲区溢出攻击的原理对于加强计算机系统的安全防范至关重要。
通过加强对软件漏洞的修补、限制程序对输入数据的处理等措施,可以有效防范缓冲区溢出攻击带来的安全风险。
1.2 缓冲区溢出攻击的危害缓冲区溢出攻击是一种常见的网络安全威胁,其危害十分严重。
当程序接收到超出其预留空间的数据输入时,缓冲区溢出就会发生。
攻击者可以利用这一漏洞来执行恶意代码,篡改数据或者拒绝服务。
具体来说,缓冲区溢出攻击可能导致以下几种危害:1. 执行任意代码:通过向程序输入超出缓冲区界限的数据,攻击者可以利用溢出的内存空间来执行恶意代码。
缓冲区溢出的解决方法
缓冲区溢出的解决方法缓冲区溢出,这就像一个小杯子,你非要往里面倒很多很多水,水就会溢出来,弄得哪儿都是,在计算机里,这可是个大麻烦。
咱先得明白缓冲区是个啥。
就好比你有个小盒子,这个小盒子是用来放糖果的,规定只能放10颗。
这小盒子就是缓冲区,10颗糖果就是正常的数据量。
要是有人调皮,一下子往里面塞了15颗,那多出来的5颗没地方放,就溢出了。
在计算机里,数据就会跑到不该去的地方,可能把别的数据给覆盖了,这就乱套了。
那怎么解决这个事儿呢?一种办法就是把小盒子变大点,在计算机里就是合理地增大缓冲区的大小。
还是说那个放糖果的小盒子,咱知道有时候可能会收到12颗或者13颗糖果,那咱就把盒子设计成能放15颗的。
不过这可不能盲目地增大,得根据实际情况来。
就像你不能因为偶尔可能会多来几个客人,就把自己家房子盖得超级大,那多浪费啊。
在计算机里,要经过仔细的分析,预估可能出现的最大数据量,然后合理地增加缓冲区的容量。
再一个就是严格控制往缓冲区里放东西的量。
这就好比你请人往盒子里放糖果,你得盯着,告诉他最多就放10颗,不能多放。
在程序里,就要对输入的数据进行严格的校验。
比如说,如果一个程序只接受10个字符的输入,那就得设置好,一旦超过10个字符,就不让输入了,直接拒绝。
这就像门口的保安,不符合要求的就不让进。
还有啊,有的时候可以用一些特殊的技术手段。
这就像是给小盒子加个防护栏。
比如说在编程里使用一些安全的函数,这些函数就像是给缓冲区加了一层保护罩。
这些安全函数在处理数据的时候,会自动检查数据的大小是否合适,不合适就会采取措施,而不是像那些不安全的函数一样,任由数据乱塞,最后导致溢出。
咱也可以从程序设计的角度去考虑。
就好比盖房子,设计的时候就要考虑好布局。
在编写程序的时候,采用良好的编程规范。
比如说把不同功能的数据分开存放,就像家里把衣服和食物分开存放一样。
这样即使某个缓冲区有点小问题,也不容易影响到其他重要的数据和程序的运行。
缓冲区溢出漏洞分析及防范
缓冲区溢出漏洞分析及防范作者:罗斌来源:《电脑知识与技术》2018年第33期摘要:缓冲区溢出是一种在各种操作系统、应用软件中广泛存在普遍且危险的漏洞,利用缓冲区溢出攻击可以导致程序运行失败、系统崩溃等后果。
更为严重的是,可以利用它执行非授权指令,甚至可以取得系统特权,进而进行各种非法操作。
本文分析了缓冲区溢出的基本原理及缓冲区漏洞利用的技术条件、利用途径,最后提出了Linux和Windows下缓冲区漏洞利用的防范策略。
关键词:缓冲区溢出;漏洞利用;漏洞防范中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2018)33-0044-021 缓冲区溢出概述缓冲区是一个较宽泛的概念,用于存放数据的内存空间都可以叫作缓冲区。
缓冲区自身没有数据越界的防范机制,当放入缓冲区的数据超出了缓冲区的范围就叫缓冲区溢出。
某些可被利用的缓冲区溢出是安全缺陷,严重威胁着计算机安全。
每个进程在内存中都有一段相对独立的存储空间,并且这段存储空间被分为了许多小分区,我们所关注的进程内存分区主要有六个:text、data、bss、堆、栈和Env段。
其中,需要重点关注用于存储用户输入和变量的缓冲区——栈和堆。
栈主要被用来保存局部变量和函数调用的轨迹,在大多数操作系统中,栈的增长方向刚好与内存地址的增长方向相反——栈从内存的高地址空间向低地址空间增长,正是由于这种增长方式,导致了栈缓冲区溢出的存在。
堆则被用来存储动态分配的变量,它的增长方向是从内存的地址空间向高地址空间增长。
2 栈缓冲区溢出漏洞2.1 原理在讨论栈缓冲区溢出之前先厘清两个不同的概念[1]:栈缓冲区溢出和栈溢出,前者是文章要讨论的漏洞,是一种安全缺陷,后者则是由于内存资源不足引起,通常会导致程序崩溃,是一种编程错误。
当发生函数调用时,计算机按如下步骤操作:参数入栈,指令寄存器eip入栈(RET),栈基址寄存器ebp入栈,将栈指针esp赋值给栈基址寄存器ebp,本地变量入栈。
防范缓冲区溢出攻击的措施
防范缓冲区溢出攻击的措施
(1)限制和管理缓冲区的长度:在缓冲区的使用过程中,可以采取一定的限制措施,控制缓冲区的可用长度。
(2)验证输入:在程序中,可以采取多种形式的测试,用来检查和验证输入的参数、数据和代码,防止用户向系统发送恶意的字符串及其他代码。
(3)检查格式:在缓冲区使用之前,可以通过检查数据格式来检查传入的字符串、变量或其他类型的数据,来检查数据是否合规以及能够满足程序运行的要求。
(4)采用安全函数:系统中可以采用一些安全函数,例如:strcpy()函数等,来确保缓冲区中的数据不会被IRL注入的恶意代码篡改。
(5)定时监控缓冲区:可以定时扫描系统中的缓冲区数据,若发现数据不正常,可以及时采取相应措施。
在程序编码中防止缓冲区溢出
当调用 函数 时 ,进 行 压 栈操 作 ,这 时 把 函数 的
参 数 、返 回地 址 、局 部 变 量人 栈 。从 函数返 回时 出
栈 ,根 据 压栈 时 的返 回地 址返 回 。若 函数 中发生 了
溢 出 ,返 回时程 序 就会 出错 ;若 溢 出 时改 变 了返 回
地 址 ,程 序跳 转 到溢 出地 址 。攻 击 者这 时 可 以修 改 溢 出地 址 使程 序 跳 到他 设定 的地 方 继续 执 行 。 以如 下一 个 简单 常 用 的程 序 为 例 :
检 查 ( 括 C + ,而 当前 流行 的 操 作 系统 如 Wi 包 +) n . d w、 iu 、 nx等 都 主要 用 C语 言 编 写的 。当主机 o Ln x U i 运 行 的程 序 存在 缓 冲 区漏 洞 时 , 击 者用 殖 入 攻击 攻 代 码 的 程 序 去 运 行 以 一 定 权 限 的有 缓 冲 区 溢 出漏
洞 的程 序 , 而 获得 被 攻击 主机 的控 制 权 。 从
}
内存 低1s ; r f r sc y bf r,t ; t p (uf 2 s ) r e r
图 l 函 数 堆 栈 示 意 图
程 序 ea pe xm l O中 , 函数 s c y ) 直接 把 s 中 t p (将 r t r 的 内容拷 贝到 b f r中。 s uf e 当 t r的长度 大 于 1 6时 , 就 会 造 成 bf r uf 的溢 出 , 序运 行 就会 出错 。 以通过 e 程 可 程 序测试 出程 序 的缓 冲 区 长度 及返 回地 址 ,在 函数
( ) 前 溢 出 ( 称 活 动 记 录 溢 出 A t ai 1栈 又 ci t n v o
缓冲区溢出攻击的工作原理及防范策略
服 务病毒黑客图1 计算机程序内存存放示意图为了搞清楚“黑客”基于缓冲区溢出漏洞攻击的工作原理,我们先来分析一下计算机程序在内存中的存储和运行方式,计算机程序在内存中通常分为[1]程序段、数据段和堆栈部分,其具体存放策略如图示,程序段存放的是可执行的二进制机器代码或者只读数据,这个段的内容只允许读或者执行操作,不允许写服 务病毒黑客操作如下:首先把参数‘c’,’b’,’a’压入堆栈;然后保存指令寄存器(I P)中的内容,作为返回地址(R E T);第三个放入堆栈的是基址寄存器(F P);接着把当前的栈指针(S P)拷贝到F P,作为新的基地址;最后为函数变量留出一定空间,把S P减去适当的数值,使其指向局部变量的位置;执行完上述函数调用操作后,程序转到函数中继续执行,此时堆栈中的数据如图2所示。
图2 堆栈工作原理示意图函数执行完毕后,执行出栈操作,其中最主要的是将r e t送到I P中[3],正常执行此操作会使程序返回到函数调用指令的下一条指令,继续程序的正常执行,不会产生缓冲区的溢出,那么什么情况下会产生缓冲区的溢出呢?让我们来分析一下面的程序。
Buffer_overflow.c void function(char *str){ char buffer[16]; strcpy(buffer,str);}void main(){ char large_str [512];int i; for( i = 0; i < 512; i++) large_str [i] = \'A\'; function(large_str); }在程序Buffer_overflow.c执行过程中,当调用函数function时,函数将字符串*str不经过边界检查,直接拷贝到内存区域buffer[16]。
此时堆栈结果如图3所示:首先将参数*str压入堆栈,占用512字节的内存,接着将返回地址将指令寄存器IP中的返回地址ret入栈,然后将基址指针FP入栈,最后分配16字节的函数局部变量存储空间,随后程序转入function执行,当执行完strcpy(buffer,str)指令后,溢出产生了,程序执行的结果是从buffer开始的512个字节都将被*str的内容\'A\'覆盖,包括基址指针SFP和程序返回地址ret,甚至部分*str的内容。
如何防止缓冲区溢出
如何防止缓冲区溢出(编译/NorthTibet发表于2002-11-4 19:48:01)缓冲区溢出主要是一个C/C++ 问题。
尽管在通常情况下它很容易修补。
但它们仍然是一种对安全代码的威胁。
不管是用户也好,程序的攻击者也好,当提供的数据长度大于应用程序预期的长度时,便会发生缓冲区溢出,此时数据会溢出到内部存储器空间。
有两种缓冲区溢出不明显且难以修复。
一是开发人员没有预料到外部提供的数据会比内部缓冲区大。
溢出导致了内存中其他数据结构的破坏,这种破坏通常会被攻击者利用,以运行恶意代码。
二是数组索引错误也会造成缓冲区下溢和超限,但这种情况没那么普遍。
请看以下C++ 代码片段:void DoSomething(char *cBuffSrc, DWORD cbBuffSrc){char cBuffDest[32];memcpy(cBuffDest,cBuffSrc,cbBuffSrc);}问题在哪里呢?事实上,如果cBuffSrc 和cbBuffSrc 来自可信赖的源(例如不信任数据并因此而验证数据的有效性和大小的代码),则这段代码没有任何问题。
然而,如果数据来自不可信赖的源,也未得到验证,那么攻击者(不可信赖源)很容易就可以使cBuffSrc 比cBuffDest 大,同时也将cbBuffSrc 设定为比cBuffDest 大。
当memcpy 将数据复制到cBuffDest 中时,来自DoSomething 的返回地址就会被更改,因为cBuffDest 在函数的堆栈框架上与返回地址相邻,此时攻击者即可通过代码执行一些恶意操作。
弥补的方法就是不要信任用户的输入,并且不信任cBuffSrc 和cbBuffSrc 中携带的任何数据:void DoSomething(char *cBuffSrc, DWORD cbBuffSrc){const DWORD cbBuffDest = 32;char cBuffDest[cbBuffDest];#ifdef _DEBUGmemset(cBuffDest, 0x33, cbBuffSrc);#endifmemcpy(cBuffDest, cBuffSrc, min(cbBuffDest, cbBuffSrc));}此函数展示了一个能够减少缓冲区溢出的正确编写的函数的三个特性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
什么是缓冲区溢出?缓冲区以前可能被定义为“包含相同数据类型的实例的一个连续计算机内存块”。
在 C 和 C 中,缓冲区通常是使用数组和诸如 malloc() 和 new 这样的内存分配例程来实现的。
极其常见的缓冲区种类是简单的字符数组。
溢出是指数据被添加到分配给该缓冲区的内存块之外。
如果攻击者能够导致缓冲区溢出,那么它就能控制程序中的其他值。
虽然存在许多利用缓冲区溢出的方法,不过最常见的方法还是“stack-smashing”攻击。
Elias Levy (又名为 Aleph One)的一篇经典文章“Smashing the Stack for Fun and Profit”解释了 stack-smashing 攻击,Elias Levy 是 Bugtraq 邮件列表(请参阅参考资料以获得相关链接)的前任主持人。
为了理解 stack-smashing 攻击(或其他任何缓冲区攻击)是如何进行的,您需要了解一些关于计算机在机器语言级实际如何工作的知识。
在类 UNIX 系统上,每个进程都可以划分为三个主要区域:文本、数据和堆栈。
文本区域包括代码和只读数据,通常不能对它执行写入操作。
数据区域同时包括静态分配的内存(比如全局和静态数据)和动态分配的内存(通常称为堆)。
堆栈区域用于允许函数/方法调用;它用于记录函数完成之后的返回位置,存储函数中使用的本地变量,向函数传递参数,以及从函数返回值。
每当调用一个函数,就会使用一个新的堆栈帧来支持该调用。
了解这些之后,让我们来考察一个简单的程序。
清单 1. 一个简单的程序void function1(int a, int b, int c) {char buffer1[5];gets(buffer1); /* DON'T DO THIS */}void main() {function(1,2,3);}假设使用 gcc 来编译清单 1 中的简单程序,在 X86 上的 Linux 中运行,并且紧跟在对 gets()的调用之后中止。
此时的内存内容看起来像什么样子呢?答案是它看起来类似图 1,其中展示了从左边的低位地址到右边的高位地址排序的内存布局。
内存的底部内存的顶部buffer1 sfp ret a b c<--- 增长 --- [ ] [ ] [ ] [ ] [ ] [ ] ...堆栈的顶部堆栈的底部许多计算机处理器,包括所有 x86 处理器,都支持从高位地址向低位地址“倒”增长堆栈。
因此,每当一个函数调用另一个函数,更多的数据将被添加到左边(低位地址),直至系统的堆栈空间耗尽。
在这个例子中,当 main() 调用function1()时,它将 c 的值压入堆栈,然后压入 b 的值,最后压入 a 的值。
之后它压入 return (ret)值,这个值在 function1()完成时告诉 function1() 返回到 main() 中的何处。
它还把所谓的“已保存的帧指针(saved frame pointer,sfp)”记录到堆栈上;这并不是必须保存的内容,此处我们不需要理解它。
在任何情况下,function1()在启动以后,它会为 buffer1()预留空间,这在图 1 中显示为具有一个低地址位置。
现在假设攻击者发送了超过 buffer1() 所能处理的数据。
接下来会发生什么情况呢?当然,C 和 C 程序员不会自动检查这个问题,因此除非程序员明确地阻止它,否则下一个值将进入内存中的“下一个”位置。
那意味着攻击者能够改写sfp(即已保存的帧指针),然后改写 ret(返回地址)。
之后,当 function1() 完成时,它将“返回”——不过不是返回到 main(),而是返回到攻击者想要运行的任何代码。
通常攻击者会使用它想要运行的恶意代码来使缓冲区溢出,然后攻击者会更改返回值以指向它们已发送的恶意代码。
这意味着攻击者本质上能够在一个操作中完成整个攻击!Aleph On 的文章(请参阅参考资料)详细介绍了这样的攻击代码是如何创建的。
例如,将一个 ASCII 0 字符压入缓冲区通常是很困难的,而该文介绍了攻击者一般如何能够解决这个问题。
除了 smashing-stack 和更改返回地址外,还存在利用缓冲区溢出缺陷的其他途径。
与改写返回地址不同,攻击者可以 smashing-stack(使堆栈上的缓冲区溢出),然后改写局部变量以利用缓冲区溢出缺陷。
缓冲区根本就不必在堆栈上——它可以是堆中动态分配的内存(也称为“malloc”或“new”区域),或者在某些静态分配的内存中(比如“global”或“static”内存)。
基本上,如果攻击者能够溢出缓冲区的边界,麻烦或许就会找上你了。
然而,最危险的缓冲区溢出攻击就是 stack-smashing 攻击,因为如果程序对攻击者很脆弱,攻击者获得整个机器的控制权就特别容易。
为什么缓冲区溢出如此常见?在几乎所有计算机语言中,不管是新的语言还是旧的语言,使缓冲区溢出的任何尝试通常都会被该语言本身自动检测并阻止(比如通过引发一个异常或根据需要给缓冲区添加更多空间)。
但是有两种语言不是这样:C 和 C 语言。
C 和 C 语言通常只是让额外的数据乱写到其余内存的任何位置,而这种情况可能被利用从而导致恐怖的结果。
更糟糕的是,用 C 和 C 编写正确的代码来始终如一地处理缓冲区溢出则更为困难;很容易就会意外地导致缓冲区溢出。
除了 C 和 C 使用得非常广泛外,上述这些可能都是不相关的事实;例如,Red Hat Linux 7.1 中86% 的代码行都是用 C 或 C 编写的。
因此,大量的代码对这个问题都是脆弱的,因为实现语言无法保护代码避免这个问题。
在 C 和 C 语言本身中,这个问题是不容易解决的。
该问题基于 C 语言的根本设计决定(特别是 C 语言中指针和数组的处理方式)。
由于 C 是最兼容的C 语言超集,它也具有相同的问题。
存在一些能防止这个问题的 C/C 兼容版本,但是它们存在极其严重的性能问题。
而且一旦改变 C 语言来防止这个问题,它就不再是 C 语言了。
许多语言(比如 Java 和 C#)在语法上类似 C,但它们实际上是不同的语言,将现有 C 或 C 程序改为使用那些语言是一项艰巨的任务。
然而,其他语言的用户也不应该沾沾自喜。
有些语言存在允许缓冲区溢出发生的“转义”子句。
Ada 一般会检测和防止缓冲区溢出(即针对这样的尝试引发一个异常),但是不同的程序可能会禁用这个特性。
C# 一般会检测和防止缓冲区溢出,但是它允许程序员将某些例程定义为“不安全的”,而这样的代码可能会导致缓冲区溢出。
因此如果您使用那些转义机制,就需要使用 C/C 程序所必须使用的相同种类的保护机制。
许多语言都是用 C 语言来实现的(至少部分是用 C 语言来实现的),并且用任何语言编写的所有程序本质上都依赖用 C 或 C 编写的库。
因此,所有程序都会继承那些问题,所以了解这些问题是很重要的。
导致缓冲区溢出的常见 C 和 C 错误从根本上讲,在程序将数据读入或复制到缓冲区中的任何时候,它需要在复制之前检查是否有足够的空间。
能够容易看出来的异常就不可能会发生——但是程序通常会随时间而变更,从而使得不可能成为可能。
遗憾的是,C 和 C 附带的大量危险函数(或普遍使用的库)甚至连这点(指检查空间)也无法做到。
程序对这些函数的任何使用都是一个警告信号,因为除非慎重地使用它们,否则它们就会成为程序缺陷。
您不需要记住这些函数的列表;我的真正目的是说明这个问题是多么普遍。
这些函数包括 strcpy(3)、strcat(3)、sprintf(3)(及其同类 vsprintf(3))和 gets(3)。
scanf()函数集(scanf(3)、fscanf(3)、sscanf(3)、vscanf(3)、vsscanf(3) 和 vfscanf(3))可能会导致问题,因为使用一个没有定义最大长度的格式是很容易的(当读取不受信任的输入时,使用格式“%s”总是一个错误)。
其他危险的函数包括 realpath(3)、getopt(3)、getpass(3)、streadd(3)、strecpy(3) 和 strtrns(3)。
从理论上讲,snprintf()应该是相对安全的——在现代 GNU/Linux 系统中的确是这样。
但是非常老的 UNIX 和 Linux 系统没有实现 snprintf() 所应该实现的保护机制。
Microsoft 的库中还有在相应平台上导致同类问题的其他函数(这些函数包括wcscpy()、_tcscpy()、_mbscpy()、wcscat()、_tcscat()、_mbscat() 和CopyMemory())。
注意,如果使用 Microsoft 的 MultiByteToWideChar() 函数,还存在一个常见的危险错误——该函数需要一个最大尺寸作为字符数目,但是程序员经常将该尺寸以字节计(更普遍的需要),结果导致缓冲区溢出缺陷。
另一个问题是 C 和 C 对整数具有非常弱的类型检查,一般不会检测操作这些整数的问题。
由于它们要求程序员手工做所有的问题检测工作,因此以某种可被利用的方式不正确地操作那些整数是很容易的。
特别是,当您需要跟踪缓冲区长度或读取某个内容的长度时,通常就是这种情况。
但是如果使用一个有符号的值来存储这个长度值会发生什么情况呢——攻击者会使它“成为负值”,然后把该数据解释为一个实际上很大的正值吗?当数字值在不同的尺寸之间转换时,攻击者会利用这个操作吗?数值溢出可被利用吗?有时处理整数的方式会导致程序缺陷。
防止缓冲区溢出的新技术当然,要让程序员不犯常见错误是很难的,而让程序(以及程序员)改为使用另一种语言通常更为困难。
那么为何不让底层系统自动保护程序避免这些问题呢?最起码,避免 stack-smashing 攻击是一件好事,因为 stack-smashing 攻击是特别容易做到的。
一般来说,更改底层系统以避免常见的安全问题是一个极好的想法,我们在本文后面也会遇到这个主题。
事实证明存在许多可用的防御措施,而一些最受欢迎的措施可分组为以下类别:基于探测方法(canary)的防御。
这包括 StackGuard(由 Immunix 所使用)、ProPolice(由 OpenBSD 所使用)和 Microsoft 的 /GS 选项。
非执行的堆栈防御。
这包括 Solar Designer 的 non-exec 补丁(由OpenWall 所使用)和 exec shield(由 Red Hat/Fedora 所使用)。
其他方法。
这包括 libsafe(由 Mandrake 所使用)和堆栈分割方法。
遗憾的是,迄今所见的所有方法都具有弱点,因此它们不是万能药,但是它们会提供一些帮助。