缓冲区溢出攻击原理
「网络安全」常见攻击篇(10)缓冲区溢出攻击

「网络安全」常见攻击篇(10)——缓冲区溢出攻击什么是缓冲区溢出攻击?▪缓冲区程序用来保存用户输入数据、程序临时数据的内存空间,本质为数组。
▪缓冲区溢出攻击攻击者利用程序漏洞,将自己的攻击代码植入有缓冲区溢出漏洞的程序执行体中,改变该程序的执行过程,来获取目标系统的控制权。
▪缓冲区溢出攻击原理程序员通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。
造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。
缓冲区溢出的攻击方式▪栈溢出(stack smashing)未检查输入缓冲区长度,导致数组越界,覆盖栈中局部变量空间之上的栈桢指针%ebp以及函数返回地址retaddr, 当函数返回执行ret指令时,retaddr从栈中弹出,作为下一条指令的地址赋给%eip寄存器,继而改变原程序的执行流程指向我们的shellcode.▪堆溢出(malloc/free heapcorruption)一种是和传统的栈溢出一样, 当输入超出malloc()预先分配的空间大小,就会覆盖掉这段空间之后的一段存储区域,如果该存储区域有一个重要的变量比如euid,那么我就可以用它来攻击。
另一种是典型的double-free堆腐败,在内存回收操作中,合并相邻空闲块重新插入双向链表时会有一个写4字节内存的操作,如果弱点程序由于编程错误free()一个不存在的块,我们就可以精心伪造这个块,从而覆盖任何我们想要的值:函数的返回地址、库函数的.plt地址等▪格式化字符窜漏洞(format stringvulnerability)如果格式窜由用户定制,攻击者就可以任意伪造格式窜,利用*printf()系列函数的特性就可以窥探堆栈空间的内容,超常输入可以引发传统的缓冲区溢出,或是用”%n”覆盖指针、返回地址等。
▪整形变量溢出(integer variableoverflow)利用整数的范围、符号等问题触发安全漏洞,大多数整形溢出不能直接利用,但如果该整形变量决定内存分配等操作,我们就有可能间接利用该漏洞。
缓冲区溢出攻击与防范实验报告

缓冲区溢出攻击与防范实验报告——计算机网络(2)班——V200748045黄香娥1·缓冲区溢出的概念:缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量溢出的数据覆盖在合法数据上,理想的情况是程序检查数据长度并不允许输入超过缓冲区长度的字符,但是绝大多数程序都会假设数据长度总是与所分配的储存空间想匹配,这就为缓冲区溢出埋下隐患.操作系统所使用的缓冲区又被称为"堆栈". 在各个操作进程之间,指令会被临时储存在"堆栈"当中,"堆栈"也会出现缓冲区溢出。
2·缓冲区溢出的危害:在当前网络与分布式系统安全中,被广泛利用的50%以上都是缓冲区溢出,其中最著名的例子是1988年利用fingerd漏洞的蠕虫。
而缓冲区溢出中,最为危险的是堆栈溢出,因为入侵者可以利用堆栈溢出,在函数返回时改变返回程序的地址,让其跳转到任意地址,带来的危害一种是程序崩溃导致拒绝服务,另外一种就是跳转并且执行一段恶意代码,比如得到shell,然后为所欲为。
3·缓冲区溢出原理:由一个小程序来看://test.c#include "stdio.h"#include "stdlib.h"#include "string.h"void overflow(void){char buf[10];strcpy(buf,"0123456789123456789");}//end overflowint main(void){overflow();return 0;}//end main按F11进入"Step into"调试模式,如下:按F11跟踪进入overflow,让程序停在6,现在再看一下几个主要参数:esp=0x0012ff30,eip发生了变化,其它未变。
pwn控制的基本原理

