b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

原理分析与缓冲区溢出攻击的预防

电脑杂谈  发布时间:2020-05-08 15:18:44  来源:网络整理

溢出攻击_缓冲区溢出攻击_堆溢出攻击怎么办

1. 前言1.1本课题的研究意义1.2缓冲区溢出研究的现状2.缓冲区溢出原理概述2.1. 缓冲区溢出的概念2.2. 堆栈的定义2.3缓冲区溢出攻击的原理2.4缓冲区溢出攻击的方法2.4.1在程序的地址空间中安排适当代码的方法2.4.2将控制程序转移到攻击代码的方法2.5程序的影响和危害缓冲区溢出3.缓冲区溢出的防御方法3.1编写正确代码的方法3.2. 使缓冲区不可被操作系统执行,从而防止攻击者植入攻击代码3.3,使用编译器的数组边界检查保护缓冲区3.4,在程序指针失败之前进行完整性检查4,摘要和展望4.1全文摘要4.2展望5.参考文献的主要内容本主题的研究意义随着信息和网络技术的发展以及这些技术在军事领域的不断渗透,计算机网络已成为连接未来信息化战场的枢纽. 对计算机的攻击可以获得大量有价值的情报,并且可以达到其他武器系统无法达到的效果. 因此,基于计算机的网络攻击和保护自然已成为军事领域的密切关注的问题. 近年来,缓冲区溢出漏洞的广泛性和破坏性在信息安全研究领域受到了广泛关注. 自1988年成立CERT(计算机紧急响应小组)以来,安全威胁事件的数量每年呈指数级增长.

缓冲区溢出攻击是网络攻击的主要形式,它占所有系统攻击的80%以上[1]. 此缓冲区溢出漏洞可能发生在不同的操作系统和不同的应用程序上. 缓冲区溢出攻击是黑客攻击的主要手段,对网络信息安全的危害越来越大. 现有防御方法的研究相对滞后. 当前的大多数研究都集中在特定漏洞的使用和预防上,并且缺乏全面的研究. 并且现有的缓冲区溢出防御方法也有很多缺点. 本文主要是对缓冲区溢出攻击的原理分析和防范进行深入研究. 本文首先介绍了缓冲区和堆栈的基本概念,研究并总结了缓冲区溢出的原理和过程,并介绍了一些常用的攻击方法. 在此基础上,论文主要从主观和客观两个方面对防缓冲区溢出攻击的一些常用方法进行了研究和总结. 从主观上讲,重点是提高程序员编写代码的质量,形成良好的编程风格. 从客观的角度来看,主要是从系统和软件上进行一些相关的检查和优化. 缓冲区溢出研究现状缓冲区溢出攻击是一种主流的攻击方法. 早在1980年代,国外就有一些人开始讨论溢出攻击. 例如,1988年的莫里斯蠕虫. 使用的攻击方法之一是Fingerd. 缓冲区溢出. 这种蠕虫攻击导致全球超过6,000台计算机受到感染,损失巨大. 结果,缓冲区溢出问题逐渐引起人们的关注.

1989年,Spafford提交了一份分析报告,描述了VAX机器上Fingerd缓冲区溢出程序的BSD版本的BSD版本的BSD版本的技术细节,这引起了一些安全人员对该研究领域的重视. 在1996年,AlephOne详细描述了Linux系统中堆栈的结构以及如何使用基于堆栈的缓冲区溢出. 在1997年,Smith整合了以前的文章,并提供了有关如何在各种Unix系列中编写缓冲区溢出Exploit的更详细的指南. 1998年,来自“ Cult Deadcow”的Dildog详细介绍了如何使用Windows溢出. 他建议使用堆栈指针来完成跳转并返回固定的指向地址,无论是在所讨论的程序中还是在动态链接中. 在库中,固定地址包含用于使用堆栈指针完成跳转的汇编指令,这是对缓冲区溢出的使用的重大改进. 在中国,对该技术的研究起步较晚. 在2000年左右,一些安全人员和黑客开始研究这一领域. 中国绿色联盟联合会的最早成员袁仁光做了一些工作. 他使用暴力探索的方法来获取kernel32. dll的基址,代码量太大,并且不够准确. 在2003年安全焦点峰会上,Flashsky发表了有关堆溢出的演讲[3],总结了利用堆溢出漏洞的方法. San在2005年撰写了一篇有关如何使Windows CE溢出的文章[4]. Windows CE是PDA和移动电话上使用非常广泛的嵌入式操作系统. 本文介绍了Windows CE内存管理,进程等方面的基本知识. CE的缓冲区溢出问题是Shellcode的解码效率不高.

堆溢出攻击怎么办_缓冲区溢出攻击_溢出攻击

