关于对抗缓冲区溢出攻击

缓冲区溢出说白了就是因为内存中的非法访问而导致的一些状态的破坏。

这一点,C语言中的一些和数组有关的库函数最容易导致这类情况。

缓冲区溢出攻击,有很大一部分是通过数据的溢出,内存的非法访问来执行一些攻击代码,因为数据在栈中一旦溢出,那么他就会覆盖一些重要的状态,从而被攻击者操控。

那么关于对抗缓冲区溢出的攻击,有这样的几种方法

1、栈的随机化

在植入缓冲区溢出攻击的代码的时候,还要植入指向这段代码的指针,指针指向这段代码的栈的位置。因为执行这段代码是考指针进行跳转过去的。由于以前的操作系统程序的栈的位置相对来说比较固定,所以是很好找的。也就是说,每一次执行一个程序,他的程序栈的位置都是不固定的,这样一来,第一个是很难植入攻击代码,第二个是即使你植入了,那么你的指针要指向这段攻击代码的栈空间也很困难,因为他是一直在变动的。

但是攻击者仍然可以通过枚举不同的地址进行攻击。这里有一个办法就是在攻击代码之前加入空雪橇操作,即加入很长一段的nop操作来是程序计数器+1.

我对这种攻击方式的理解是这样的,攻击的代码已经嵌入到了一个程序的栈中,但是由于这个栈的位置在不断的变化所以找不到这段攻击代码的准确位置。所以在攻击代码之前加入很长的一段Nop操作,使得程序计数器+1指向下一条指令。只要在执行nop操作的过程中能够找到攻击代码相应的地址数据,就能够跳转到攻击代码进行执行。

要破解指定范围内的栈的随机化,就要进行不断的尝试,尝试次数诚意nop的大小就能够判断出是否能够破解。

2、栈破坏的检测

由于我们不能够真正的杜绝数组的越界书写,我们找到一个新的办法就是在超越局部缓冲区边界的时候,在修改生效之前,先根据一个标志值进行判定,如果越界修改那么这个值肯定就会改变,那么就拒绝这次访问,这个值的音译是金丝雀值,他的位置在局部缓冲区和局部栈状态之间。也就是说,当局部缓冲区溢出想要影响到栈的状态的时候,要先经过这个金丝雀的值才行,这样的话通过设立一个哨兵就 可以防止非法访问的事实发生。并且这个值是随机的,攻击者是不能够猜出它是什么的。一般来说如果真的要使用这种办法来防止栈的缓冲区溢出的时候,缓冲区向栈底的方向,相邻的必须放置金丝雀值,不能放置任何其他的数值,因为很可能会遭到破坏。

3、限制可执行代码区域

很多系统对内存或者存储器有着三种访问形式的区别:可读,可写,可执行。这种方法就是要限定可执行的内存区域,从而让攻击代码即使在内存也不能够执行。

X86中,可读和可执行合成为一个标志位来进行表示,这错误的,会给攻击代码留下机会。但是AMD就在内存保护中增加了NX位,也就看是不可执行位,把三个权限都分开了。通常来说,整个内存中应该都有可读的权限,可执行的权限只有在保存编译器产生代码的存储区域内才会有。

时间: 2024-11-03 21:33:15

关于对抗缓冲区溢出攻击的相关文章

缓冲区溢出以及缓冲区溢出攻击

缓冲区溢出是指当计算机程序向缓冲区内填充的数据位数超过了缓冲区本身的容量.溢出的数据覆盖在合法数据上.理想情况是,程序检查数据长度并且不允许输入超过缓冲区长度的字符串.但是绝大多数程序都会假设数据长度总是与所分配的存储空间相匹配,这就为缓冲区溢出埋下隐患. 操作系统所使用的缓冲区又被称为堆栈,在各个操作进程之间,指令被临时存储在堆栈当中,堆栈也会出现缓冲区溢出. 当一个超长的数据进入到缓冲区时,超出部分就会被写入其他缓冲区,其他缓冲区存放的可能是数据.下一条指令的指针,或者是其他程序的输出内容,

CSAPP缓冲区溢出攻击实验(下)

CSAPP缓冲区溢出攻击实验(下) 3.3 Level 2: 爆竹 实验要求 这一个Level的难度陡然提升,我们要让getbuf()返回到bang()而非test(),并且在执行bang()之前将global_value的值修改为cookie.因为全局变量与代码不在一个段中,所以我们不能让缓冲区一直溢出到.bss段(因为global_value初始化为0,所以它会被放在.bss而非.data段以节省空间)覆盖global_value的值.若修改了.bss和.text之间某些只读的段会引起操作系