pwn控制的基本原理pwn是一种常见的计算机攻击技术,它可以让攻击者完全控制受攻击系统。
本文将介绍pwn控制的基本原理,包括攻击的几个关键步骤和常见的攻击技术。
我们需要了解pwn的攻击流程。
一般来说,pwn攻击的流程可以分为三个阶段:信息收集、漏洞利用和权限提升。
在信息收集阶段,攻击者会寻找目标系统的漏洞信息,包括系统服务、软件版本等。
在漏洞利用阶段,攻击者会利用已知的漏洞,通过精心构造的攻击载荷(payload)来控制目标系统。
最后,在权限提升阶段,攻击者会尝试提升自己的权限,以便更深入地控制目标系统。
接下来,让我们来看看pwn攻击中常见的几种攻击技术。
首先是缓冲区溢出攻击(buffer overflow)。
缓冲区溢出是指攻击者通过向程序输入超出其预留内存空间的数据,使得程序发生错误,从而达到控制程序执行流程的目的。
攻击者可以通过覆盖函数返回地址,将程序的执行流程转移到自己精心构造的代码上,从而实现对目标系统的控制。
另一种常见的攻击技术是格式化字符串攻击(format string)。
格式化字符串攻击是指攻击者通过向格式化字符串函数传递恶意格式化字符串,来读取或修改程序的内存数据。
攻击者可以利用格式化字符串漏洞来泄露程序的敏感信息,如栈上的数据、函数地址等。
除了缓冲区溢出和格式化字符串攻击,堆溢出(heap overflow)和使用-after-free漏洞(use-after-free)也是常见的pwn攻击技术。
堆溢出是指攻击者通过向堆分配的内存块中写入超出其分配大小的数据,从而覆盖堆管理数据结构,进而控制程序的执行流程。
使用-after-free漏洞是指攻击者在程序释放了某个内存块后,继续使用该内存块,从而导致程序发生错误。
在进行pwn攻击时,攻击者还需要了解目标系统的硬件架构和操作系统的特性,以便选择合适的攻击载荷和技术。
例如,攻击32位系统和64位系统的方法是不同的,攻击Windows系统和Linux系统的方法也有所不同。
缓冲区溢出攻击原理与防范

缓冲区溢出攻击的原理与防范陈硕2004-7-12读者基础:熟悉C语言及其内存模型,了解x86汇编语言。
缓冲区溢出(buffer overflow)是安全的头号公敌,据报道,有50%以上的安全漏洞和缓冲区溢出有关。
C/C++语言对数组下标访问越界不做检查,是引起缓冲区溢出问题的根本原因。
本文以Linux on IA32(32-bit Intel Architecture,即常说的x86)为平台,介绍缓冲区溢出的原理与防范措施。
按照被攻击的缓冲区所处的位置,缓冲区溢出(buffer overflow)大致可分为两类:堆溢出1(heap overflow)和栈溢出2(stack overflow)。
栈溢出较为简单,我先以一些实例介绍栈溢出,然后谈一谈堆溢出的一般原理。
栈溢出原理我们知道,栈(stack)是一种基本的数据结构,具有后入先出(LIFO, Last-In-First-Out)的性质。
在x86平台上,调用函数时实际参数(arguments)、返回地址(return address)、局部变量(local variables)都位于栈上,栈是自高向低增长(先入栈的地址较高),栈指针(stack pointer)寄存器ESP始终指向栈顶元素。
以图表1中的简单程序为例,我们先将它编译为可执行文件,然后在gdb中反汇编并跟踪其运行:$ gcc stack.c –o stack -ggdb -mperferred-stack-boundary=2在IA32上,gcc默认按8个字节对齐,为了突出主题,我们令它按4字节对齐,最末一个参数的用处在此。
图表1在每条语句之后列出对应的汇编指令,注意这是AT&T格式汇编,mov %esp, %ebp 是将寄存器ESP的值赋给寄存器EBP(这与常用的Intel汇编格式正好相反)。
// stack.c#01 int add(int a, int b)#02 {// push %ebp// mov %esp,%ebp#03 int sum;// sub $0x4,%esp#04 sum = a + b;// mov 0xc(%ebp),%eax// add 0x8(%ebp),%eax// mov %eax,0xfffffffc(%ebp)#05 return sum;// mov 0xfffffffc(%ebp),%eax1本文把静态存储区溢出也算作一种堆溢出。
缓冲区溢出详解

