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

缓冲区溢出攻击方式_缓冲区溢出攻击_缓冲区溢出攻击vs(4)

电脑杂谈  发布时间:2017-01-21 19:10:51  来源:网络整理

3.3 数组边界检查

殖入代码引起缓冲区溢出是一个方面,扰乱程序的执行流程是另一个方面。不象非执行缓冲区保护,数组边界检查完全放置了缓冲区溢出的产生和攻击。这样,只要数组不能被溢出,溢出攻击也就无从谈起。为了实现数组边界检查,则所有的对数组的读写操作都应当被检查以确保对数组的操作在正确的范围内。最直接的方法是检查所有的数组操作,但是通常可以采用一些优化的技术来减少检查的次数。目前有以下的几种检查方法:

3.3.1 Compaq C 编译器

Compaq公司为Alpha CPU开发的C编译器(在Tru64的Unix平台上是cc,在Alpha Linux平台上是ccc)支持有限度的边界检查(使用-check_bounds参数)。这些限制是:

只有显示的数组引用才被检查,比如a[3]会被检查,而*(a+3)则不会。

由于所有的C数组在传送的时候是指针传递的,所以传递给函数的的数组不会被检查。

带有危险性的库函数如strcpy不会在编译的时候进行边界检查,即便是指定了边界检查。

由于在C语言中利用指针进行数组操作和传递是如此的频繁,因此这种局限性是非常严重的。通常这种边界检查用来程序的查错,而且不能保证不发生缓冲区溢出的漏洞。

3.3.2 Jones & Kelly: C的数组边界检查

Richard Jones和Paul Kelly开发了一个gcc的补丁,用来实现对C程序完全的数组边界检查。由于没有改变指针的含义,所以被编译的程序和其他的gcc模块具有很好的兼容性。更进一步的是,他们由此从没有指针的表达式中导出了一个基指针,然后通过检查这个基指针来侦测表达式的结果是否在容许的范围之内。

当然,这样付出的性能上的代价是巨大的:对于一个频繁使用指针的程序如向量乘法,将由于指针的频繁使用而使速度比本来慢30倍。

这个编译器目前还很不成熟;一些复杂的程序(如elm)还不能在这个上面编译,执行通过。然而在它的一个更新版本之下,它至少能编译执行ssh软件的加密软件包。其实现的性能要下降12倍。

3.3.3 Purify:存储器存取检查

Purify是C程序调试时查看存储器使用的工具而不是专用的安全工具。Purify使用目标代码插入技术来检查所有的存储器存取。通过用Purify连接工具连接,可执行代码在执行的时候数组的所有引用来保证其合法性。这样带来的性能上的损失要下降3-5倍。

3.3.4 类型-安全语言

所有的缓冲区溢出漏洞都源于C语言缺乏类型安全。如果只有类型-安全的操作才可以被允许执行,这样就不可能出现对变量的强制操作。如果作为新手,可以推荐使用具有类型-安全的语言如Java和ML。

但是作为Java执行平台的Java虚拟机是C程序,因此通过攻击JVM的一条途径是使JVM的缓冲区溢出。因此在系统中采用缓冲区溢出防卫技术来使用强制类型-安全的语言可以收到意想不到的效果。

3.4 程序指针完整性检查

程序指针完整性检查和边界检查由略微的不同。与防止程序指针被改变不同,程序指针完整性检查在程序指针被引用之前检测到它的改变。因此,即便一个攻击者成功地改变了程序的指针,由于系统事先检测到了指针的改变,因此这个指针将不会被使用。

与数组边界检查相比,这种方法不能解决所有的缓冲区溢出问题;采用其他的缓冲区溢出方法就可以避免这种检测。但是这种方法在性能上有很大的优势,而且在兼容性也很好。

程序完整性检查大体上有三个研究方向。在3.4.1中会介绍Snarskii为FreeBSD开发了一套定制的能通过监测cpu堆栈来确定缓冲区溢出的libc。在3.4.2中会介绍我们自己的堆栈保护方法所开发的一个编译器,它能够在函数调用的时候自动生成完整性检测代码。最后在3.4.3,我们介绍正在开发中的指针保护方法,这种方法类似于堆栈保护,它提供对所有程序指针的完整性的保护。


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

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

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