栈溢出漏洞攻击原理及防护技术
- 格式:doc
- 大小:87.00 KB
- 文档页数:4
堆栈溢出攻击的一般步骤
堆栈溢出攻击呀,这可是个有点“小坏”的技术手段呢。
那它第一步呢,就是要找到一个存在漏洞的程序。
就像在一群房子里找到那扇没锁好的门一样。
这个程序可能是因为编写的时候没有很好地考虑边界检查之类的问题,才会有这样的漏洞。
比如说一些老版本的软件,或者是开发过程中粗心大意的小应用。
接着呀,攻击者就要构造特殊的数据啦。
这个数据就像是一把特制的钥匙,专门为了打开这个漏洞程序的“坏锁”。
他们会精心设计数据的内容,让这个数据的长度超过程序原本为它准备的存储空间。
这就像是你本来只给一个小盒子准备了放5个糖果的空间,结果有人硬塞进来10个。
然后呢,这些构造好的数据就被输入到有漏洞的程序里啦。
这一输入可不得了,就像把那把特制钥匙插进了没锁好的门一样。
因为数据太长,超过了堆栈分配的空间,它就会开始“溢出”到其他的内存区域。
再之后呀,攻击者就可以利用这个溢出的情况,把恶意代码放到那些不该放的内存区域。
这个恶意代码就像是一个小坏蛋,偷偷潜入了程序的地盘。
它可能会做很多坏事呢,比如说获取系统的控制权,或者偷偷把用户的重要信息发送出去。
不过呢,堆栈溢出攻击这种事儿可不好,是破坏网络安全的行为。
现在的程序员们也越来越聪明啦,会做很多防范措施。
比如说加强边界检查,不让那些超长的数据随便进来,还有对堆栈的保护机制也越来越完善。
咱们可不能用这种手段做坏事,但是了解它的步骤也能让我们更好地防范这种攻击,保护好我们的电脑和数据呢。
摘要:正文:大纲: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) 即使程序使用了上面所说的问题函数也不一定会出现溢出漏洞,漏洞发生的最后一个条件是程序员由于粗心,未检查用户输入数据的长度就将其直接复制到缓冲区中去。
虽然这看起来是一件小事,很容易杜绝。
可惜的是正因为有大量粗心的程序员的存在,使得溢出漏洞变得非常的普遍。
C语言中常见的安全漏洞及防范方法C语言作为一种广泛应用于系统开发和嵌入式设备的编程语言,虽然具有高效性和灵活性,但在安全性方面却存在一些常见的漏洞。
本文将介绍C语言中常见的安全漏洞,并提供相应的防范方法。
一、缓冲区溢出漏洞缓冲区溢出是C语言中最常见的安全漏洞之一。
当程序试图向一个已经装满数据的缓冲区写入更多的数据时,就会导致缓冲区溢出。
攻击者可以利用这个漏洞来修改程序的执行流,执行恶意代码或者获取敏感信息。
防范方法:1. 使用安全的函数:应该使用安全的函数,如`strncpy`、`snprintf`等,而不是不安全的函数`strcpy`、`sprintf`等。
安全的函数会检查数据长度,避免发生缓冲区溢出。
2. 输入验证:对于用户输入的数据,应该进行输入验证,确保输入的数据不会超出缓冲区的长度。
3. 使用堆栈保护技术:可以使用堆栈保护技术,如栈溢出检测、堆栈随机化等,在一定程度上提高程序对缓冲区溢出漏洞的防护能力。
二、格式化字符串漏洞格式化字符串漏洞是由于未正确使用格式化字符串函数(如`printf`、`sprintf`等)导致的安全问题。
当攻击者能够控制格式化字符串的参数时,就可能导致信息泄露或者任意代码执行。
防范方法:1. 限制格式化字符串的输入:应该限制用户输入的格式化字符串,确保输入的格式化字符串参数是合法且不含恶意代码。
2. 使用安全的格式化函数:使用安全的格式化函数,如`snprintf`等,这些函数会检查参数的有效性,避免格式化字符串漏洞的发生。
3. 程序审计:对于已经存在的代码,应进行定期的程序审计,识别和修复潜在的格式化字符串漏洞。
三、整数溢出漏洞整数溢出漏洞是由于未对输入数据进行正确的检查和验证,导致整数值超出其数据类型范围,从而引发安全问题。
攻击者可以利用这个漏洞来改变程序的行为,执行未经授权的操作。
防范方法:1. 输入验证:对于用户输入的数据,应该进行输入验证,确保输入的数据范围在合理的范围内。
堆栈溢出的原因
堆栈溢出是一种常见的安全漏洞,它的发生原因主要是由于程序在执行过程中,使用了过多的栈空间,导致栈溢出,从而破坏了程序的正常执行流程。
本文将从堆栈溢出的原因、危害以及防范措施等方面进行探讨。
堆栈溢出的原因主要有两个方面:一是程序设计不当,二是攻击者利用漏洞进行攻击。
在程序设计不当的情况下,程序员可能会在函数中使用过多的局部变量,或者使用了过多的递归调用,导致栈空间不足,从而引发堆栈溢出。
而在攻击者利用漏洞进行攻击的情况下,攻击者可能会通过输入过长的数据,或者利用格式化字符串漏洞等方式,来覆盖栈中的返回地址,从而控制程序的执行流程。
堆栈溢出的危害主要表现在以下几个方面:一是程序崩溃,导致数据丢失或者系统崩溃;二是攻击者可以利用堆栈溢出漏洞,执行恶意代码,从而获取系统权限或者窃取敏感信息;三是攻击者可以利用堆栈溢出漏洞,进行拒绝服务攻击,从而使系统无法正常运行。
为了防范堆栈溢出漏洞,我们可以采取以下几个措施:一是在程序设计时,尽量减少使用局部变量和递归调用,从而减少栈空间的使用;二是对输入数据进行有效的检查和过滤,避免输入过长的数据;三是使用编译器提供的安全选项,如-fstack-protector等,来检测和防范堆栈溢出漏洞;四是使用堆栈随机化技术,来增加攻击者的难度,从而提高系统的安全性。
堆栈溢出是一种常见的安全漏洞,它的发生原因主要是由于程序设计不当和攻击者利用漏洞进行攻击。
为了防范堆栈溢出漏洞,我们需要采取有效的措施,从而提高系统的安全性。
防止栈溢出的防护机制
栈溢出是一种常见的安全漏洞,它可以被黑客利用来执行恶意代码或者获取系统权限。
为了防止栈溢出攻击,现代操作系统和编译器都引入了一些防护机制。
其中最常见的是堆栈保护机制(Stack Guard),也称为栈保护或者Canary。
该机制在函数开始时将一个随机数值放置在栈底部,然后在函数结束时检查该值是否被修改。
如果被修改,就意味着栈溢出了,程序将会终止。
另外,编译器还可以使用栈的非法访问检测技术(Stack Smashing Protector),它会在代码中插入一些检查语句,以确保栈的访问是合法的。
如果发现非法访问,程序同样会终止。
此外,还有一些其他的防护机制,例如地址随机化(Address Space Layout Randomization,ASLR)、数据执行保护(Data Execution Prevention,DEP)和控制流完整性(Control Flow Integrity,CFI)等等。
这些机制都可以在一定程度上防止栈溢出攻击,提高系统的安全性。
总之,防止栈溢出攻击是一个不可忽视的安全问题。
通过使用堆栈保护、栈的非法访问检测等防护机制,可以提高系统的安全性,避免程序被黑客攻击和利用。
- 1 -。
栈溢出漏洞原理栈溢出(Stack Overflow)是一种常见的安全漏洞,它利用了程序在执行过程中使用的栈内存空间有限的特性。
栈溢出漏洞的原理是攻击者通过向程序输入过多的数据,超出了栈内存所能容纳的范围,从而覆盖了栈中的其他数据甚至覆盖了函数返回地址,从而实现任意代码执行的攻击。
要理解栈溢出漏洞的原理,首先需要了解栈的概念。
在计算机中,栈是一种数据结构,用来存储函数的局部变量、函数的参数以及函数调用的返回地址等信息。
栈的特点是先进后出,也就是说最后进入栈的数据最先被访问到。
当一个函数被调用时,会将函数的参数和局部变量等数据压入栈中。
而函数执行完毕后,会通过栈中保存的返回地址返回到调用函数的位置。
栈溢出漏洞就是在这个过程中利用了栈的特性来进行攻击。
栈溢出漏洞的攻击方式通常是通过向程序输入过长的数据,超出了预留的栈内存空间大小。
由于栈内存的连续性,超出的数据会覆盖栈中相邻的数据。
如果这些相邻的数据是保存函数返回地址的部分,那么攻击者就可以通过修改返回地址的值,使程序执行任意指定的代码。
具体来说,当攻击者向程序输入的数据超出了栈内存的大小时,多余的数据会被写入到栈中相邻的内存区域。
当函数执行完毕,尝试返回到返回地址所指向的位置时,由于返回地址被篡改,程序就会跳转到攻击者指定的代码,从而实现了攻击者的意图。
栈溢出漏洞的危害非常大,攻击者可以利用它执行任意代码,包括删除、修改、读取敏感数据,甚至控制整个系统。
为了防止栈溢出漏洞的发生,开发人员需要注意以下几点:1. 输入验证:对用户输入的数据进行验证和过滤,确保不会超出预期的长度。
2. 缓冲区溢出检测:使用一些工具来检测程序中是否存在缓冲区溢出的漏洞,及时修复。
3. 栈保护机制:一些编程语言和操作系统提供了栈保护机制,可以在栈溢出时检测到异常并中断程序的执行。
4. 代码审查:进行代码审查,查找潜在的栈溢出漏洞,并修复之。
5. 使用安全的编程语言和框架:一些编程语言和框架自带了一些安全机制,能够有效地防止栈溢出漏洞的发生。
pwn ret2syscall 原理pwn ret2syscall 原理1. 引言在计算机安全领域,pwn(ret2syscall)是一种经典的漏洞利用技术,它能够绕过程序所设定的安全限制,直接调用系统API完成攻击目标。
本文将介绍pwn ret2syscall的原理及相关技术。
2. 漏洞背景在理解pwn(ret2syscall)原理前,我们需要先了解几个重要概念:栈溢出漏洞和系统调用。
栈溢出漏洞:当程序未对输入数据进行正确的边界检查时,攻击者可利用输入缓冲区的溢出现象,覆盖栈上的返回地址,控制程序的执行流程。
系统调用:操作系统提供的一组接口,用于程序与操作系统之间的交互。
例如,程序可以通过系统调用来读写文件、执行新进程等。
3. pwn(ret2syscall)原理pwn(ret2syscall)利用了栈溢出漏洞将程序的执行流程修改为调用系统调用的流程,从而绕过程序本身的安全控制。
具体实现步骤如下:1.找到栈溢出漏洞:通过输入数据的长度或内容,触发程序的栈溢出漏洞。
2.溢出返回地址:覆盖函数调用返回时将要执行的地址,将其修改为系统调用的入口地址。
3.构造系统调用参数:将所需的系统调用号及参数通过合适的方式存储在栈上,以供系统调用时使用。
4.触发返回:在栈上构造合适的数据,使得函数返回并跳转到覆盖的返回地址,从而触发系统调用。
5.系统调用执行:程序跳转到系统调用的入口地址,并根据栈上存储的系统调用参数,执行相应的操作。
4. 实例解析以一个简单的C程序为例,来解释pwn(ret2syscall)的原理:#include <>#include <>void vuln() {char buffer[64];read(0, buffer, 128);}int main() {vuln();return 0;}上述代码存在一个栈溢出漏洞,函数vuln()中的read()函数会读取超过buffer容量的数据,导致溢出。
C语言技术中常见的安全漏洞及预防措施近年来,计算机应用逐渐深入到我们的生活中的各个领域,而软件作为计算机系统中最重要的组成部分之一,其安全性一直备受关注。
在软件开发过程中,C语言常作为首选语言,但由于C语言的灵活性和强大的底层控制能力,导致C语言程序容易受到各种安全漏洞的侵害。
本文将详细介绍C语言技术中常见的安全漏洞以及相应的预防措施。
一、缓冲区溢出缓冲区溢出是C语言中最常见的安全漏洞之一。
它通常出现在程序中使用了不安全的字符串处理函数,如strcpy、strcat等。
当输入的数据超过了目标缓冲区的大小时,溢出数据会覆盖其他内存区域,从而导致程序崩溃或者执行恶意代码。
预防措施:1. 使用安全的字符串处理函数,如strncpy、strncat等,可以指定拷贝或追加的最大长度。
2. 对输入数据进行合法性检查,确保输入长度不超过目标缓冲区的大小。
3. 使用堆栈保护技术,如栈溢出保护(StackGuard)、堆溢出保护(HeapGuard)等。
二、格式化字符串漏洞格式化字符串漏洞也是C语言中常见的安全漏洞之一。
当程序使用了不安全的格式化输出函数,如printf、sprintf等,且使用者可控的输入作为格式化字符串的参数时,就有可能导致格式化字符串漏洞。
预防措施:1. 使用安全的格式化输出函数,如snprintf、sprintf_s等,可以指定输出字符串的最大长度。
2. 避免使用用户可控的输入作为格式化字符串的参数,或者对输入进行严格的合法性检查。
三、整数溢出漏洞整数溢出漏洞常出现在处理算术运算、数组索引等情况下,当一个数值超出了该类型的表示范围时,溢出的部分将被截断,导致运算结果不正确,甚至引发程序崩溃或漏洞利用。
预防措施:1. 在进行数值计算时,进行溢出检查,避免直接使用可能溢出的运算结果。
2. 对于需要存储大数值的情况,采用更加安全的数据类型,如stdint.h头文件中的int64_t等。
四、空指针引用漏洞当程序中对一个空指针进行解引用,即访问空指针所指向的内存区域时,将导致程序崩溃。
栈溢出原理
栈溢出是指在程序执行时,当向栈中写入数据时,数据超出了栈的边界,从而导致覆盖了其他重要的数据。
这种情况通常发生在程序的漏洞被攻击者利用的时候。
栈溢出的原理可以通过以下几个步骤来解释:
1. 在程序执行时,每个函数都会在栈上分配一定的内存空间,用来存储局部变量、函数参数、返回地址等信息。
2. 当函数被调用时,系统会将当前函数的返回地址压入栈中,以便在函数执行完毕后能够返回到调用它的位置继续执行。
3. 如果在函数执行过程中,程序向栈中写入的数据超出了栈的边界,就会导致这些数据覆盖了其他重要的信息,如返回地址等。
4. 攻击者可以利用这个漏洞,通过构造特定的数据,将恶意代码的地址写入到被覆盖的返回地址中,从而实现代码执行的控制权转移。
为了避免栈溢出漏洞,程序员可以采取以下措施:
1. 检查输入数据的长度,确保不会超过栈的边界。
2. 使用安全的字符串处理函数,如strcpy_s等,以避免缓冲区溢出。
3. 避免使用可执行代码作为函数参数,以避免被攻击者利用。
4. 使用栈保护技术,如Canary等,以检测和防止栈溢出攻击。
总之,了解栈溢出的原理和防范措施对于程序员来说是非常重要的。
只有不断加强代码的安全性和可靠性,才能有效地避免安全漏洞
的出现。
栈溢出漏洞攻击原理及防护技术发布时间:2011年06月29日∙o分享∙推荐∙打印∙收藏文/H3C攻防研究团队现阶段的安全漏洞种类很多,包括大家熟悉的SQL注入漏洞、缓存溢出漏洞、XSS跨站脚本漏洞等。
而栈溢出漏洞作为缓冲区溢出漏洞的一种特定的表现形式,在现实网络环境中比较普遍。
本文将从栈溢出漏洞的原理、攻击形式及防护方法等方面进行介绍一、栈溢出漏洞的原理栈溢出(Stack Overflow)是在网络与分布式系统中被广泛利用的一种漏洞类型。
在汇编中,以线程为线索的指令执行对函数的调用及局部变量的存取是依靠栈来实现的,黑客可以使用特定的脚本语言,通过网络远程向对外提供业务的服务器进行攻击,利用对栈中数据的填充越界,实现有效的漏洞攻击。
下面的例子对该过程进行了详细的描述:下面这段C代码的vulnerable_func函数用于完成对input字符串的临时存储及对变量isSafe的判断,同时主程序main中,分别对该函数进行正确及错误的参数输入,两相对比可以看出正常调用的栈处理赋值及不正常时的栈溢出情形。
函数关键代码如下所示:int vulnerable_func(char * input){int isSafe = 0;char vulnerable_var[16];strcpy(vulnerable_var, input);if (isSafe == 0){printf("Check error!\n");return 1;}printf("Check Pass!\n");return 0;}int main(int argc, char* argv[]){vulnerable_func("Hello World!\n");vulnerable_func("Hello World!AAAAAAAAAAAAAAA");return 0;}通过特定的技术手段,调用查看两种情况下函数调用的栈处理过程,得到的栈参数赋值如图1所示:地址0013FEFC开始的16个字节为vulnerable_var变量在栈中的存储空间;地址0013FF0C为isSafe 变量在栈中的地址;地址0013FF10为m ain函数EBP在栈中的地址;地址0013FF14为函数返回地址在栈中的存储地址图1正常栈与溢出栈对比图进一步分析可知,图1右图中超计划输入的数据覆盖了栈中isSafe变量、EBP和函数返回地址所在内存空间的内容,一般会引发数据混乱或程序崩溃。
对于软件开发人员来说,这只是软件开发过程中诸多错误中常见的一种内存越界错误,而对于安全人员来说这可能就意味着一个非常危险的安全漏洞。
因为黑客会利用这种漏洞巧妙的构造出攻击输入以跳出原程序的设计逻辑,甚至执行任何攻击者想要执行的代码。
二、栈溢出漏洞的典型攻击方式栈溢出漏洞在客户端和服务器上均有可能存在,攻击者主要通过网络以远程方式进行攻击。
对于客户端的攻击一般受NAT及防火墙阻隔的影响,需要搭建伪装的服务器通过社会工程学引诱用户访问,在回应用户访问时构造数据进行攻击。
传送伪造的数据文件引诱用户打开,以攻击处理软件中的漏洞也很常见,当然在局域网中的直接攻击也广泛存在。
对于服务器的攻击则只需直接伪造对服务器访问,在连接或登录后构造报文或数据进行攻击。
黑客在远程利用网络实施栈溢出漏洞攻击时,其攻击报文将通过网络找到特定的服务器主机,并在主机进行函数调用时实施破坏性行为。
典型的攻击行为主要有以下三种:1)修改相邻数据仍以前面的演示代码为例,假设此代码为服务器上的安全检查模块的一部分,input为远程用户的登录信息,isSafe为系统中的判断用户关键数据。
如果第二次函数调用只修改栈中isSafe变量,就可模拟出一次远程用户的攻击,并绕过对isSafe变量的检查,造成一次非法用户绕过安全检查的成功入侵。
由于这种方式受限于系统设计时的诸多因素,实际出现的机会相对较少。
2)修改函数返回地址栈溢出更常见的一种利用方式是覆盖漏洞函数的返回地址。
若演示代码中input输入足够长时,就会覆盖修改函数vulnerable_fun的返回地址(即图1中地址0012FF14的内容),如果此时输入为精心构造的shellcode(即实现攻击行为的一段机器指令码),准确地修改该返回地址,就可能跳转到shellcode中去执行,攻击者也就可能获取进程对应的权限执行远程植入的指令序列。
3)修改SEH(Structured Exception Handling)windows异常处理是windows程序出错后自己处理错误并进行补救的一种机制, 包括SEH、VEH (Vector Exception Hander)、UEF(Unhandled Exception Filter)等技术简单来说,可以想像SEH为栈中的一个单链表,如果函数中使用了__try、__except等异常处理宏,就会在该函数栈帧中压入SEH 结点并链接到单链表的头部。
发生异常时就会从栈中自顶向底调用SEH链表结点中的异常处理函数。
当栈溢出覆盖了后续需要处理的数据或破坏了栈的平衡,均会造成程序运行异常,引发SEH机制调用栈中的异常处理函数。
这种情况下,如果SEH链表结点的异常处理函数地址也被覆盖成了shellcode地址或者可以跳转到shellcode的指令地址,一次修改SEH的栈溢出执行任意代码攻击就发生了。
由于SEH覆盖的攻击方法比较高效,成为windows上栈溢出的经典攻击方式。
三、栈溢出漏洞的防护技术在栈溢出的检查与防范方面,软件开发工具厂商及团体已经做了不少努力,如微软在Visual Studio系列中增加了栈溢出检查的编译选项。
合理利用这些带安全特性的开发工具,可以提升系统的安全性,在遭受攻击时检查出程序中的数据溢出中止攻击行为。
在操作系统方面,Windows系列操作系统中增加了SEHOP (SEH Overwrite Protection) ,以阻止攻击者通过修改SEH来利用漏洞,增强了系统的安全性,其它操作系统也有类似的机制来提升安全性。
硬件方面,64位CPU中引入了NX(No-eXecute)硬件机制。
其保护方法的本质,就是在内存中区分数据区与代码区,堆内存与栈内存都是数据区,程序代码部分则为代码区,当攻击使CPU跳转到数据区去执行时,就会异常终止。
对于大量用户已投资的现有软硬件资产,不可能都升级到最新的软硬系统上。
即使经济允许,可以绕过防御机制的新漏洞会不断被挖掘与捕获,攻击方法也会推陈出新,成熟的节点软硬件防御机制总是在总结了攻击规律后经过相当长时间推出,因而不能及时对一些新漏洞与新攻击方法生效。
所以网络防御措施相当必要,IPS设备就是比较典型的网络防御设备,可以采用各种技术进行针对性更强的防御。
1. 基于漏洞特征的检测漏洞都有一定的触发条件,对漏洞的攻击过程就是构造外部输入使之既能满足触发条件又能使系统跳出原先逻辑执行攻击者设定动作的过程。
显然针对栈溢出漏洞的攻击,也必须达到漏洞的触发条件——注入超过系统逻辑计划存储的数据长度。
如前面代码所演示的,对于input输入超过16个字节就能触发演示漏洞。
漏洞特征库就是基于已知漏洞的触发条件建立起来的特征信息库,当发现最新的漏洞触发特征,同步动态更新防御设备上的漏洞特征库,基于这个信息库进行网络流量的检测可以有效的发现与阻止针对已知漏洞的攻击,如图2为H3C IPS设备上漏洞库中缓冲区溢出漏洞的部分信息。
图2 H3C IPS T1000A设备上部分缓冲区溢出类漏洞信息2. 基于攻击特征的检测漏洞的产生到发现中间有段不确定的时间,有可能是几天也有可能是一年,甚至几年,不少漏洞都是被黑客首先发现并利用进行攻击时,被安全研究机构通过Honey Pot等系统捕获之后分析出来的。
因此基于漏洞特征的防御受限于安全机构的漏洞发掘速度与研究范围以及未公布漏洞被利用的广泛程度。
为了提高防御性能,有必要基于攻击的特点进行有针对性的防御,如前述修改函数返回地址或修改SEH的攻击方法,栈溢出注入数据的长度与内容随漏洞不同而有所差异,但攻击使用的跳转地址却是常用的、比较固定易用的一些地址。
另外shellcode的编写有相当的技术含量,各种平台下的shellcode一般都是尽量重复利用。
加上常用的利用模式,使得攻击手法呈现出一定的特征,通过提取这些攻击中频繁出现的利用特征即时更新网络防御设备的攻击特征库,可以有效阻止黑客利用现有手段对各种漏洞(包括未被安全机构发掘的)的攻击。
3. 基于虚拟技术的检测对于安全性要求很高、需要重点防护的系统,基于漏洞特征与攻击特征的防御难免还有漏网之鱼。
就像Honey Pot系统可以用真实的系统做诱饵也可以虚拟一个诱饵系统一样,防御设备也可以虚拟一个跟真实系统相近的系统,用于检测对系统的访问是否存在攻击。
以ftp服务器上栈溢出漏洞的防御为例,防御设备最理想的情况是可以虚拟出一个除了数据不同其它均相同的ftp服务器,当服务器被攻破时,系统的服务进程即使不异常中止其现场也会与正常访问的现场不一样。
通过在虚拟系统中插入检查点,检查系统某一动作完成后的现场,以及监测进程的运行状态,可以检测出用户每次ftp操作是否含有攻击或攻击是否成功。
如果用户的操作没有异常后台再把操作重定向到真实的ftp服务器上去处理,并把真实的数据返回给用户,否则可以直接阻断此用户对真实系统的访问。
这样即使是以攻击者首创的未公布攻击方法对未公布漏洞进行攻击,也可以有效检测出来。
4. 基于模糊识别的检测由于溢出类漏洞的填充数据对于攻击本身是没有意义的,即只是用来占位以达到数据长度的目的,这部分一般会被攻击者以习惯模式填充(如多个字符重复多遍),而这部分数据在正常访问情况下,是外部输入中有意义的部分。
另外输入的shellcode和跳转地址部分与正常的输入一般情况下也有差别,基于这些差别可以建立起来模糊识别的模型,用于检测对未知漏洞的攻击。
结束语栈溢出的攻防安全之争中,目前防御一方略占上风。
本文提到的保护技术能有效阻止大部分针对栈溢出漏洞的攻击,但是出于性能成本等多方面的考虑,这些技术只被部分采用。
另外攻防技术还在不断发展之中,栈溢出漏洞在安全领域还有不小的舞台,值得安全研究与管理人员更多关注。