一、什么是缓冲区溢出
缓冲区溢出是指当计算机程序向缓冲区内填充的数据超过了缓冲区本身的容量时,溢出的数据会覆盖合法数据,一般情况下,覆盖数据是没有什么意义的,最多就是让程序执行出错,但是如果输入的数据是攻击者精力构建的入侵程序代码,那么攻击者就能获得程序的控制权限。
二、缓冲区溢出的攻击方式简介
1.流程控制和植入代码;
这个攻击方式比较常见,攻击时定位在一个可供溢出的变量,然后向程序传递字符串,在引发缓冲区溢出改变Actiation records 的同时并植入恶意代码。植入代码和溢出并不一定是在同一时间完成,可以在缓冲区放置代码,然后通过溢出另一个缓冲区来迁移程序的指针。
2.在地址空间安排恶意代码;
如果目标代码在所攻击的程序中已经存在,则简单的对代码传递一些参数,然后使程序执行跳转到目标代码就可以了。应用举例:有的程序有重置管理员密码的功能,通过这种方式,可以重置管理员密码。当然这种可能性比较小,所以要用到另一种方式“植入法”,当向要攻击的程序中输入一个字符串时,程序会把这个字符串放到缓冲区里,这个字符串包含的数据就是目标程序的指令序列。然后再次提交参数,使程序执行缓冲区里面的这个指令序列。
3.控制代码转换为攻击代码
通过溢出某缓冲区,可改写相关程序的空间而直接路过系统对身份的认证。攻击所针对的缓冲区溢出的程序空间可为任意空间。不过,因为不同的地址的定位不同,就有多种转换方式,如函数指针、记录和长跳转缓冲区等。
三、缓冲区溢出的防范
其实安全界的很多大神都一直在为这个事揪心,我也只是简单的罗列出几个,让高手见笑了
1.正确编写代码
这个比较基础,其实在写代码的时候,并不是程序会故意犯错,但一点点的错误就会造成严重的后果,所以代码的编写和代码的审计是异常重要的。
2.数组边界的检查
其实,只要保证数组不被溢出,那么缓冲区溢出攻击就苍白了。所以,在第一点的同时,重点要放到对数组的读写操作检查,这样就可以达到,程序数组的操作在正常、安全范围之内。
3.程序指针完整性
在攻击应用中,程序的指针是常常被利用的,所以,要在程度指针被引用时,要做他的改变检测,这样的话,如果指针被利用,也会因为系统已经检测到了指针的改变而不会造成指针对利用。当然,这个并不能从根本上解决问题。