缓冲区溢出详解缓冲区溢出(Buffer Overflow)是计算机安全领域内既经典⽽⼜古⽼的话题。
随着计算机系统安全性的加强,传统的缓冲区溢出攻击⽅式可能变得不再奏效,相应的介绍缓冲区溢出原理的资料也变得“⼤众化”起来。
其中看雪的《0day安全:软件漏洞分析技术》⼀书将缓冲区溢出攻击的原理阐述得简洁明了。
本⽂参考该书对缓冲区溢出原理的讲解,并结合实际的代码实例进⾏验证。
不过即便如此,完成⼀个简单的溢出代码也需要解决很多书中⽆法涉及的问题,尤其是⾯对较新的具有安全特性的编译器——⽐如MS的Visual Studio2010。
接下来,我们结合具体代码,按照对缓冲区溢出原理的循序渐进地理解⽅式去挖掘缓冲区溢出背后的底层机制。
⼀、代码 <=> 数据顾名思义,缓冲区溢出的含义是为缓冲区提供了多于其存储容量的数据,就像往杯⼦⾥倒⼊了过量的⽔⼀样。
通常情况下,缓冲区溢出的数据只会破坏程序数据,造成意外终⽌。
但是如果有⼈精⼼构造溢出数据的内容,那么就有可能获得系统的控制权!如果说⽤户(也可能是⿊客)提供了⽔——缓冲区溢出攻击的数据,那么系统提供了溢出的容器——缓冲区。
缓冲区在系统中的表现形式是多样的,⾼级语⾔定义的变量、数组、结构体等在运⾏时可以说都是保存在缓冲区内的,因此所谓缓冲区可以更抽象地理解为⼀段可读写的内存区域,缓冲区攻击的最终⽬的就是希望系统能执⾏这块可读写内存中已经被蓄意设定好的恶意代码。
按照冯·诺依曼存储程序原理,程序代码是作为⼆进制数据存储在内存的,同样程序的数据也在内存中,因此直接从内存的⼆进制形式上是⽆法区分哪些是数据哪些是代码的,这也为缓冲区溢出攻击提供了可能。
图1 进程地址空间分布图1是进程地址空间分布的简单表⽰。
代码存储了⽤户程序的所有可执⾏代码,在程序正常执⾏的情况下,程序计数器(PC指针)只会在代码段和操作系统地址空间(内核态)内寻址。
数据段内存储了⽤户程序的全局变量,⽂字池等。
网络攻防原理与技术课件最新版第10章缓冲区溢出攻击

缓冲区溢出的根源
溢出的根源在于编程:如果缓冲区被写满,而 程序没有去检查缓冲区边界,也没有停止接收 数据,这时缓冲区溢出就会发生。
1996年,Elias Levy发表文章“Smashing the stack for fun and profit”,显示了很多程序都存在缓冲区溢出的危险。 缓冲区溢出攻击被广泛关注。
1999年,Dark spyrit AKA Barnaby jack提出使用系统核 心dll中的“jmp esp”指令完成shellcode跳转的想法,开创 了Win32平台下缓冲区溢出的新思路,大量windows平台 下缓冲区溢出漏洞被利用。
if(argc>1) copy(argv[1]); }
堆栈溢出示例代码3
sp
buffer[0]
Memory growth
buffer[511]
fptr
fp
previous fp
Return address
argv[1]
attack code
Stack growth
Shell Code
改变程序流程后希望得到Shell
堆栈溢出示例代码2
sp
buffer[0]
Memory growth
buffer[511]
fp
previous fp
Return address
argv[1]
attack code
Stack growth
堆栈溢出示例代码3
缓存溢出BufferOverflow

