缓冲区溢出

缓冲区溢出攻击

只愿长相守 提交于 2019-11-27 16:39:08
转自 http://www.cnblogs.com/fanzhidongyzby/archive/2013/08/10/3250405.html 缓冲区溢出( Buffer Overflow )是计算机安全领域内既经典而又古老的话题。随着计算机系统安全性的加强,传统的缓冲区溢出攻击方式可能变得不再奏效,相应的介绍缓冲区溢出原理的资料也变得“大众化”起来。其中看雪的《 0day 安全:软件漏洞分析技术》一书将缓冲区溢出攻击的原理阐述得简洁明了。本文参考该书对缓冲区溢出原理的讲解,并结合实际的代码实例进行验证。不过即便如此,完成一个简单的溢出代码也需要解决很多书中无法涉及的问题,尤其是面对较新的具有安全特性的编译器——比如 MS 的 Visual Studio2010 。接下来,我们结合具体代码,按照对缓冲区溢出原理的循序渐进地理解方式去挖掘缓冲区溢出背后的底层机制。 一、代码 <=> 数据 顾 名思义,缓冲区溢出的含义是为缓冲区提供了多于其存储容量的数据,就像往杯子里倒入了过量的水一样。通常情况下,缓冲区溢出的数据只会破坏程序数据,造成 意外终止。但是如果有人精心构造溢出数据的内容,那么就有可能获得系统的控制权!如果说用户(也可能是黑客)提供了水——缓冲区溢出攻击的数据,那么系统 提供了溢出的容器——缓冲区。 缓冲区在系统中的表现形式是多样的,高级语言定义的变量、数组

缓冲区溢出以及缓冲区溢出攻击

拜拜、爱过 提交于 2019-11-27 16:38:51
缓冲区溢出是指当计算机程序向缓冲区内填充的数据位数超过了缓冲区本身的容量。溢出的数据覆盖在合法数据上。理想情况是,程序检查数据长度并且不允许输入超过缓冲区长度的字符串。但是绝大多数程序都会假设数据长度总是与所分配的存储空间相匹配,这就为缓冲区溢出埋下隐患。 操作系统所使用的缓冲区又被称为堆栈,在各个操作进程之间,指令被临时存储在堆栈当中,堆栈也会出现缓冲区溢出。 当一个超长的数据进入到缓冲区时,超出部分就会被写入其他缓冲区,其他缓冲区存放的可能是数据、下一条指令的指针,或者是其他程序的输出内容,这些内容都被覆盖或者破坏掉。可见一小部分数据或者一套指令的溢出就可能导致一个程序或者操作系统崩溃。 #include <stdio.h> #include <string.h> #include <iostream> using namespace std; int main(int argc, char *argv[]) { char buf[10]; strcpy(buf, argv[1]); cout<<buf; return 0; } 连续输入20个字符就产生了溢出。 C语言常用的strcpy、sprintf、strcat 等函数都非常容易导致缓冲区溢出问题。 程序运行时,其内存里面一般都包含这些部分: (1)程序参数和程序环境; (2) 程序堆栈( 堆栈则比较特殊

缓冲区溢出攻击

耗尽温柔 提交于 2019-11-27 16:38:29
缓冲区溢出是目前最常见的一种安全问题,操作系统以及应用程序大都存在缓冲区溢出漏洞。缓冲区是一段连续内存空间,具有固定的长度。缓冲区溢出是由编程错误引起的,当程序向缓冲区内写入的数据超过了缓冲区的容量,就发生了缓冲区溢出,缓冲区之外的内存单元被程序“非法”修改。 一般情况下,缓冲区溢出导致应用程序的错误或者运行中止,但是,攻击者利用程序中的漏洞,精心设计出一段入侵程序代码,覆盖缓冲区之外的内存单元,这些程序代码就可以被CPU所执行,从而获取系统的控制权。 8.1 缓冲区溢出攻击原理 1. 局部变量与堆栈的关系 在一个程序中,会声明各种变量。静态全局变量是位于数据段并且在程序开始运行的时候被初始化,而局部变量则在堆栈中分配,只在该函数内部有效。 如果局部变量使用不当,会造成缓冲区溢出漏洞。例如,以下程序将命令行的第1个参数拷贝到buf局部变量中。 int main(int argc, char **argv) { char buf[80]; strcpy(buf, argv[1]); } 在一次函数调用中,堆栈中将被依次压入:参数、返回地址。如果函数有局部变量,接下来,就在堆栈中开辟相应的空间(SUB ESP,x)以构造变量。函数执行结束时,恢复堆栈到函数调用的地址,弹出返回地址到EIP以继续执行程序。 例如,调用函数main(int argc, char **argv)时

缓冲区溢出攻击

