缓冲区溢出攻击技术系统介绍
- 格式:pdf
- 大小:527.28 KB
- 文档页数:82
缓冲区溢出攻击的基本原理
缓冲区溢出攻击(Buffer Overflow Attack)是一种常见的安全漏洞,指的是攻击者利用输入数据的长度或格式错误,超出程序设计者预留的存储空间范围,从而写入到相邻内存空间中,进而控制程序的执行或修改程序的行为。
缓冲区溢出攻击的基本原理如下:
1.内存分配:程序在运行时会根据变量类型和长度来分配内存空间。
2.缓冲区溢出:攻击者通过向程序输入异常数据,超出了程序预留的内存空
间。
3.覆盖关键数据:溢出的数据覆盖了原本存储的数据,可能是程序的返回地
址、函数指针等关键信息。
4.控制程序行为:攻击者利用溢出的数据修改程序的执行路径,跳转到自己
准备好的恶意代码。
5.执行恶意代码:程序执行了攻击者注入的恶意代码,可能导致系统崩溃、
拒绝服务或远程执行任意命令。
为了避免缓冲区溢出攻击,开发人员可以采取以下措施:
•使用安全的编程语言和工具,如内存安全的语言(如Rust)或经过良好测试的C/C++库。
•限制输入数据的长度,确保不会超过缓冲区可容纳的大小。
•进行输入验证和过滤,确保输入数据符合预期的格式和范围。
•定期更新软件和操作系统,及时修补已知的漏洞。
•实施数据执行保护(DEP)和地址空间布局随机化(ASLR)等安全机制。
综上所述,缓冲区溢出攻击是一种常见的安全漏洞,它利用错误处理输入数据的程序中的缺陷,从而控制程序行为。
开发人员和系统管理员应该密切关注安全问题,采取相应的防护措施,以保护系统和用户的信息安全。
摘要:正文:大纲:1.引言;随着网络安全技术的飞速发展,缓冲区溢出漏洞已经成为当前最具安全威胁的漏洞之一,缓冲区溢出攻击也成为一种非常有效而常见的攻击方法。
如Internet上的第1例蠕虫(Morris)攻击,就是利用了fingerd的缓冲区溢出漏洞。
SANS评选出的2005年威胁最大的20个漏洞中,有8个跟缓冲区溢出有关。
根据CNCERT最近几周的计算机安全漏洞的统计数据,与缓冲区溢出有关的安全事件占了很大的比例。
这些都充分说明了研究缓冲区溢出的重要性。
本文主要介绍了windows下的缓冲区溢出的相关知识。
2.漏洞原因和原理;2.1 产生原因;当向一个已分配了确定存储空间的缓冲区内复制多于该缓冲区处理能力的数据时,就会发生缓冲区溢出,溢出包括堆溢出和堆栈溢出。
它与程序在内存中的分布有关,而它产生的直接原因是由于C/C++程序中的一些函数调用时,没有进行边界检查,如C函数库中的strcpy(),strcat(),sprintf(),gets()等都是不安全的。
由上面的分析可知要产生缓冲区溢出,需要有几个条件: 1) 程序编译时在堆栈上分配了固定大小的缓冲区,并且在对缓冲区进行访问时没有提供边界检查。
这条在C/C ++语言中就满足,而对于有边界检查的语言,如Pascal 等,就没有这样的溢出问题。
2) 程序调用了没有进行边界检查的函数来访问(写操作) 缓冲区,这些函数没有对访问的缓冲区的大小进行判断。
由于在C语言中,字符串以0字节来标识结尾,其中没有字符串的长度信息,所以几个没有判断字符串长度的字符串拷贝函数就是容易出现问题的函数。
这些函数有: strcat()、strcpy()、sprintf()等。
3) 即使程序使用了上面所说的问题函数也不一定会出现溢出漏洞,漏洞发生的最后一个条件是程序员由于粗心,未检查用户输入数据的长度就将其直接复制到缓冲区中去。
虽然这看起来是一件小事,很容易杜绝。
可惜的是正因为有大量粗心的程序员的存在,使得溢出漏洞变得非常的普遍。
缓冲区溢出详解缓冲区溢出(Buffer Overflow)是计算机安全领域内既经典⽽⼜古⽼的话题。
随着计算机系统安全性的加强,传统的缓冲区溢出攻击⽅式可能变得不再奏效,相应的介绍缓冲区溢出原理的资料也变得“⼤众化”起来。
其中看雪的《0day安全:软件漏洞分析技术》⼀书将缓冲区溢出攻击的原理阐述得简洁明了。
本⽂参考该书对缓冲区溢出原理的讲解,并结合实际的代码实例进⾏验证。
不过即便如此,完成⼀个简单的溢出代码也需要解决很多书中⽆法涉及的问题,尤其是⾯对较新的具有安全特性的编译器——⽐如MS的Visual Studio2010。
接下来,我们结合具体代码,按照对缓冲区溢出原理的循序渐进地理解⽅式去挖掘缓冲区溢出背后的底层机制。
⼀、代码 <=> 数据顾名思义,缓冲区溢出的含义是为缓冲区提供了多于其存储容量的数据,就像往杯⼦⾥倒⼊了过量的⽔⼀样。
通常情况下,缓冲区溢出的数据只会破坏程序数据,造成意外终⽌。
但是如果有⼈精⼼构造溢出数据的内容,那么就有可能获得系统的控制权!如果说⽤户(也可能是⿊客)提供了⽔——缓冲区溢出攻击的数据,那么系统提供了溢出的容器——缓冲区。
缓冲区在系统中的表现形式是多样的,⾼级语⾔定义的变量、数组、结构体等在运⾏时可以说都是保存在缓冲区内的,因此所谓缓冲区可以更抽象地理解为⼀段可读写的内存区域,缓冲区攻击的最终⽬的就是希望系统能执⾏这块可读写内存中已经被蓄意设定好的恶意代码。
按照冯·诺依曼存储程序原理,程序代码是作为⼆进制数据存储在内存的,同样程序的数据也在内存中,因此直接从内存的⼆进制形式上是⽆法区分哪些是数据哪些是代码的,这也为缓冲区溢出攻击提供了可能。
图1 进程地址空间分布图1是进程地址空间分布的简单表⽰。
代码存储了⽤户程序的所有可执⾏代码,在程序正常执⾏的情况下,程序计数器(PC指针)只会在代码段和操作系统地址空间(内核态)内寻址。
数据段内存储了⽤户程序的全局变量,⽂字池等。
简述缓冲区溢出攻击的原理以及防范方法
一、缓冲区溢出攻击原理
缓冲区溢出攻击(Buffer Overflow Attack)是一种非法异常的程序运行行为,它发生的目的是让受害者的程序运行出现崩溃,从而获得机器控制权限,可以获取机器中存有的敏感资料,并进行恶意操作,如发送垃圾邮件,拒绝服务攻击(DoS attack),远程控制等行为破坏网络安全。
缓冲区溢出攻击的基本原理,就是恶意程序使用某种方法,将程序缓冲区中存放的数据或者信息溢出,超出缓冲区的容量,而这种溢出的数据又存放了受害者程序控制机器的恶意命令,从而给受害者程序植入恶意代码,使恶意程序获得了机器的控制权限,进而达到攻击系统的目的。
二、防范方法
1、使用受检程序,受检程序是一种编译技术,通过对程序源代码进行类型检查、安全检查等操作,来把漏洞修复好,从而起到防止缓冲区溢出攻击的作用。
2、使用数据流分析技术,它是一种动态分析技术,可以识别出恶意代码并阻止其危害,对程序运行的漏洞进行检查,从而防止攻击者利用缓冲区溢出攻击系统。
3、实行严格的安全审计制度,对程序源码、程序诊断、数据加密技术等进行严格的审计,确保程序运行的安全性,以及防止攻击者利用缓冲区溢出攻击系统。
4、采用虚拟化技术,虚拟化技术可以在不同的安全层次上对程序进行控制,对程序运行的过程进行审查,从而防止攻击者使用缓冲区溢出攻击系统。
5、对网络环境进行安全审计,包括电脑中存在的安全漏洞,系统的安全配置,网络设备的稳定性以及系统的社会工程学攻击等,从而确保网络环境能够不被缓冲区溢出攻击所侵袭。
缓存溢出BufferOverflow缓存溢出(Buffer overflow),是指在存在缓存溢出安全漏洞的计算机中,攻击者可以⽤超出常规长度的字符数来填满⼀个域,通常是内存区地址。
在某些情况下,这些过量的字符能够作为“可执⾏”代码来运⾏。
从⽽使得攻击者可以不受安全措施的约束来控制被攻击的计算机。
缓存溢出(或译为缓冲溢出)为最为常⽤的攻击⼿段之⼀,蠕⾍病毒对操作系统的溢出⾼速与⼤规模传播均是利⽤此技术。
缓存从理论上来讲可以⽤于攻击任何有缺陷不完美的程序,包括对、等安全产品的攻击以及对银⾏程序的攻击。
下⾯让我们了解⼀下缓存溢出的原理。
众说周知,c语⾔不进⾏的边界检查,在许多运⽤c语⾔实现的应⽤程序中,都假定缓冲区的⼤⼩是⾜够的,其容量肯定⼤于要拷贝的字符串的长度。
然⽽事实并不总是这样,当程序出错或者恶意的⽤户故意送⼊⼀过长的字符串时,便有许多意想不到的事情发⽣,超过的那部分字符将会覆盖与相邻的其他的空间,使变量出现不可预料的值。
如果碰巧,与的返回地址邻近时,便有可能由于超出的⼀部分字符串覆盖了⼦程序的返回地址,⽽使得⼦程序执⾏完毕返回时转向了另⼀个⽆法预料的地址,使程序的执⾏流程发⽣了错误。
甚⾄,由于应⽤程序访问了不在进程范围的地址,⽽使进程发⽣违例的故障。
这种错误其实是编程中常犯的。
组成部分⼀个利⽤⽽企图破坏或⾮法进⼊系统的程序通常由如下⼏个部分组成:1.准备⼀段可以调出⼀个shell的形成的字符串,在下⾯我们将它称为shellcode。
2.申请⼀个缓冲区,并将填⼊缓冲区的低端。
3.估算在中可能的起始位置,并将这个位置写⼊缓冲区的⾼端。
这个起始的位置也是我们执⾏这⼀程序时需要反复调⽤的⼀个参数。
4.将这个缓冲区作为系统⼀个有缓冲区溢出错误程序的⼊⼝参数,并执⾏这个有错误的程序。
通过以上的分析和实例,我们可以看到缓存溢出对系统的安全带来的巨⼤威胁。
在unix系统中,使⽤⼀类精⼼编写的程序,利⽤suid程序中存在的这种错误可以很轻易地取得系统的的权限。
缓冲区溢出-原理和简单利用-概述说明以及解释1.引言概述部分是文章的开篇,旨在引入读者对于缓冲区溢出问题的背景和概念。
下面是概述部分的内容:1.1 概述在计算机科学和网络安全领域中,缓冲区溢出(Buffer Overflow)是一种常见的安全漏洞,它可能导致系统崩溃、数据泄露、远程命令执行等严重后果。
本文将介绍缓冲区溢出的原理和简单利用方法。
缓冲区溢出指的是当向一个缓冲区写入数据时,超出了该缓冲区所能容纳的大小,导致溢出的数据覆盖到相邻的内存区域。
这种溢出可能会覆盖控制流程信息,改变程序执行路径,从而使攻击者能够执行恶意代码。
缓冲区溢出是一种经典的安全漏洞,其发现最早可以追溯到20世纪70年代。
尽管多年来在软件和系统的开发过程中进行了一系列的改进和加固,但仍然存在很多软件和系统容易受到缓冲区溢出攻击的漏洞存在。
正因如此,了解缓冲区溢出的原理和简单利用方法对于计算机科学和网络安全从业人员来说是至关重要的。
本文的主要目的是帮助读者理解缓冲区溢出的原理,并介绍常见的利用方法。
在深入研究和了解缓冲区溢出的背景之后,读者将能够更好地理解和应对这种常见的安全威胁。
接下来的章节将分别介绍缓冲区溢出的原理,并提供一些简单的利用方法作为案例。
最后,我们将总结本文的内容,并进一步讨论缓冲区溢出的意义和应对措施。
通过阅读本文,我们希望读者能够加深对于缓冲区溢出问题的理解,提高对于软件和系统安全的意识,并能够采取相应的措施来预防和应对这种安全漏洞。
让我们一起深入探索缓冲区溢出的原理和简单利用方法吧!文章结构是指文章整体组织的安排和框架。
一个良好的文章结构可以帮助读者更好地理解和吸收文章内容。
本文主要讨论缓冲区溢出的原理和简单利用方法,因此文章结构如下:1. 引言1.1 概述引入缓冲区溢出的基本概念和定义,解释缓冲区溢出在计算机领域的重要性和普遍存在的问题。
1.2 文章结构介绍本文的文章结构以及各个部分的内容安排,方便读者了解整个文章的组织。
缓冲区溢出攻击原理及防范作者姓名:XXX 班级:计算机网络XXX学号:2200951XXX 指导教师:XXX教授摘要缓冲区简单来说是一块连续的计算机内存区域,可以保存相同数据类型的多个实例, 缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量溢出的数据覆盖在合法数据上,理想的情况是程序检查数据长度并不允许输入超过缓冲区长度的字符,但是绝大多数程序都会假设数据长度总是与所分配的储存空间相匹配,这就为缓冲区溢出埋下隐患.操作系统所使用的缓冲区又被称为"堆栈". 在各个操作进程之间,指令会被临时储存在"堆栈"当中,"堆栈"也会出现缓冲区溢出。
缓冲区溢出是最常见的安全漏洞,针对缓冲区溢出的漏洞进行攻击,是很常见的攻击手段,可以使本地用户获得超级用户权限,也可以使外部攻击者通过网络直接进入系统。
本文详细分析了缓冲区溢出的基本原理,描述了利用缓冲区溢出漏洞进行攻击的基本方式,并通过对一段实例程序的溢出和构建攻击语句直观的演示了缓冲区溢出的形成过程及其攻击原理,最后提出了防范缓冲区溢出的有效措施。
关键词:缓冲区溢出堆栈漏洞AbstractSimply ,buffer is a continuous computer memory area, can keep the same data types of multiple instances, buffer overflow is when computer to the buffer filled with data f igures within the capacity of the buffer itself more than the data covered in legal spill data, the ideal situation is not allowed to check the data length program more than the length of the input buffer characters, but most of the program will be always with the assumption that data length distribution of storage space match, this is the buffer overf low buried hidden trouble. Operating system used by buffer is known as the "stack". I n between each operation process, the instructions will be temporarily stored in the "st ack" of "stack" also can appear buffer overflow. Buffer overrun is the most common s ecurity flaws in the buffer overflow vulnerability to attack, it is very common attack method, can make local users get super user permissions, also can make the external a ttackers through the network directly into the system.This paper analyzes the basic principle of buffer overflow, describes the use of buf fer overrun vulnerabilities to attack the basic way of, and through the example of a pr ogram and the construction of overflow attack statement intuitive demonstrates buffer overflow the forming process and the principle of attack, finally puts forward the cou ntermeasures of buffer overflow effective measures.Keywords:buffer overflow Stack shellcod目录摘要 (1)Abstract (2)绪论 (1)第一章缓冲区溢出基本原理 (2)1.1 栈缓冲区溢出 (2)1.2 HEAP/BSS缓冲区溢出 (4)1.2.1重要性 (4)1.2.2相关概念介绍 (4)1.2.3Heap/BSS溢出攻击 (5)第二章缓冲区溢出攻击 (8)2.1 shellcode基础 (9)2.2 可注入shellcode的编写 (11)2.3 远程缓冲区溢出威胁 (15)第三章缓冲区溢出攻击防御 (17)3.1 给有漏洞的程序打补丁 (17)3.2 编写安全的代码 (17)3.3 静态分析 (17)3.4 动态测试 (17)3.5软件开发过程中的防范策略 (18)3.6 缓冲区溢出攻击的抵御 (23)第四章缓冲区溢出攻击与防御实例设计 (25)4.1 缓冲区溢出攻击实例 (25)总结与展望 (27)致谢 (28)参考文献 (29)绪论随着计算机技术、现代通信技术和网络技术的发展,尤其是Internet的广泛使用,计算机网络与人们的工作和生活的联系越来越密切、越来越深入,同时也使网络系统的安全问题日益复杂和突出。
缓冲区溢出攻击原理一、缓冲区溢出攻击原理缓冲区溢出是一种非常普遍、非常危险的漏洞,在各种操作系统、应用软件中广泛存在。
利用缓冲区溢出攻击,可以导致程序运行失败、系统当机、重新启动等后果。
更为严重的是,可以利用它执行非授权指令,甚至可以取得系统特权,进而进行各种非法操作。
缓冲区溢出是一种系统攻击的手段,通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。
据统计,通过缓冲区溢出进行的攻击占所有系统攻击总数的80%以上。
知道了这个数据我非常震惊,以前进行的活动大都是找各方面的黑客软件然后学习这个软件怎么用,但是众所周知,攻击型的黑客软件都是各大杀毒软件的活靶子,基本上几天就不能用了,所以学习了这些软件的原理,我也能写几行代码,不再依赖黑客软件,就算汇编语言难掌握,也可以保存好常用的代码,其使用方法是比较简单的,下面是我学习的过程,由于没有经验,肯定有不少疏漏,也肯定不少地方绕了弯路,但自己学的过程中也获得了更多乐趣和收货时的喜悦,下面是具体介绍。
我用的是windows xp sp3编程软件是vc6.0。
还用到了olldbg2.0。
都是很常用的工具。
先介绍一下缓冲区溢出攻击的基础知识储备,进程内存空间是我最先接触的,现在看来也是最必要的基础,windows系统核心内存区间0xFFFFFFFF~0x80000000 (4G~2G)为Win32操作系统保留用户内存区间0x00000000~0x80000000 (2G~0G)堆: 动态分配变量(malloc), 向高地址增长进程使用的内存可以按照功能大致分成以下4 个部分。
(1)代码区:这个区域存储着被装入执行的二进制机器代码,处理器会到这个区域取指并执行。
(2)数据区:用于存储全局变量等。
(3)堆区:进程可以在堆区动态地请求一定大小的内存,并在用完之后归还给堆区。
动态分配和回收是堆区的特点。
缓冲区溢出攻击技术系统介绍缓冲区溢出攻击通常发生在程序运行时,当数据输入到缓冲区时,如果数据长度超过了缓冲区的预留空间,多余的数据就会溢出到相邻的内存区域,攻击者可以利用这个溢出现象,修改内存中的关键数据、执行恶意代码,乃至完全控制目标系统。
1. 栈溢出攻击(Stack Overflow):栈是程序执行期间用于存放数据的一块内存区域,栈溢出攻击就是在函数调用过程中,将超出栈空间的数据写入栈区,覆盖返回地址,使程序执行返回到攻击者指定的地方,执行恶意代码。
2. 堆溢出攻击(Heap Overflow):堆是用于存储动态分配内存的一块区域,堆溢出攻击是指当动态分配的堆内存未被正确管理时,攻击者通过向堆写入超长数据,改变堆内存中的关键数据,导致程序发生错误或执行恶意代码。
3.缓冲区溢出攻击变体:除了栈和堆溢出攻击,还有其他变体的缓冲区溢出攻击技术,比如格式化字符串漏洞、整数溢出、覆盖函数指针等。
这些攻击技术都利用了程序在处理输入数据时的错误处理或检查不严谨之处。
1.输入验证:对于用户输入数据,进行严格的检查和验证,限制数据长度,避免超长数据导致的溢出攻击。
2.代码审查:开发人员应定期审查代码,寻找可能存在的缓冲区溢出漏洞,并进行修补。
3.内存隔离:将关键数据与缓冲区隔离,限制缓冲区溢出攻击的影响范围。
4. 使用安全编程技术:使用安全编程语言,如Rust,或使用安全编程技术,如安全原型系统(SAFECode)等。
5.更新补丁:及时安装系统和应用程序的安全补丁,修复已知的缓冲区溢出漏洞。
总之,缓冲区溢出攻击是一种严重的计算机安全漏洞,可以导致系统被攻击者完全控制。
开发人员和系统管理员需要采取一系列措施来防止和修复这种漏洞,确保系统的安全性。
详解缓冲区溢出攻击以及防范⽅法缓冲区溢出是⼀种在各种操作系统、应⽤软件中⼴泛存在普遍且危险的漏洞,利⽤缓冲区溢出攻击可以导致程序运⾏失败、系统崩溃等后果。
更为严重的是,可以利⽤它执⾏⾮授权指令,甚⾄可以取得系统特权,进⽽进⾏各种⾮法操作。
第⼀个缓冲区溢出攻击--Morris蠕⾍,发⽣在⼗多年前,它曾造成了全世界6000多台⽹络服务器瘫痪。
⼀、缓冲区溢出的原理:当正常的使⽤者操作程序的时候,所进⾏的操作⼀般不会超出程序的运⾏范围;⽽⿊客却利⽤缓冲长度界限向程序中输⼊超出其常规长度的内容,造成缓冲区的溢出从⽽破坏程序的堆栈,使程序运⾏出现特殊的问题转⽽执⾏其它指令,以达到攻击的⽬的。
造成缓冲区溢出的原因是程序中没有仔细检查⽤户输⼊的参数,属于程序开发过程考虑不周到的结果。
当然,随便往缓冲区中填东西造成它溢出⼀般只会出现“分段错误”(Segmentation fault),⽽不能达到攻击的⽬的。
最常见的⼿段是通过制造缓冲区溢出使程序运⾏⼀个⽤户shell,再通过shell执⾏其它命令。
如果该程序属于root且有suid权限的话,攻击者就获得了⼀个有root权限的shell,可以对系统进⾏任意操作了。
缓冲区溢出攻击之所以成为⼀种常见安全攻击⼿段其原因在于缓冲区溢出漏洞普遍并且易于实现。
⽽且缓冲区溢出成为远程攻击的主要⼿段其原因在于缓冲区溢出漏洞给予了攻击者他所想要的⼀切:植⼊并且执⾏攻击代码。
被植⼊的攻击代码以⼀定的权限运⾏有缓冲区溢出漏洞的程序,从⽽得到被攻击主机的控制权。
在1998年Lincoln实验室⽤来评估⼊侵检测的的5种远程攻击中,有2种是缓冲区溢出。
⽽在1998年CERT的13份建议中,有9份是是与缓冲区溢出有关的,在1999年,⾄少有半数的建议是和缓冲区溢出有关的。
在Bugtraq的调查中,有2/3的被调查者认为缓冲区溢出漏洞是⼀个很严重的安全问题。
缓冲区溢出漏洞和攻击有很多种形式,会在第⼆节对他们进⾏描述和分类。
实验四缓冲区溢出攻击姓名:学号:班级:2班实验组别:同组实验者姓名:指导教师:章恒日期:成绩:【实验报告要求】1.简述缓冲区溢出攻击的基本原理。
2.利用RPC漏洞溢出入侵一台操作系统是Windows 2000 Server的计算机,写出基本步骤。
3.利用IIS溢出入侵一台操作系统是Windows 2000 Server的计算机,在该计算机上新增用户test,密码为123456,并将test用户添加到管理员组,写出基本步骤。
4.利用WebDav远程溢出入侵一台操作系统是Windows 2000 Server的计算机,在该计算机上新增用户hacker,密码为123456,并将hacker用户添加到管理员组,写出基本步骤。
5.写出上述三种入侵方法的总结报告。
实验步骤与调试过程:1.RPC漏洞出。
首先调用RPC(Remote Procedure Call)。
当系统启动的时候,自动加载RPC服务。
可以在服务列表中看到系统的RPC服务。
利用RPC漏洞建立超级用户。
首先,把scanms.exe文件拷贝到C盘跟目录下,检查地址段172.18.25.109到172.18.25.11。
点击开始>运行>在运行中输入cmd>确定。
进入DOs模式、在C盘根目录下输入scanms.exe 172.18.25.109-172.18.25.110,回车。
检查漏洞。
2.检查缓冲区溢出漏洞。
利用工具软件attack.exe对172.18.25.109进行攻击。
在进入DOC模式、在C盘根目录下输入acctack.exe 172.18.25.109,回车。
3.3,利用软件Snake IIS溢出工具可以让对方的IIS溢出。
进入IIS溢出工具软件的主界面.IP:172.18.25.109 PORT:80 监听端口为813 单击IDQ溢出。
出现攻击成功地提示对话框。
4.利用工具软件nc.exe连接到该端口。
进入DOs模式,在C盘根目录下输入nc.exe -vv 172.18.25.109 813 回车。
基于shellcode分析缓冲区溢出攻击缓冲区溢出攻击是指通过向程序输入过长的数据,从而导致程序缓冲区溢出,覆盖了程序的内存空间,进而破坏程序的执行流程,达到攻击者的恶意目的。
缓冲区溢出攻击是一种常见、危害巨大的安全漏洞,被广泛应用于各种攻击实验和黑客攻击现场。
当程序执行过程中遇到缓冲区溢出时,可能会发生几种情况:1、程序可以正常地结束,但是存在安全漏洞;2、程序会崩溃,因为缓冲区溢出导致了“未知原因”的错误;3、程序会被攻击者完全控制,攻击者可以篡改程序的内存,执行任意代码,甚至完全掌控被攻击机器。
因此,缓冲区溢出攻击是一种非常严重的安全威胁,需要引起重视。
Shellcode是一种可以被注入到程序中执行的二进制代码,通常用于攻击者构造缓冲区溢出攻击。
Shellcode通常是针对某特定平台的二进制代码,其目的就是让攻击者能够在受害机器上获取更高的系统权限,比如管理员权限。
下面我们来看一个简单的缓冲区溢出攻击实例:首先,我们有一个简单的C程序,名为vuln.c,其代码如下:```#include <stdio.h>void secret_function(){printf("Congratulations! You have executed the secret function!\n");}void vulnerable_function(){char buffer[200];printf("Enter some text:\n");scanf("%s", buffer);该程序定义了两个函数:vulnerable_function和secret_function。
其中,vulnerable_function存在缓冲区溢出漏洞,攻击者可以通过输入过长的字符串,覆盖程序栈上的返回地址,从而控制程序执行流程,使其跳转到secret_function函数中。
缓冲区溢出攻击的分析及防范策略【摘要】缓冲区溢出攻击是一种常见的攻击手段,通过利用程序中的缓冲区溢出漏洞,攻击者可以在程序内存中写入恶意代码并执行。
这种攻击方式具有很高的危害性,可能导致系统崩溃、信息泄露甚至远程控制。
本文对缓冲区溢出攻击的原理进行了分析,并介绍了常见的攻击方法。
还提出了防范缓冲区溢出攻击的措施,包括编程语言中的防范措施、操作系统和网络安全设备中的防范措施等。
结论部分强调了缓冲区溢出攻击的风险不可忽视,建议综合使用多种防范策略以及加强安全意识培训和定期安全漏洞检测来有效防范这种攻击手段。
通过本文的介绍,读者可以更加深入地了解缓冲区溢出攻击,并掌握防范措施。
【关键词】关键词:缓冲区溢出攻击、危害、常见攻击方法、防范策略、原理分析、编程语言、操作系统、网络安全设备、风险、多种防范策略、安全意识培训、安全漏洞检测。
1. 引言1.1 什么是缓冲区溢出攻击缓冲区溢出攻击是指攻击者利用软件缓冲区溢出的漏洞,将大量数据输入超出缓冲区尺寸的内容,从而覆盖程序正常的运行空间,改变程序的执行路径,插入恶意代码或者执行恶意操作。
缓冲区溢出攻击是一种常见的计算机安全威胁,由于许多程序在设计上没有考虑到缓冲区的大小和输入数据的合法性,导致了这一漏洞的存在。
攻击者可以通过缓冲区溢出攻击来实现对系统的控制、数据泄露、拒绝服务等恶意目的。
了解缓冲区溢出攻击的原理对于加强计算机系统的安全防范至关重要。
通过加强对软件漏洞的修补、限制程序对输入数据的处理等措施,可以有效防范缓冲区溢出攻击带来的安全风险。
1.2 缓冲区溢出攻击的危害缓冲区溢出攻击是一种常见的网络安全威胁,其危害十分严重。
当程序接收到超出其预留空间的数据输入时,缓冲区溢出就会发生。
攻击者可以利用这一漏洞来执行恶意代码,篡改数据或者拒绝服务。
具体来说,缓冲区溢出攻击可能导致以下几种危害:1. 执行任意代码:通过向程序输入超出缓冲区界限的数据,攻击者可以利用溢出的内存空间来执行恶意代码。
收稿日期:2012-06-18;修回日期:2012-08-05。
基金项目:中国博士后特别基金资助项目(201003757)。
作者简介:王柳滨(1989-),男,浙江武义人,硕士研究生,主要研究方向:信息安全、嵌入式安全;魏国珩(1977-),男,湖北武穴人,副教授,博士研究生,CCF 会员,主要研究方向:嵌入式系统、信息安全、密码学;李政(1990-),男,江苏盐城人,硕士研究生,主要研究方向:信息安全、密码学。
文章编号:1001-9081(2012)12-3449-04doi :10.3724/SP.J.1087.2012.03449嵌入式系统缓冲区溢出攻击防范技术王柳滨*,魏国珩,李政(海军工程大学信息安全系,武汉430033)(*通信作者电子邮箱bin31415926@126.com)摘要:针对嵌入式系统在缓冲区溢出攻击下的脆弱性问题,对开源嵌入式操作系统μC /OS-Ⅱ的内存管理机制进行分析,提出了一种基于块表的内存保护方案。
该方案将属于同一任务的内存块归纳到一个域内,并建立块表进行管理,实现了任务地址间的隔离;通过对内存块的访问进行越界检查和访问控制,有效地防范了针对嵌入式系统的缓冲区溢出攻击。
最后,对该方案进行了有效性分析并在Nios Ⅱ平台上进行了实验测试,结果表明所提方法可行。
关键词:嵌入式系统;缓冲区溢出攻击;地址隔离;访问控制;μC /OS-Ⅱ中图分类号:TP309文献标志码:AResearch of defense scheme against buffer overflow attack in embedded systemWANG Liu-bin *,WEI Guo-heng,LI Zheng(Department of Information Security,Naval University of Engineering,Wuhan Hubei 430033,China )Abstract:Embedded system is vulnerable to buffer overflow attack.In order to solve this problem,a block based protection scheme was proposed after analyzing the memory management of μC /OS-Ⅱ.By making a combination of all the memory blocks which belong to one task and managing it through the established block_table,the introduced scheme protected the safety through creating isolation between task memories,checking and controlling the access of memory blocks.Then,an effective analysis about this scheme was given.In addition,a buffer overflow attack experiment was operated on Nios Ⅱwith the improved uC /OS-Ⅱ,and the results show that the proposed scheme is feasible.Key words:embedded system;buffer overflow attack;address isolation;access control;μC /OS-Ⅱ0引言随着信息化的发展,嵌入式系统以其成本低、响应快、功耗低、专用性强等特点广泛地应用于工业控制、移动通信、军事国防等重要领域中。
缓冲区溢出攻击技术文伟平博士副教授weipingwen@北京大学软件与微电子学院信息安全系北京大学信科学院软件所信息安全实验室课程内容缓冲区溢出相关背景概念 缓冲区溢出原理溢出保护技术安全编程技术引子988o s蠕虫事件 1988MorrisCERT统计数据缓冲区¾从程序的角度,缓冲区就是应用程序用来保存用户输入数据程序临时数据的内存间输入数据、程序临时数据的内存空间¾缓冲区的本质z数组¾存储位置z Stackz Heapz数据段缓冲区溢出¾如果用户输入的数据长度超出了程序为其分配的内存空间,这些数据就会覆盖存间,这些数据就会覆程序为其它数据分配的内存空间,形成所谓的缓冲区溢出缓冲区溢出攻击的发展历史 1980s¾Morris蠕虫-fingerd缓冲区溢出攻击1996¾Aleph One,Smashing the Stack for Funand Profit,Phrack491998¾Dildog:提出利用栈指针的方法完成跳转¾The Tao of Windows Buffer Overflows1999¾Dark Spyrit:提出使用系统核心DLL中的JmpESP指令完成跳转,Phrack55¾M.Conover:基于堆的缓冲区溢出教程缓冲区溢出攻击背景知识与技巧 编译器调试器的使用编译器、调试器的使用¾Linux:gcc+gdb¾Win32:VC6.0+OllyDbgVC60+OllyDbg进程内存空间结构汇编语言基本知识栈的基本结构函数调用过程GCC编译器基础著名的的/编译器著名的GNU的Ansi c/c++编译器¾gcc[options][filenames]¾编译:gcc c test.c生成test.o-c test c test o¾连接:gcc-o test test.o¾同时搞定:gcc test.c o testtest c-omake:用于控制编译过程¾Makefile How ToGDB调试器的使用 断点相关指令/,//¾break/clear,disable/enable/delete¾watch–表达式值改变时,程序中断执行相关指令¾run/continue/next/step¾attach–调试已运行的进程¾finish/return信息查看相关指令reg/break/files/args/frame/functions/¾info reg/break/files/args/frame/functions/…¾backtrace–函数调用栈¾print/f exp–显示表达式的值/f dd¾x/nfu addr–显示指定内存地址的内容¾list–列出源码¾disass func–反汇编指定函数VC6.0命令行环境变量我的电脑属性高级环境变量¾我的电脑-属性-高级-环境变量¾PATH:z C:\Program Files\Microsoft Visual Studio\VC98\Bin;z C:\Program Files\Microsoft VisualStudio\Common\MSDev98\Bin;¾INCLUDE:z C:\Program Files\Microsoft VisualStudio\VC98\Include¾LIB:z C:\Program Files\Microsoft Visual Studio\VC98\Lib 命令行指令¾cl sourcefilename–编译并链接Win32平台调试器OllyDbg¾32-bit assembler level analysing debugger by Oleh Yuschuk¾Free¾支持插件机制z OllyUni:查找跳转指令功能z Uiltra String Referennce:查找字符串SofticeSyser DebuggerWinDbgP W32DASMIDA Pro,W32DASM简单溢出实例#include<stdio.h>int main(){char name[8]={0};printf(Your name:);printf(“Your name:”);gets(name);printf(Hello,%s!,name);printf(“Hello%s!”name);return0;}test0.c缓冲区溢出的危害应用程序异常系统不稳定甚至崩溃统稳定甚崩溃程序跳转到恶意代码,控制权被窃缓冲区溢出原理 预备知识¾理解程序内存空间¾理解堆栈¾理解函数调用过程¾理解缓冲区溢出的原理Windows环境下的堆栈程序空间由何构成程序空间由何构成?堆栈是什么?堆栈里面放的都是什么信息?堆栈面放的都是什么信息程序使用超过了堆栈默认的大小怎么办? 在一次函数调用中,堆栈是如何工作的?Win32进程内存空间系统核心内存区间¾0xFFFFFFFF~0x80000000(4G~2G)¾为Win32操作系统保留用户内存区间¾0x00000000~0x80000000(2G~0G)¾堆:动态分配变量(Malloc),向高地址增长¾静态内存区间:全局变量、静态变量¾代码区间:从0x00400000开始¾栈:向低地址增长z单线程进程:(栈底地址:0x0012FFXXXX)¾多线程进程拥有多个堆/栈程序在内存中的映像堆(Heap)……内存低地址(p)堆的增长方向堆栈段内存栈(stack)栈的增长方向数据段递增方初始化数据段非初始化数据段(BSS)文本(代码)段向系统DLL 代码段内存高地址0x800000000x 7FFFFFFF PEB&TEB 内核数据代码080000000栈栈是块连续的内存间栈是一块连续的内存空间¾先入后出¾生长方向与内存的生长方向正好相反,从高地址向低地址生长每一个线程有自己的栈¾提供一个暂时存放数据的区域使用POP/PUSH指令来对栈进行操作 使用ESP寄存器指向栈顶,EBP指向栈帧底栈内容函数的参数函数返回地址的值EBP的值些通用寄存器(EDI,ESI)的值一些通用寄存器(EDI,ESI…)的值 当前正在执行的函数的局部变量三个重要的寄存器()SP(ESP)¾即栈顶指针,随着数据入栈出栈而发生变化BP(EBP)¾即基地址指针,用于标识栈中一个相对稳定的位置。
通过BP,可以方便地引用函数参数以及局部变量IP(EIP)¾即指令寄存器,在将某个函数的栈帧压入栈中时,其中就包含当前的IP值,即函数调用返回后下一个执行语句的地址函数调用过程把参数压入栈保存指令寄存器中的内容,作为返回地址放入堆栈当前的基址寄存器放堆栈当前的基址寄存把当前的栈指针(ESP)拷贝到基址寄存器,作为新的基地址为本地变量留出一定空间,把ESP减去适为本地变量留出定空间把ESP减去适当的数值函数调用中栈的工作过程 调用函数前¾压入栈级函数传给函数的参数z上级函数传给A函数的参数z返回地址(EIP)z当前的EBPz函数的局部变量调用函数后¾恢复EBP¾恢复EIP¾局部变量不作处理例子-(逆向工程演示)#include <stdio.h> #define PASSWORD "1234567"main(){ int valid_flag=0; char password[1024];1234567int verify_password (char *password)char password[1024];while(1){printf("please input password:");{int authenticated; char buffer[8]; printf(please input password: ); scanf("%s",password);valid_flag =verify_password(password); if(lid fl)// add local buff to be overflowed if(valid_flag){ printf("incorrect password!\n\n"); } elseauthenticated=strcmp(passwo rd,PASSWORD);strcpy(buffer,password);{printf("Congratulation! You have passed the verification!\n");strcpy(buffer,password); //over flowed here!return authenticated;break; } }}} test1.c例子二int main()int main(){AFunc(5,6);return 0;}int AFunc(int i,int j) {int BFunc(int i,int j) {int m = 3; int n = 4; m=i;int m=1; int n=2;m = i;n = j; BFunc(m,n);m=i; n=j;(,); return 8;}return m; }test2.cpp函数调用中栈的工作过程EDI AFunc(5,6);push 6push 5ESI EBXcall _AFunc add esp+8当前EBP AFunc48h3(m=3)4(n=4)当前ESP5EIP(Next)_AFunc push ebp mov ebp,esp EBP 6语句执行前的ESPsub esp,48h //压入环境变量语句执行前的EBP//为局部变量分配空间栈中数据分配EDI ESI S EBX48h4(n=4)EIP(Next)EBP 3(m=3)65函数调用中栈的工作过程当前ESP AFunc(56)EDI前AFunc(5,6);……call AFunc ESI EBXcall _AFunc add esp+8AFunc当前EBP_AFunc {……return 0;}pop edi 48h3(m=3)4(n=4)5EIP pop edi pop esi pop ebx EBP 6语句执行前的ESPp padd esp,48h //栈校验b 语句执行前的EBPpop ebp ret当缓冲区溢出发生时……int AFunc(int i,int j){int m = 3;int n=4;int n 4;char szBuf[8] = {0};strcpy(szBuf, This is a overflow buffer!);strcpy(szBuf,“This is a overflow buffer!”);m = i;n = j;j;BFunc(m,n);return 8;}Linux系统下的栈溢出攻击 栈溢出攻击¾NSR模式¾NRS模式¾RS模式ShellcodeNSR溢出模式…RETRET …NOP shellcodeNOPNOP…RETLow Address HighAddress vulnerable1.c:stackexploit1.c:RNS溢出模式RET shellcode RET …RET …NOP NOP …NOP Low Address High AddressRS 溢出模式-利用环境变量shellcode Low AddressFILE NULL …High Address vulnerable2c:stackexploit3c:0xc0000000RET RET …RET vulnerable2.c:stackexploit3.c:栈溢出模式分析挑战¾溢出点(在哪改写返回地址?)¾Shellcode地址(将返回地址改写成什么?)NSR模式¾最经典的方法–Alpha One¾需要漏洞程序有足够大的缓冲区RNS模式¾能够适合小缓冲区情况,更容易计算返回地址RS模式¾最新的方法:(filename[]execve(filename,argv[],envp[]);¾Ret=0xc0000000–4–strlen(FILENAME)–strlen(shellcode),不需要任何NOP¾但对远程缓冲区溢出攻击不适用Shellcode C版本Shellcode 汇编版本shellcode_asm.c shellcode_asm_fix.c 去除’\0’Shellcode Opcode版本 31d2xor%edx,%edx52push%edx686e2f7368push$0x68732f6e682f2f6269push$0x69622f2f89e3mov%esp,%ebx52push%edx53push%ebxp,89e1mov%esp,%ecx8d420b lea0xb(%edx),%eaxcd80int$0x80远程登录的Shellcode缓冲区溢出攻击发生的直接原因没有内嵌支持的界保护没有内嵌支持的边界保护¾User funcs¾Ansi C/C++:strcat(),strcpy(),sprintf(),vsprintf(),bcopy(),gets(),scanf()…程序员安全编程技巧和意识可执行的栈(堆)¾给出Shell或执行任意的代码缓冲区溢出原理及其利用 缓冲区溢出种类¾栈溢出¾堆溢出¾整型溢出¾格式化字符串溢出¾其他溢出栈溢出特点¾缓冲区在栈中分配¾拷贝的数据过长¾覆盖了函数的返回地址或其它一些重要数据结构、函数指针栈溢出实例int AFunc(int i,int j)用BFunc的地址替换正常的AFunc返回地址,使程{int m = 3;int n =4;的返回地,使程序运行至BFunc int n 4;char szBuf[8] = {0}; *(int *)((int)szBuf+20)=BFunc;(int )((int)szBuf 20) BFunc;m = i;n = j;j;BFunc(m,n);return 8;}堆溢出(Heap Overflow)内存中的一些数据区¾.text包含进程的代码¾.data包含已经初始化的数据(全局的,或者static的、并且已经初始化的数据)¾.bss包含未经初始化的数据(全局的,或者static的、并且未经初始化的数据)¾heap运行时刻动态分配的数据区还有一些其他的数据区¾还有些其他的数据区在.data、.bss和heap中溢出的情形,都称为heap overflow:p,这些数据区的特点是数据的增长由低地址向高地址堆溢出堆和栈有何区别#define BUFLEN32¾内存的动态分配与静态分配int main(int argc,char*argv[]) {堆溢出特点¾char*buf1;buf1=(char*)malloc(BUFLEN); strcpy(buf1,argv[1]);缓冲区在堆中分配¾拷贝的数据过长¾覆盖了堆管理结构printf("%s\n",buf1); free(buf1);return0;}test3.c整型溢出宽度溢出()宽度溢出(Widthness Overflow)¾尝试存储一个超过变量表示范围的大数到变量中 运算溢出(Arithmetic Overflow)¾如果存储值是一个运算操作,稍后使用这个结果的程序的任何一部分都将错误的运行,因为这个计算程序的任何部分都将错误的运行因为这个计算结果是不正确的。