缓存溢出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 文章结构介绍本文的文章结构以及各个部分的内容安排,方便读者了解整个文章的组织。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基 金 项 目:国家高技术研究发展计划项目(2001AA142100) ;教育部
博士点基金项目;航空科学基金项目
作 者 简 介 :蒋卫华(1973-),男,讲师、博士,主研方向:信息与
网络安全;李伟华,教授、博导;杜 君,硕士
收 稿 日 期 :2002-07-05
—5—
最后,从main返回,弹出ret 里的返回地址并赋值给 EIP,CPU继续执行EIP所指向的命令。
methods of buffer overflow from programming, detecting, data structure designing and program executing. At last, it presents some methods to prevent
this kind of attacks. 【 Key words】 Buffer overflow; Stack overflow; Hacker attack; Recovery; Buffer check; Buffer non-execution
内存低端 堆栈顶部
内存高端 堆栈底部
&name
Name
EBP
ret
图 2 程序运行之初堆栈的状态 执行完gets(name)之后,堆栈中的内容如见图3。
内存低端 堆栈顶部
内存高端 堆栈底部
hello world!\0
&name
Name
EBP
ret
图 3 运行完 gets(name)后堆栈的状态
图 1 程序在内存中的存储 从图1可以看出,输入的形参等数据存放在堆栈中,程 序是从内存低端向内存高端按顺序执行的,由于堆栈的生长 方向与内存的生长方向相反,因此在堆栈中压入的数据超过
—6—
sprinf和gets)。程序编写者的经验不足和粗心大意使得缓冲 区溢出漏洞几乎无处不在,导致程序健壮性不够,为缓冲区 溢出攻击留下了隐患。特别是由于Internet的迅速发展,各 种网络应用程序层出不穷,而其中一个个缓冲区溢出漏洞则 给整个系统带来了极大的安全隐患,为黑客攻击打开方便之 门。 1.4 缓冲区溢出漏洞的危害性
缓冲区溢出漏洞比其他一些黑客攻击手段更具有破坏力 和隐蔽性。这也是利用缓冲区溢出漏洞进行攻击日益普遍的 原因。它极容易使服务程序停止运行,服务器死机甚至删除 服务器上的数据。它的隐蔽性主要表现在下面几点:首先, 漏洞被发现之前一般程序员是不会意识到自己的程序存在漏 洞(漏洞的发现者往往并非编写程序的程序员),从而疏忽监 测;其次,shellcode都很短,执行时间也非常短,很难在执 行过程中被发现;第三,由于漏洞存在于防火墙内部,攻击 者所发送的字符串一般情况下防火墙不会阻拦,而攻击者通 过 执 行shellcode 所获得的是本来不被允许或没有权限的操 作,在防火墙看来也是合理合法的。防火墙在对远程缓冲区 溢出攻击的监测方面有先天的不足;第四,一个完整的 shellcode的执行并不一定会使系统报告错误,并可能不影响 正常程序的运行;第五,攻击的随机性和不可预测性使得防 御攻击变得异常艰难,而没有攻击时,攻击程序并不会有什 么变化(这和木马有着本质的区别),这也是堆栈溢出最难被 发现的原因;最后,缓冲区溢出漏洞的普遍存在,使得针对 这种漏洞的攻击防不胜防(各种补丁程序也可能存在着这种 漏洞)。
内存低端 堆栈顶部
内存高端 堆栈底部
NNNNN… ..SSSSS… .AAAAA… ..
A
A
&name
Name
EBP
ret
图 6 增 加 若 干NOP指 令 后 的 溢 出 字 符 串 而在溢出字符串最前面的若干NOP指令将成为识别这种 攻击的一大特征。 1.3 缓冲区溢出漏洞的产生原因 缓冲区溢出的根本原因在于C语言本身的一些特性。从 数据结构的角度来说,最根本的原因是由于char * (或char[]) 数据结构的存在,导致了一系列字符串存储以及操作上的问 题。而直接的原因则是“由于字符串处理函数(gets,strcpy 等 等)没有对数组的越界加以监视和限制”。C中大多数缓冲区 溢出问题可以追溯到标准函数库,直接的原因是不进行自变 量检查和使用一些有问题的字符串操作函数(strcpy、strcat、
在软件测试阶段,要专门对程序中的每个缓冲区作边界 检查和溢出检测。但是,由于程序编写者的经验不足和测试 工作不够全面、充分,目前还不可能完全避免缓冲区溢出漏 洞,因此这些漏洞在已经使用以及正在开发的软件中还是有 存在的可能,还需要在使用软件时,对它做实时的监测。 2.2 使用安全语言编写程序
应使用Java等安全的语言编写程序,因为Java在对缓冲 区进行操作时,有相应的边界检查,所以可以有效地防止缓 冲区溢出漏洞的产生。但是,Java也并非绝对安全,Java 的 解释器是用C语言编写的,而C并不是一种安全的语言,所 以Java解释器还是可能存在缓冲区溢出漏洞并受到攻击。 2.3 改进编译器
网络防范技术的日益成熟,使木马、病毒这类恶意代码 的植入变得困难。网络黑客开始针对系统和程序自身存在的 漏洞,编写相应的攻击程序。其中最常见的就是对缓冲区溢 出漏洞的攻击,而在诸多缓冲区溢出中又以堆栈溢出的问题 最有代表性。目前,利用缓冲区溢出漏洞进行的攻击已经占 到了整个网络攻击次数的一半以上。
世界上第一个缓冲区溢出攻击——Morris蠕虫,发生在 十几年前,曾造成了全球6000多台网络服务器瘫痪。事实 上,缓冲区溢出漏洞被攻击的现象目前已越来越普遍,各种 操作系统上出现的此种漏洞都数不胜数。例如,在BSD上存 在 打 印 守 护 进 程 远 程 缓 冲 区 溢 出 漏 洞 ; 在 Sun OS 上 的 Solaris whodo本地缓冲区溢出漏洞;世界上第一个Linux病 毒Reman,其实就是一个缓冲区溢出攻击程序;而Windows 下IIS4、IIS5某些版本在处理超长文件名时,存在缓冲区溢 出漏洞。
(gets,strcpy等)没有对数组的越界加以监视和限制,结果覆盖 了老的堆栈数据。
在计算机内的程序是按以下形式存储的,见图1。
预先给堆栈分配的容量时,就会出现堆栈溢出,从而使得程 序运行失败;如果发生栈溢出的是大型程序还有可能会导致 系统崩溃。
我们来看一段简单程序的执行过程中对堆栈的操作和溢 出的产生过程。
另外,还存在着攻击者故意散布存在漏洞的应用程序的 可能。攻击者还可以借用木马植入的方法,故意在被攻击者 的系统中留下存在漏洞的程序,这样做不会因为含有非法字 段而被防火墙拒绝;或者利用病毒传播的方式来传播有漏洞 的程序,和病毒不同的是,它在一个系统中只留下一份拷贝 (要发现这种情况几乎是不可能的)。
#include <stdio.h>
int main()
char name[16];
gets(name);
for(int i=0;i<16&&name[i];i++)
printf(,name[i]); } 编译上述代码,输入“hello world!”结果会输出hello world!,其中对堆栈的操作是先在栈底压入返回地址,接着 将栈指针EBP入栈,此时EBP等于现在的ESP,之后ESP 减 16,即向上增长16个字节,用来存放name[]数组,现在堆栈 的布局如图2。
改进编译器的主要思想是在编译器中增加边界检查以及 保护堆栈的功能,使得含有漏洞的程序和代码段无法通过编 译。针对gcc编译器的很多补丁就提供了这些功能,比如说 Stackguard 。 2.4 利用人工智能的方法检查输入字段
黑客利用缓冲区溢出漏洞进行攻击时,必须将其设计的 溢出字符串包含在输入字符串中。如果能检测到输入字段中 存在非法字段,就可以将黑客的攻击记录下来,以便防范。 上面所介绍的溢出字符串的设计,就可以利用其特征来建立 规则集, 使用模式匹配 、 人工智能的方法来监测缓冲区 (图7)。例如,可以检查字符流中是否存在大量的NOP字段 (特别是在字符串的头部),来确定是否有缓冲区溢出攻击存 在。又如:对于输入串只需要可显示字符时(例如留言簿、 URL等),可以将不可显示字符归入非法字符集;还可以针 对字符的排列顺序而规定相应的规则集等等。
2 防范及检测方法
各种原因产生了大量存在漏洞的程序,而且利用缓冲区 溢出攻击主机也时有发生。现在,怎样防范这种危害巨大的 攻击手段,已成为网络安全方面一个很重要的研究内容。 2.1 编写程序中应该时刻注意的问题
程序员有责任和义务养成安全编程的思想,应该熟悉那 些可能会产生漏洞或需慎用的函数,清楚那些在编程中要小 心使用的函数( 特别是在使用 C语言时) ,例如: ge 10期 Vol.29 № 10
计 算 机 工 程 Computer Engineering
2003年 6月 June 2003
· 博士论文·
文章编号:1000—3428(2003)10 —0005—03
文献标识码:A
中图分类号: TP393.08
缓冲区溢出攻击:原理,防御及检测
蒋卫华,李伟华,杜 君 (西北工业大学计算机科学与工程系,西安710072) 摘 要 :给出了缓冲区溢出的原理,分析了利用缓冲区溢出漏洞进行网络攻击的方法及其特征;从程序编写、程序检测、数据结构设计以及 程序执行控制等多个角度对防止缓冲区溢出攻击进行了分析,提出了遏制利用缓冲区溢出漏洞进行攻击的一些方法。 关 键 词 :缓冲区溢出;堆栈溢出;黑客攻击;防御;缓冲区检测;缓冲区不可执行
如果我们输入的字符串长度超过16个字节,例如输入: hello world!AAAAAAAAAAA , 则 当 执 行 完 gets(name) 之 后,堆栈的情况如图4。
内存低端 堆栈顶部
内存高端 堆栈底部
hello world! AAAAAAAAAAAAAAAAA AAAA AAAA A
&name
内存低端 堆栈顶部
内存高端 堆栈底部