免费网站建设seo,租房网站的财务分析表怎么做,指定网站建设项目规划书,专门做产品排名的网站0x00 缓冲区溢出概念
缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量溢出的数据覆盖在合法数据上。
理想的情况是程序检查数据长度并不允许输入超过缓冲区长度的字符#xff0c;但是绝大多数程序都会假设数据长度总是与所分配的储存空间相匹配…0x00 缓冲区溢出概念
缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量溢出的数据覆盖在合法数据上。
理想的情况是程序检查数据长度并不允许输入超过缓冲区长度的字符但是绝大多数程序都会假设数据长度总是与所分配的储存空间相匹配这就为缓冲区溢出埋下隐患操作系统所使用的缓冲区又被称为堆栈。在各个操作进程之间指令会被临时储存在堆栈当中堆栈也会出现缓冲区溢出。
0x01 缓冲区溢出原理
程序员通过往程序的缓冲区写超出其长度的内容造成缓冲区的溢出从而破坏程序的堆栈使程序转而执行其它指令以达到攻击的目的。造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。例如下面程序 void function(char *str) {char buffer[16];strcpy(buffer,str);}上面的strcpy()将直接把str中的内容copy到buffer中。这样只要str的长度大于16就会造成buffer的溢出使程序运行出错。存在象strcpy这样的问题的标准函数还有strcat()sprintf()vsprintf()gets()scanf()等。
当然随便往缓冲区中填东西造成它溢出一般只会出现“分段错误”Segmentation fault而不能达到攻击的目的。最常见的手段是通过制造缓冲区溢出使程序运行一个用户shell再通过shell执行其它命令。如果该程序属于root且有suid(Set User ID,)权限的话攻击者就获得了一个有root权限的shell可以对系统进行任意操作了。
缓冲区溢出攻击之所以成为一种常见安全攻击手段其原因在于缓冲区溢出漏洞太普遍了并且易于实现。而且缓冲区溢出成为远程攻击的主要手段其原因在于缓冲区溢出漏洞给予了攻击者他所想要的一切植入并且执行攻击代码。被植入的攻击代码以一定的权限运行有缓冲区溢出漏洞的程序从而得到被攻击主机的控制权。
在1998年Lincoln实验室用来评估入侵检测的的5种远程攻击中有2种是缓冲区溢出。而在1998年CERT的13份建议中有9份是是与缓冲区溢出有关的在1999年至少有半数的建议是和缓冲区溢出有关的。在Bugtraq的调查中有2/3的被调查者认为缓冲区溢出漏洞是一个很严重的安全问题。
0x02 缓冲区溢出漏洞攻击方式
缓冲区溢出漏洞可以使任何一个有黑客技术的人取得机器的控制权甚至是最高权限。一般利用缓冲区溢出漏洞攻击root程序大都通过执行类似“exec(sh)”的执行代码来获得root 的shell。黑客要达到目的通常要完成两个任务就是在程序的地址空间里安排适当的代码和通过适当的初始化寄存器和存储器让程序跳转到安排好的地址空间执行。 1. 在程序的地址空间里安排适当的代码 在程序的地址空间里安排适当的代码往往是相对简单的。如果要攻击的代码在所攻击程序中已经存在了那么就简单地对代码传递一些参数然后使程序跳转到目标中就可以完成了。攻击代码要求执行“exec(‘/bin/sh’)”而在libc库中的代码执行“exec(arg)”其中的“arg”是个指向字符串的指针参数只要把传入的参数指针修改指向“/bin/sh”然后再跳转到libc库中的响应指令序列就可以了。当然很多时候这个可能性是很小的那么就得用一种叫“植入法”的方式来完成了。
当向要攻击的程序里输入一个字符串时程序就会把这个字符串放到缓冲区里这个字符串包含的数据是可以在这个所攻击的目标的硬件平台上运行的指令序列。缓冲区可以设在堆栈自动变量、堆动态分配的和静态数据区初始化或者未初始化的数据等的任何地方。也可以不必为达到这个目的而溢出任何缓冲区只要找到足够的空间来放置这些攻击代码就够了。 2. 控制程序转移到攻击代码的形式 缓冲区溢出漏洞攻击都是在寻求改变程序的执行流程使它跳转到攻击代码最为基本的就是溢出一个没有检查或者其他漏洞的缓冲区这样做就会扰乱程序的正常执行次序。通过溢出某缓冲区可以改写相近程序的空间而直接跳转过系统对身份的验证。原则上来讲攻击时所针对的缓冲区溢出的程序空间可为任意空间。但因不同地方的定位相异所以也就带出了多种转移方式。 Function Pointers函数指针 在程序中“void (* foo) ( )”声明了个返回值为“void” Function Pointers的变量“foo”。Function Pointers可以用来定位任意地址空间攻击时只需要在任意空间里的Function Pointers邻近处找到一个能够溢出的缓冲区然后用溢出来改变Function Pointers。当程序通过Function Pointers调用函数程序的流程就会实现。 Activation Records激活记录 当一个函数调用发生时堆栈中会留驻一个Activation Records它包含了函数结束时返回的地址。执行溢出这些自动变量使这个返回的地址指向攻击代码再通过改变程序的返回地址。当函数调用结束时程序就会跳转到事先所设定的地址而不是原来的地址。这样的溢出方式也是较常见的。 植入综合代码和流程控制 常见的溢出缓冲区攻击类是在一个字符串里综合了代码植入和Activation Records。攻击时定位在一个可供溢出的自动变量然后向程序传递一个很大的字符串在引发缓冲区溢出改变Activation Records的同时植入代码权因C在习惯上只为用户和参数开辟很小的缓冲区。植入代码和缓冲区溢出不一定要一次性完成可以在一个缓冲区内放置代码这个时候并不能溢出缓冲区然后通过溢出另一个缓冲区来转移程序的指针。这样的方法一般是用于可供溢出的缓冲区不能放入全部代码时的。如果想使用已经驻留的代码不需要再外部植入的时候通常必须先把代码做为参数。在libc熟悉C的朋友应该知道现在几乎所有的C程序连接都是利用它来连接的中的一部分代码段会执行“exec(something)”当中的something就是参数使用缓冲区溢出改变程序的参数然后利用另一个缓冲区溢出使程序指针指向libc中的特定的代码段。
程序编写的错误造成网络的不安全性也应当受到重视因为它的不安全性已被缓冲区溢出表现得淋漓尽致了。
0x03 缓冲区溢出的保护方法
目前有四种基本的方法保护缓冲区免受缓冲区溢出的攻击和影响
强制写正确的代码的方法
编写正确的代码是一件非常有意义但耗时的工作特别像编写C语言那种具有容易出错倾向的程序如字符串的零结尾这种风格是由于追求性能而忽视正确性的传统引起的。尽管花了很长的时间使得人们知道了如何编写安全的程序具有安全漏洞的程序依旧出现。因此人们开发了一些工具和技术来帮助经验不足的程序员编写安全正确的程序。虽然这些工具帮助程序员开发更安全的程序但是由于C语言的特点这些工具不可能找出所有的缓冲区溢出漏洞。所以侦错技术只能用来减少缓冲区溢出的可能并不能完全地消除它的存在。除非程序员能保证他的程序万无一失否则还是要用到以下部分的内容来保证程序的可靠性能。
通过操作系统使得缓冲区不可执行从而阻止攻击者殖入攻击代码
这种方法有效地阻止了很多缓冲区溢出的攻击但是攻击者并不一定要殖入攻击代码来实现缓冲区溢出的攻击所以这种方法还是存在很多弱点的。
利用编译器的边界检查来实现缓冲区的保护
这个方法使得缓冲区溢出不可能出现从而完全消除了缓冲区溢出的威胁但是相对而言代价比较大。
在程序指针失效前进行完整性检查
这样虽然这种方法不能使得所有的缓冲区溢出失效但它的确确阻止了绝大多数的缓冲区溢出攻击而能够逃脱这种方法保护的缓冲区溢出也很难实现。
本文链接https://blog.csdn.net/qq_17204441/article/details/90105170