缓冲区溢出攻击

缓冲区溢出(Buffer Overflow)是计算机安全领域内既经典而又古老的话题.随着计算机系统安全性的加强,传统的缓冲区溢出攻击方式可能变得不再奏效,相应的介绍缓冲区溢出原理的资料也变得“大众化”起来.其中看雪的<0day安全:软件漏洞分析技术>一书将缓冲区溢出攻击的原理阐述得简洁明了.本文参考该书对缓冲区溢出原理的讲解,并结合实际的代码实例进行验证.不过即便如此,完成一个简单的溢出代码也需要解决很多书中无法涉及的问题,尤其是面对较新的具有安全特性的编译器——比如MS的Visual Stu

缓冲区溢出攻击实验(另附源代码)

缓冲区溢出攻击代码如下: #include<Windows.h> #include<stdio.h> #include<string.h> void f(char *input) { char buffer[10]; strcpy(buffer,input); printf("缓冲区字符为=%s",buffer); /* // 进行防御,当输入长度过长时跳出 char buffer[10]; int b; b=strlen(input); if(b&

缓冲区溢出攻击(待看)

缓冲区溢出攻击 本词条缺少信息栏.名片图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! 缓冲区溢出攻击是利用缓冲区溢出漏洞所进行的攻击行动.缓冲区溢出是一种非常普遍.非常危险的漏洞,在各种操作系统.应用软件中广泛存在.利用缓冲区溢出攻击,可以导致程序运行失败.系统关机.重新启动等后果. 1简介编辑 缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上.理想的情况是:程序会检查数据长度,而且并不允许输入超过缓冲区长度的字符.但是绝大多数程序都会

【软件安全】汇编语言超浓缩教程&缓冲区溢出攻击——1

对初学者而言,汇编的许多命令太复杂,往往学习很长时间也写不出一个漂漂亮亮的程序,妨碍我们学习汇编的兴趣,不少人就此放弃.我个人的看法是学汇编,不一定要写程序,写程序确实不是汇编的强项,大家不妨玩玩DEBUG,有时CRACK出一个小软件比完成一个程序更有成就感 " 哎哟,哥们儿,还捣鼓汇编呢?那东西没用,兄弟用VB"钓"一个API就够你忙活个十天半月的,还不一定搞出来."此君之言倒也不虚,那吾等还有无必要研他一究呢?(废话,当然有啦!要不然你写这篇文章干嘛.)别急,别

缓冲区溢出攻击-入门例子

由于工作的需要,开始学习安全领域的知识了.感觉这个领域的知识点太多,而且非常底层,缓冲区溢出攻击这个算是最容易理解的了,就先从这个开始入门吧~ 先试个最简单的例子,学习学习原理~ 本文代码和原理主要参考http://blog.csdn.net/linyt/article/details/43283331博客,大部分内容是直接抄原博客,加了一点自己测试时遇到的问题. 测试环境 Ubuntu 16.04 TLS 测试前准备 1. 关闭地址随机化功能: echo 0 > /proc/sys/kerne

CSAPP缓冲区溢出攻击实验(上)

CSAPP缓冲区溢出攻击实验(上) 下载实验工具.最新的讲义在这. 网上能找到的实验材料有些旧了,有的地方跟最新的handout对不上.只是没有关系,大体上仅仅是程序名(sendstring)或者參数名(bufbomb -t)的差异,不影响我们的实验. 1.实验工具 1.1 makecookie 后面实验中,五次"攻击"中有四次都是使你的cookie出如今它原本不存在的位置,所以我们首先要为自己产生一个cookie. 实验工具中的makecookie就是生成cookie用的.參数是你的

黑客中级技术 缓冲区溢出攻击的介绍

大家都知道缓冲区溢出是一种普遍.而且危险性极强的漏洞,在各种操作系统.应用软件中广泛存在.利用缓冲区溢出攻击,可以导致程序运行失败.系统当机.重新启动等后果. 更为严重的是,可以利用它执行非授权指令,甚至可以取得系统特权,进而进行各种非法操作. 缓冲区溢出攻击有多种英文名称:buffer overflow,buffer overrun,smash the stack,trash the stack,scribble the stack, mangle the stack, memory leak