。_饼干妹妹 提交于 2019-11-27 16:38:02
缓冲区溢出攻击 缓冲区溢出( Buffer Overflow )是计算机安全领域内既经典而又古老的话题。随着计算机系统安全性的加强,传统的缓冲区溢出攻击方式可能变得不再奏效,相应的介绍缓冲区溢出原理的资料也变得“大众化”起来。其中看雪的《 0day 安全:软件漏洞分析技术》一书将缓冲区溢出攻击的原理阐述得简洁明了。本文参考该书对缓冲区溢出原理的讲解,并结合实际的代码实例进行验证。不过即便如此,完成一个简单的溢出代码也需要解决很多书中无法涉及的问题,尤其是面对较新的具有安全特性的编译器——比如 MS 的 Visual Studio2010 。接下来,我们结合具体代码,按照对缓冲区溢出原理的循序渐进地理解方式去挖掘缓冲区溢出背后的底层机制。 一、代码 <=> 数据 顾名思义,缓冲区溢出的含义是为缓冲区提供了多于其存储容量的数据,就像往杯子里倒入了过量的水一样。通常情况下,缓冲区溢出的数据只会破坏程序数据,造成意外终止。但是如果有人精心构造溢出数据的内容,那么就有可能获得系统的控制权!如果说用户(也可能是黑客)提供了水——缓冲区溢出攻击的数据,那么系统提供了溢出的容器——缓冲区。 缓冲区在系统中的表现形式是多样的,高级语言定义的变量、数组、结构体等在运行时可以说都是保存在缓冲区内的,因此所谓缓冲区可以更抽象地理解为一段可读写的内存区域

函数调用栈与缓冲区溢出

一个人想着一个人 提交于 2019-11-27 10:38:08
目录 进程空间分配 函数调用和返回地址 缓冲区溢出攻击 @ 进程空间分配 每一个进程都有自己的一个进程堆栈空间。在Linux界面执行一个执行码时,Shell进程会fork一个子进程,再调用exec系统调用在子进程中执行该执行码。exec系统调用执行新程序时会把命令行参数和环境变量表传递给main函数,它们在整个进程堆栈空间中的位置如下图所示。 注意:stack区是高地址->低地址,heap区相反。 heap区:程序执行时,按照程序需要动态分配的内存空间。malloc、calloc、realloc。如正在处理的数据,编辑的文档。 stack区:存放程序执行时局部变量、函数调用信息、中断现场保留信息。进程中的不同线程可以共享代码段和数据段,但是都有自己的stack。CPU堆栈段指针会在栈顶根据执行情况进行上下移动。 bss段:未初始化数据段,如未初始化的全局变量、全局静态变量、局部静态变量,程序执行前操作系统将此段初始化为0。 data区:已初始化的全局变量、全局静态变量、局部静态变量 code区:可执行文件和库 一个经典的例子 int a = 0; //全局初始化区 int a = 0; //全局初始化区 char *p1; //全局未初始化区 main() { int b; //栈 char s[] = "abc"; //栈 char *p2; //栈 char *p3 =

缓冲区溢出攻击

女生的网名这么多〃 提交于 2019-11-25 22:58:02
一、缓冲区溢出攻击的原理   程序运行时,其在内存中的存储可划分为四个区:代码区、数据区、栈区、堆区,除了代码区,其他三个区都是缓冲区。栈保存了当前正在执行的函数的相关信息: 其中,返回地址是调用程序指令保存在内存中的地址,计算机执行完当前函数以后,将根据返回地址找到下一个程序指令并执行。   栈存储内容时是从下往上填充的,所以函数传参时,如果传递的数据大于参数缓冲区所准备的空间,超出空间的部分数据会覆盖下一个可用的内存地址,即返回地址缓冲区。缓冲区溢出攻击就是通过设置攻击步骤,使得参数缓冲区溢出,并在返回地址缓冲区中填充恶意代码的特定地址,这可能是同一台服务器上的其他内存地址或者保存在远程服务器上的程序指令,这样计算机执行完当前函数以后,就会根据返回地址缓冲区中的恶意代码地址找到恶意代码并执行,攻击者目的即可达成。 二、缓冲区溢出的后果 1. 注入式攻击:允许黑客插入代码、SQL语句或者任何可以注入应用程序的数据。 2. 特定代码攻击:在这种攻击中,黑客可以获得服务器操作系统的直接和根用户级别的访问,这样他们可以完全控制服务器。 3. 拒绝访问攻击:可以导致服务器在执行恶意代码后陷入困境(通常是一个无限循环或其他没有意义的指令),这样服务器就没有资源去执行其他正常任务。 4. 远程探索:也就是你的服务器被作为中间转接点来攻击其他服务器。 三、PHP规避缓冲区溢出攻击的理论基础