2022年溢出缓冲区攻击原理与防护共享 .pdf
《2022年溢出缓冲区攻击原理与防护共享 .pdf》由会员分享,可在线阅读,更多相关《2022年溢出缓冲区攻击原理与防护共享 .pdf(5页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、溢出缓冲区攻击原理与防护考号:姓名:艾真保 内容提要 缓冲区溢出是一种众人熟知、非常危险的漏洞,不分什么系统、什么程序,都广泛存在的,非常常见的一种漏洞。也是被恶意攻击者最多使用的攻击方法。本文详细分析了缓冲区溢出的原理,描述了网络攻击者利用缓冲区溢出漏洞进行系统攻击的一般过程,并简单讨论了几种缓冲区溢出的保护方法。 关键词 缓冲区溢出缓冲区溢出漏洞安全攻击缓冲区溢出保护一、引言缓冲区溢出漏洞,是近十几年最为常见的一种安全漏洞。远程网络攻击的绝大多数都是利用了缓冲区溢出漏洞,这种攻击可以使得一个匿名的Internet 用户有机会获得一台主机的部分或全部的控制权!因此,它代表了一类极其严重的安全
2、威胁,它可能将一台主机甚至一个特定的网络暴露在远程攻击者的完全控制之下。缓冲区溢出攻击之所以成为一种常见的攻击手段,其原因在于缓冲区溢出漏洞太普通了,并且易于实现。而且,缓冲区溢出所以成为远程攻击的主要手段,其原因在于缓冲区溢出漏洞给予了攻击者所想要的一切,它可以让攻击者植入并且执行攻击代码。被植入的攻击代码以一定的权限运行有缓冲区溢出漏洞的程序,从而得到被攻击主机的控制权。本文简单介绍了缓冲区溢出的基本原理和预防办法。二、缓冲区溢出的概念和原理缓冲区是内存中存放数据的地方。在程序试图将数据放到机器内存中的某一个位置的时候,因为没有足够的空间就会发生缓冲区溢出。而人为的溢出则是有一定企图的,攻
3、击者写一个超过缓冲区长度的字符串,植入到缓冲区,然后再向一个有限空间的缓冲区中植入超长的字符串,这时可能会出现两个结果:一是过长的字符串覆盖了相邻的存储单元,引起程序运行失败,严重的可导致系统崩溃;另一个结果就是利用这种漏洞可以执行任意指令,甚至可以取得系统root 特级权限。缓冲区是程序运行的时候机器内存中的一个连续块,它保存了给定类型的数据,随着动态分配变量会出现问题。大多时为了不占用太多的内存,一个有动态分配变量的程序在程序运行时才决定给它们分配多少内存。如果程序在动态分配缓冲区放入超长的数据,它就会溢出了。一个缓冲区溢出程序使用这个溢出的数据将汇编语言代码放到机器的内存里,通常是产生
4、root 权限的地方。 仅仅单个的缓冲区溢出并不是问题的根本所在。但如果溢出送到能够以root 权限运行命令的区域,一旦运行这些命令,那可就等于把机器拱手相让了。造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。例如下面程序:example1.c void func1(char *input) char buffer16; strcpy(buffer, input); 上面的 strcpy()将直接吧 input中的内容 copy到buffer 中。这样只要 input的长度大于 16,就会造成 buffer 的溢出,使程序运行出错。存在像strcpy这样的问题的标准函数还有strcat
5、(), sprintf(), vsprintf(), gets(), scanf(), 以及在循环内的 getc(),fgetc(),getchar() 等。当然,随便往缓冲区中填东西造成它溢出一般只会出现Segmentation fault 错误,而不能达到攻击的目的。最常见的手段是通过制造缓冲区溢出使程序运行一个用户shell,再通过 shell执行其他命令。如果该程序属于root且有 suid权限的话,攻击者就获得了一个有root 权限的 shell,便可以对系统进行任意操作了。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - -
6、- 名师精心整理 - - - - - - - 第 1 页,共 5 页 - - - - - - - - - 请注意,如果没有特别说明,下面的内容都假设用户使用的平台为基于Intel x86 CPU的Linux系统。对其他平台来说,本文的概念同样适用,但程序要做相应修改。三、制造缓冲区溢出一个程序在内存中通常分为程序段、数据段和堆栈三部分。程序段里放着程序的机器码和只读数据。数据段放的是程序中的静态数据。动态数据则通过堆栈来存放。在内存中,它们的位置是:当程序中发生函数调用时,计算机做如下操作:首先把参数压入堆栈;然后保存指令寄存器(IP)中的内容作为返回地址 (RET) ;第三个放入堆栈的是基址
7、寄存器(FP);然后把当前的栈指针(SP) 拷贝到 FP ,作为新的基地址;最后为本地变量留出一定空间,把SP 减去适当的数值。以下面程序为例:example2.c void func1(char * input) char buffer16; strcpy(buffer, input); void main() char longstring256; int i; for( i = 0; i 255; i+) longstring i = B; func1(longstring); 当调用函数 func1()时,堆栈如下不用说,程序执行的结果是Segmentation fault (core
8、 dumped) 或类似的出错信息。因为从buffer开始的 256个字节都将被 * input 的内容 B覆盖,包括 sfp, ret,甚至 *input 。B的16进值为 0 x41,所以函数的返回地址变成了0 x41414141,这超出了程序的地址空间,所以出现段错误。四、缓冲区溢出漏洞攻击方式缓冲区溢出漏洞可以使任何一个有黑客技术的人取得机器的控制权甚至是最高权限。一般利用缓冲区溢出名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 5 页 - - - - - - -
9、 - - 漏洞攻击 root 程序,大都通过执行类似“exec (sh) ”的执行代码来获得root 的shell。黑客要达到目的通常要完成两个任务,就是在程序的地址空间里安排适当的代码和通过适当的初始化寄存器和存储器,让程序跳转到安排好的地址空间执行。1、 在程序的地址空间里安排适当的代码在程序的地址空间里安排适当的代码往往是相对简单的。如果要攻击的代码在所攻击程序中已经存在了,那么就简单地对代码传递一些参数,然后使程序跳转到目标中就可以完成了。攻击代码要求执行“exec( /bin/sh ) ”,而在 libc库中的代码执行“exec(arg) ”,其中的 “arg”是个指向字符串的指针参
10、数,只要把传入的参数指针修改指向“ /bin/sh”,然后再跳转到libc库中的响应指令序列就可以了。当然,很多时候这个可能性是很小的,那么就得用一种叫 “ 植入法 ” 的方式来完成了。当向要攻击的程序里输入一个字符串时,程序就会把这个字符串放到缓冲区里,这个字符串包含的数据是可以在这个所攻击的目标的硬件平台上运行的指令序列。缓冲区可以设在:堆栈(自动变量) 、堆(动态分配的)和静态数据区(初始化或者未初始化的数据)等的任何地方。也可以不必为达到这个目的而溢出任何缓冲区,只要找到足够的空间来放置这些攻击代码就够了。2、 控制程序转移到攻击代码的形式缓冲区溢出漏洞攻击都是在寻求改变程序的执行流程
11、,使它跳转到攻击代码,最为基本的就是溢出一个没有检查或者其他漏洞的缓冲区,这样做就会扰乱程序的正常执行次序。通过溢出某缓冲区,可以改写相近程序的空间而直接跳转过系统对身份的验证。原则上来讲攻击时所针对的缓冲区溢出的程序空间可为任意空间。但因不同地方的定位相异,所以也就带出了多种转移方式。( 1)Function Pointers (函数指针)在程序中, “void (* foo) ( )”声明了个返回值为“void ” Function Pointers的变量 “foo ”。Function Pointers 可以用来定位任意地址空间,攻击时只需要在任意空间里的Function Pointer
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年溢出缓冲区攻击原理与防护共享 2022 溢出 缓冲区 攻击 原理 防护 共享
限制150内