缓冲区溢出原理概述. 缓冲区是将数据存储在内存中的地方. 一般来说,它是“包含相同数据类型实例的连续计算机存储块” [5],其中包含给定类型的数据. 在C和C ++中,通常使用数组和内存分配例程(例如malloc()和new)来实现缓冲区. 缓冲区的最常见类型是简单字符数组. 缓冲区溢出是指当计算机用数据位填充缓冲区时,缓冲区本身的容量已被超出,因此溢出的数据将被覆盖在合法数据上. 理想情况下缓冲区溢出攻击,程序检查数据长度并且不允许输入超出缓冲区长度Character,但是大多数程序将假定数据长度始终与分配的存储空间匹配,这对缓冲区溢出具有隐患. 操作系统使用的缓冲区也称为“堆栈”. 在每个操作过程之间,指令将被临时存储在“堆栈”中,并且“堆栈”也将溢出缓冲区. 例如,堆栈可能是内存中的连续块. 称为堆栈指针(SP)的寄存器指向堆栈的顶部,而堆栈的底部是固定地址. 堆栈的一个特点是先进先出. 也就是说,稍后放入的数据将被首先取出. 它支持PUSH和POP两个操作. PUSH用于将数据放在堆栈的顶部,而POP用于将数据放在堆栈的顶部. 在高级语言中,堆栈用于程序函数调用和函数中的临时变量. 堆栈还用于参数的传递和返回. 通常,对局部变量的引用是通过将其偏移量赋予SP来实现的.

还有一个基本指针(英特尔芯片中的FP,BP),许多编译器实际上都使用它来引用局部变量和参数. 通常,参数与FP的偏移为正,局部变量为负. 当程序中发生函数调用时,计算机将执行以下操作: 首先将参数压入堆栈;然后将参数压入堆栈. 然后将指令寄存器(IP)的内容保存为返回地址(RET);堆栈中的第三个是基地址寄存器(FP);然后将当前的堆栈指针(SP)复制到FP作为新的基址;最后,为局部变量留出一定的空间,并从SP中减去适当的值. 缓冲区溢出攻击原理缓冲区攻击是一种常见且危害极大的系统攻击方法. 通过写入超出程序缓冲区长度的内容,将导致缓冲区溢出,从而破坏程序堆栈,从而使程序转向执行其他指令以达到攻击目的. 当普通用户操作程序时,通常执行的操作不会超出程序的运行范围. 数据被添加到分配给缓冲区的存储块中,发生缓冲区溢出,并且此时出现数据. 泄漏或占用了其他数据空间. 缓冲区溢出的攻击原理是将超出正常长度的内容输入到超出缓冲区长度限制的程序中,从而导致缓冲区溢出并破坏程序的堆栈,使程序运行时遇到特殊问题并执行其他指令. 一般来说,仅缓冲区溢出不会引起安全问题. 如果将溢出发送到可以使用根特权或其他超级特权运行命令以执行某些代码或运行Shell的区域,则该程序将由超级用户权限控制计算机.

缓冲区溢出攻击的目的是破坏以某些特权运行的程序的功能. 这使攻击者可以控制程序. 如果程序具有足够的权限,则将控制整个主机. 一般来说,攻击者攻击根程序,然后执行类似于“ exec(sh)”的执行代码,以获得具有根权限的shell. 为了实现此目标,攻击者必须实现以下两个目标: (2)通过适当初始化寄存器和内存,让程序跳转到入侵者安排的地址空间中执行. 缓冲区溢出攻击方法可以分为两种: 在程序的地址空间中安排适当代码的方法;以及控制将程序转移到攻击代码的另一种方法. 本文介绍了这两种攻击方法. 在程序的地址空间中安排适当的代码. 攻击者在受攻击的程序中输入一个字符串,程序将把该字符串放入缓冲区. 该字符串中包含的信息是可以在被攻击的硬件平台上运行的一系列指令. 在这里,攻击者使用被攻击程序的缓冲区来存储攻击代码. 可以在任何位置设置缓冲区: 堆栈(自动变量),堆(堆,动态分配的内存区域)和静态数据区域. 有时,攻击者想要的代码已经在被攻击程序中,攻击者所需要做的就是将一些参数传递给代码. 例如,攻击代码要求执行“ exec(“ / bin / sh”)“,而libc库中的代码执行” exec(arg)”,其中arg使一个指向字符串的指针参数,然后攻击者只需要把传入的参数指针更改为指向“ / bin / sh”即可.

堆溢出攻击怎么办_溢出攻击_缓冲区溢出攻击

