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

防范缓冲区溢出方法_一定程度上能防范缓冲区溢出攻击的措施有哪些_缓冲区溢出发生在哪(4)

电脑杂谈  发布时间:2017-02-02 23:18:46  来源:网络整理

虽然这些工具帮助程序员开发更安全的程序,但是由于C语言的特点,这些工具不可能找出所有的缓冲区溢出漏洞。所以,侦错技术只能用来减少缓冲区溢出的可能,并不能完全地消除它的存在。 通过操作系统使得缓冲区不可执行,从而阻止攻击者植入攻击代码 通过使被攻击程序的数据段地址空间不可执行,从而使得攻击者不可能执行被植入被攻击程序输入缓冲区的代码,这种技术被称为非执行的缓冲区技术。在早期的Unix系统设计中,只允许程序代码在代码段中执行。但是Unix和MS Windows系统由于要实现更好的性能和功能,往往在数据段中动态地放入可执行的代码,这也是缓冲区溢出的根源。为了保持程序的兼容性,不可能使得所有程序的数据段不可执行。 但是可以设定堆栈数据段不可执行,这样就可以保证程序的兼容性。Linux和Solaris都发布了有关这方面的内核补丁。因为几乎没有任何合法的程序会在堆栈中存放代码,这种做法几乎不产生任何兼容性问题,除了在Linux中的两个特例,这时可执行的代码必须被放入堆栈中: ⑴信号传递 Linux通过向进程堆栈释放代码然后引发中断来执行在堆栈中的代码来实现向进程发送Unix信号。非执行缓冲区的补丁在发送信号的时候是允许缓冲区可执行的。

一定程度上能防范缓冲区溢出攻击的措施有哪些_防范缓冲区溢出方法_缓冲区溢出发生在哪

⑵GCC的重用 研究发现gcc在堆栈区里放置了可执行的代码作为重用之用。然而,关闭这个功能并不产生任何问题,只有部分功能似乎不能使用。 非执行堆栈的保护可以有效地对付把代码植入自动变量的缓冲区溢出攻击,而对于其它形式的攻击则没有效果。通过引用一个驻留的程序的指针,就可以跳过这种保护措施。其它的攻击可以采用把代码植入堆或者静态数据段中来跳过保护。 这种方法有效地阻止了很多缓冲区溢出的攻击,但是攻击者并不一定要植入攻击代码来实现缓冲区溢出的攻击,所以这种方法还是存在很多弱点的。 利用编译器的数组边界检查来实现缓冲区的保护 数组边界检查能防止所有的缓冲区溢出的产生和攻击。这是因为只要数组不能被溢出,溢出攻击也就无从谈起。为了实现数组边界检查,则所有的对数组的读写操作都应当被检查以确保对数组的操作在正确的范围内。最直接的方法是检查所有的数组操作,但是通常可以采用一些优化的技术来减少检查的次数。目前有以下的几种检查方法: (1) Jones & Kelly: C的数组边界检查 Richard Jones和Paul Kelly开发了一个gcc的补丁,用来实现对C程序完全的数组边界检查。

由于没有改变指针的含义,所以被编译的程序和其它的gcc模块具有很好的兼容性。更进一步的是,他们由此从没有指针的表达式中导出了一个“基”指针,然后通过检查这个基指针来侦测表达式的结果是否在容许的范围之内。当然,这样付出的性能上的代价是巨大的:对于一个频繁使用指针的程序,比如向量乘法,将由于指针的频繁使用而使速度比本来慢30倍。这个编译器目前还很不成熟;一些复杂的程序还不能在这个上面编译,执行通过。 (2) Compaq C 编译器 Compaq公司为Alpha CPU开发的C编译器支持有限度的边界检查(使用check_bounds参数)。 这些限制是: 只有显式的数组引用才被检查,比如“a[3]”会被检查,而“* a+3 ”则不会。由于所有的C数组在传送的时候是指针传递的,所以传递给函数的的数组不会被查。带有危险性的库函数如strcpy不会在编译的时候进行边界检查,即便是指定了边界检查。 由于在C语言中利用指针进行数组操作和传递是如此的频繁,因此这种局限性是非常严重的。通常这种边界检查用来程序的查错,而且不能保证不发生缓冲区溢出的漏洞。 (3) Purify:内存存取检查 Purify是C程序调试时查看内存使用的工具。


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

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

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