033
漏洞程序的分析与利用样本
(样本只提供该系统的基本情况介绍,若需要完整的设计和论文,建议您购买本系统,凡是购买本站系统的,本站均根据您的要求,把系统上的开发信息,题目等修改成符合您的要求)
本设计包含内容:源代码+毕业论文
论文大概:
漏洞程序的分析与利用
摘 要:自从有了网络以来,网络安全就成为了一个被人津津乐道的话题,面对网络上众多的病毒泛滥和黑客攻击,如何有效地保护好自己的信息不被窃取一直是网络安全人事在研究的重点。一直以来,矛和盾总是成对出现的,知道进攻的手法,才能有效地展开防御。本课题着重于探讨网络上最流行的黑客攻击手段-缓冲区溢出。希望通过对此种攻击手法的介绍,能让大家有个感性的认识。在此,首先介绍缓冲区溢出的概念和原理。其次,通过分析wuftp服务器的一个漏洞,来详细分析溢出代码与利用。最后,阐述缓冲区溢出的危害,给出相应的防御方法。
关键词:缓冲区;返回地址;堆栈
The analyse and using of programe about vulnerability
Abstract: Network security has been becoming a take delight in
talking about topic since it came out.Facing such large amount of
virus and attackes by hacker,how to protect our information not to
be filched effectively is the keystone to those who are
investigating network security.since lance and dong are always
appear as twins,so we’d better know some techniques of attacking to
recovery effectively.Our text is to discuss the most popular resort
to Hacker—buffer overflow.We hope it can help having a sensibility
understand of buffer overflow through the introduce of the
resort.Here,we first introduce the concept and theory of buffer
overflow.Then we labour the code and use of buffer overflow through
analyse a hoke of wuftp sever.At last,we expatiate the harmof buffer
overflow and give the way of recovery.
Key words:buffer; the
return address; stack
目录
1、序言 4
2、缓冲区溢出的概念和原理 5
3、缓冲区溢出的危害和一些防御方法 8
4、程序的框架 11
5、数据结构 16
6、结果 31
7、结论 32
8、心得体会 32
参考文献 33
附录: 38
1、序言
随着信息化的发展,信息已经成为一种特殊的生产力。同时,由于网络的快速普及,处理信息的多样性也使得计算机成为人类社会中一个不可或缺的工具。其提供的多种信息服务,给人类带来了便捷的生活方式。尤其是金融业的信息化进程,使资金流动加快,清算资料的速度大大提高,异地的资金划转也变得十分快捷了。可以这么说,信息化和计算机网络把人和人、国和国的距离缩小了。网络所提供的资源共享性、用户使用的方便性、分布处理提高效率的特性以及可扩充性,在一定程度上大大增加了网络受攻击的可能性。信息安全问题已经威胁到国家的政治、经济、军事、文化、意识形态等领域。同时,信息安全问题也是人们能否保护自己个人隐私的关键。如何解决网络安全问题?如何制止计算机犯罪?如何建立安全的网络体系?这些问题已经成为全球关注的焦点。解决网络安全问题,已经是迫在眉睫的事情了。于是网络安全应运而生。
网络安全是一门涉及到计算机科学、网络技术、通信技术、密码技术、信息安全技术、应用教学等多种学科的边缘科学。一方面,由于我们现在用的操作系统和应用软件程序代码的不完善,导致漏洞百出。另一方面,也因为网络没有国界之分,而各国政府对网络犯罪的打击力度不同和不够,使网络成为破坏者犯罪的一张温床。面对这样的现状,认清网络的脆弱性和潜在的威胁,采取强有力的安全策略,对于保障网络的安全性将变得十分重要。
虽说国内有很多安全组织,例如中国红客军团,黑客联盟,绿盟,鹰派等等,但大多数人的网络安全意识还是非常浅薄,甚至一点网络安全意识都没有。所以按照比例来说,是相当少的一部分人。而当今,国内外的形势又非常严峻,前几年的中美战机相撞事件后,发生了中美黑客大战,美国黑掉了中国700多个网站,很长时间才恢复正常。而中国才黑了美国150个左右的站点,
美国短时间内就恢复了。这次正面冲突,淋漓尽致了暴露了国内外网络安全技术的巨大差距,不论是个人技术和意识,还是系统本身的漏洞。都给我们敲响了警钟。网络信息交流依附于网络安全,网络安全为网络信息交流服务。在这种情况和环境下,便产生了本课题。
2、缓冲区溢出的概念和原理
几十年来,缓冲区溢出一直引起许多严重的安全问题。其中最著名的例子是:1988年,因特网蠕虫程序在finger中利用缓冲区溢出感染了因特网中的数万台机器。但是,缓冲区溢出问题并非已成古老的历史,缓冲区溢出(又称堆栈溢出)攻击已成为最常用的黑客技术之一。据统计,仅去年缓冲区溢出就使占使CERT/CC提出建议的所有重大安全错误的5%以上。[1]
众所周知,所谓缓冲区就是内存中存放数据的地方,是程序运行时计算机内存中的一个连续的块,它保存了给定类型的数据。当将一大杯的水倒入一个小杯子,装不下的水就会四处冒出。称之为水溢出。[2]同理,当向一个缓冲区内填充数据,如果数据的长度很长很长,超过了缓冲区本身的容量,那么结果就会像水四处冒出一样,数据也会溢出存储空间,装不下的数据则会覆盖在合法数据上,这就是缓冲区和缓冲区溢出的道理。由于缓冲区在程序中是动态分配的,为了不占用太多的内存,一个有动态分配变量的程序在程序运行时才决定给它们分配多少内存。当程序试图将数据放到计算机内存中的某一位置,但没有足够的空间时会发生缓冲区溢出。溢出的数据会覆盖掉任何数据、指针或内容。
一个缓冲区溢出应用程序使用这个溢出的数据将汇编语言代码放到计算机的内存中,通常是产生超级用户权限的地方。单单的缓冲区溢出,并不会产生太大的安全缺陷,最多造成程序的崩溃,将溢出代码送到能够以超级管理员权限运行命令的区域是最大的安全缺陷。
缓冲区溢出攻击的方式是多种多样的,如果按照黑客重定向程序流程的方式来看,有直接植入自己代码的方式,也有跳转执行系统中已经加载了的代码的方式;而根据黑客利用缓冲区溢出漏洞的外部条件不同,又可以分作本地缓冲区溢出和远程缓冲区溢出。
一个程序将操作系统分配给其运行的内存块分为4个区域:[3]
(1) 代码区,存在程序的的代码,即程序中的各个函数代码块。
(2) 全局数据区,存放程序的全局数据和静态数据。
(3) 堆区,存在程序的动态数据。
(4) 栈区,存放程序的局部数据,即各个函数中的数据。
它们的位置如下图一所示:
图一
堆栈是内存中一个连续的块。一个叫堆栈指针的寄存器(SP)指向堆栈的栈顶。堆栈的底部是一个固定地址。堆栈有一个特点就是后进先出。也就是说,后放入的数据第一个取出。它支持两个操作,PUSH和POP。PUSH是将数据放到栈的顶端。POP是将栈顶的数据取出。[6]
在高级语言中,程序函数调用和函数中的临时变量都用到堆栈。参数的传递和返回值是也用到了堆栈。通常对局部变量的引用是通过给出它们对SP的偏移量来实现的。另外还有一个基址指针(FP,在Inter芯片中是BP),许多编译器实际上是用它来引用本地变量和参数的。通常,参数的相对FP的偏移是正的,局部变量是负的。
当函数发生调用时,计算机做如下操作:首先把参数压入堆栈:然后保存指令寄存器(IP)中的内容,作为返回地址(RET);第三个放入堆栈的是基址寄存器(FP);然后把当前的栈指针(SP)拷贝到FP,作为新的基地址;最后为本地变量留出一定空间,把SP减去适当的数值。如下一个程序:[4]
Void
function(int a,int b,int c)
{
Char buffer1[5];
Char
buffer2[10];
}
Void
main()
{
Function(1,2,3)
}
为了理解程序是怎样调用函数function()的,使用-S选项,在Linux下,用gcc进行编译,产生汇编代码输出:
$
gcc –S –o example.s example
看看输出文件中的调用函数的那部分:
Pushl
#3
Pushl #2
Pushl #1
Call
function
这就将3个参数压到堆栈里了,并调用function()。指令call会将指令指针IP压入堆栈。在返回时,RET要用到这个保存的IP。
在函数中,第一要做的事是进行一些必要的处理。每个函数都必须有这些过程:
Pushl
%ebp
Movl %esp,%ebp
Subl
$20,%esp
这几条指令将EBP、基址指针放入堆栈。然后将当前SP拷贝到EBP。然后,为本地变量分配空间,并将它们的大小从SP里减掉。由于内存分配是以字为单位的,因此,这里的buffer1用了8字节(2个字,一个字4字节)。Buffer2用了12字节(3个字)。所以这里将ESP减了20,现在,堆栈看起来应该是如下图二所示:
内存高端
内存低端
c
b
a
Ret
Sfp
Buffer1
Buffer2
图二
8、
客户端溢出服务器
成功后,向服务器输入Shellcode,并且调用系统函数执行Shellcode,最后,成功得到具有Root权限的Shell窗口。如图六
图六
图七
我们看到溢出程序执行以后,在屏幕的最后,出现了gid=0(root),uid=0(root),说明我们得到了具有root权限的shell,到此,我们利用溢出程序成功地溢出了主机。由于此漏洞是利用ftp服务,所以,只要目标主机开了ftp服务,即使装了防火墙,溢出也能成功。