攻击方法的说明用于控制程序向攻击代码的传输的方法是基于攻击者寻求的缓冲区溢出程序空间的类型. 原则上,它可以是任何空间. 实际上,许多缓冲区溢出都使用蛮力方法来寻求更改程序指针. 这些程序之间的区别是程序空间的突破和存储空间的定位. 主要有三种类型: 1.活动记录: 每当发生函数调用时,调用方都会在堆栈中保留活动记录缓冲区溢出攻击,该记录包含函数末尾返回的地址. 攻击者使堆栈中的自动变量溢出,以便返回地址指向攻击代码. 通过更改程序的返回地址,当函数调用结束时,程序跳转到攻击者设置的地址,而不是原始地址. 这种类型的缓冲区溢出称为堆栈溢出攻击(Stack Smashing Attack),是当前最常用的缓冲区溢出攻击. 2.函数指针(FunctionPointers): foo)()”声明函数指针变量foo,其返回值为void. 因此,攻击者只需找到一个缓冲区,该缓冲区可以在任何空间的函数指针附近溢出,然后使该缓冲区溢出以更改函数指针. 在某个时刻,当程序通过函数指针调用函数时,程序的流程是根据攻击者的意图实现的. 其攻击示例之一是Linux系统下的superprobe程序.

Longjmp缓冲区: C语言中包含一个简单的验证/恢复系统,称为setjmp / longjmp. 这意味着在检查点设置“ setjmp(缓冲区)”,并使用“ longjmp(缓冲区)”恢复检查点. 但是,如果攻击者可以进入缓冲区空间,则“ longjmp(缓冲区)”实际上是跳转到攻击者的代码. 像函数指针一样,longjmp缓冲区可以指向任何地方,因此攻击者要做的就是找到一个可能溢出的缓冲区. 一个典型的例子是Perl 5.003的缓冲区溢出漏洞. 攻击者首先进入用于恢复缓冲区溢出的longjmp缓冲区,然后进入恢复模式,这将导致Perl解释器跳至攻击代码. 缓冲区溢出的影响和危害在几乎所有计算机语言中,无论是新语言还是旧语言,通常都会自动检测并阻止任何尝试导致缓冲区溢出的尝试(例如,通过引发异常或给出缓冲区增加了更多的空间),但是有两种语言不是这样的: C和C ++语言. 由于C \ C ++语言具有灵活的应用程序特性,通常允许将其他数据写入剩余内存中的任何位置,并且这种情况可能被利用来导致意外结果.

此外,用C \ C ++编写正确的代码以一致地处理缓冲区溢出更加困难;很容易意外导致缓冲区溢出. 更重要的是,C \ C ++被广泛使用. 例如,Red Hat Linux 7.1中86%的代码行是用C或C ++编写的. 因此,大量的代码易受此问题的影响,缓冲区溢出是很常见的事情. 蠕虫很容易使用缓冲区溢出漏洞来造成极大的危害. 例如,2001年7月19日,CodeRed蠕虫爆发,造成的损失估计超过20亿美元[2]. 2001年9月18日,Nimda蠕虫被发现造成的损失甚至更大,超过26亿美元. Slapper蠕虫于2002年出现,Slammer蠕虫于2003年1月25日爆发,并于2004年5月1日发现了“ Shockwave”. 安全性造成的破坏是前所未有的. 以上病毒均使用缓冲区溢出漏洞. 缓冲区溢出攻击占远程网络攻击的绝大多数. 这样的攻击可以使匿名Internet用户有机会获得主机的部分或全部控制权. 如果可以有效地消除缓冲区溢出漏洞,则可以缓解很大一部分安全威胁. 编写正确的代码是一项非常有意义的任务,特别是就像编写免费且容易出错的C风格程序一样. 这种风格是由在追求性能时忽略正确性的传统造成的.

溢出攻击_缓冲区溢出攻击_堆溢出攻击怎么办

尽管人们花了很长时间才知道如何编写安全程序,但是仍然出现带有安全漏洞的程序. 因此,人们开发了工具和技术来帮助没有经验的程序员编写安全正确的程序. 最简单的方法是使用grep在源代码中搜索易受攻击的库调用,例如对strcpy和sprintf的调用. 这两个功能都不检查输入参数的长度. 实际上,C标准库的所有版本都有这样的问题. 此外,人们还开发了一些高级故障排除工具,例如故障注入. 这些工具的目的是通过人为地随机生成一些缓冲区溢出来查找代码中的安全漏洞. 还有一些静态分析工具可用于检测缓冲区溢出的存在. 尽管这些工具可以帮助程序员开发更安全的程序,但是由于C语言的特性,这些工具无法找到所有缓冲区溢出漏洞. 因此,错误检测技术只能用于减少缓冲区溢出的可能性,而不能完全消除其存在. 通过使被攻击程序的数据段的地址空间不可执行,从而使攻击者无法执行嵌入在被攻击程序的输入缓冲区中的代码,该技术称为非执行缓冲区技术. 在早期的Unix系统设计中,仅允许程序代码在代码段中执行. 但是,由于性能和功能更好,Unix和MS Windows系统经常将可执行代码动态地放入数据段中,这也是缓冲区溢出的原因.


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-203074-1.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    • 龙锐
      龙锐

      不然堂堂十四亿大国该何去何从

    热点图片
    拼命载入中...