设为首页 - 加入收藏
广告 1000x90
您的当前位置:144177黄大仙有求必应 > 静态缓冲区 > 正文

缓冲区溢出漏洞入门介绍

来源:未知 编辑:admin 时间:2019-05-21

  一、引言 不管你是否相信,几十年来,缓冲区溢出一直引起许多严重的安全性问题。甚至毫不夸张的说,当前网络种种安全问题至少有50%源自缓冲区溢出的问题。远的不说,一个冲击波病毒已经令人谈溢出色变了。而作为一名黑客,了解缓冲区溢出漏洞则是一门必修课。网上关于溢出的漏洞的文章有很多,但是大多太深或者集中在一个主题,不适合初学者做一般性了解。为此,我写了这篇文章,主要是针对初学者,对缓冲区溢出漏洞进行一般性的介绍。 缓冲区溢出漏洞是之所以这么多,是在于它的产生是如此的简单。只要C/C++程序员稍微放松警惕,他的代码里面可能就出现了一个缓冲区溢出漏洞,甚至即使经过仔细检查的代码,也会存在缓冲区溢出漏洞。

  二、溢出 听我说了这些废话,你一定很想知道究竟什么缓冲区溢出漏洞,溢出究竟是怎么发生的。好,现在我们来先弄清楚什么是溢出。以下的我将假设你对C语言编程有一点了解,一点点就够了,当然,越多越好。 尽管缓冲区溢出也会发生在非C/C++语言上,但考虑到各种语言的运用程度,我们可以在某种程度上说,缓冲区溢出是C/C++的专利。相信我,如果你在一个用VB写的程序里面找溢出漏洞,你将会很出名。回到说C/C++,在这两种使用非常广泛的语言里面,并没有边界来检查数组和指针的引用,这样做的目的是为了提高效率,而不幸的是,这也留下了严重的安全问题。先看下面一段简单的代码: #includestdio.h void main() { char buf[8]; gets(buf); } 程序运行的时候,如果你输入“Hello”,或者“Kitty”,那么一切正常,但是如果输入“Today is a good day”,那么我得通知你,程序发生溢出了。很显然,buf这个数组只申请到8个字节的内存空间,而输入的字符却超过了这个数目,于是,多余的字符将会占领程序中不属于自己的内存。因为C/C++语言并不检查边界,于是,程序将看似正常继续运行。如果被溢出部分占领的内存并不重要,或者是一块没有使用的内存,那么,程序将会继续看似正常的运行到结束。但是,如果溢出部分占领的正好的是存放了程序重要数据的内存,那么一切将会不堪设想。 实际上,缓冲区溢出通常有两种,堆溢出和堆栈溢出。尽管两者实质都是一样,但由于利用的方式不同,我将在下面分开介绍。不过在介绍之前,还是来做一些必要的知识预备。

  三、知识预备 要理解大多数缓冲区溢出的本质,首先需要理解当程序运行时机器中的内存是如何分配的。在许多系统上,每个进程都有其自己的虚拟地址空间,它们以某种方式映射到实际内存。我们不必关心描述用来将虚拟地址空间映射成基本体系结构的确切机制,而只关心理论上允许寻址大块连续内存的进程。 程序运行时,其内存里面一般都包含这些部分:

  ,它包含只读程序代码。BSS、数据和文本段组成静态内存:在程序运行之前这些段的大小已经固定。程序运行时虽然可以更改个别变量,但不能将数据分配到这些段中。下面以一个简单的例子来说明以上的看起来让人头晕的东西: #includestdio.h char buf[3]=abc; int i; void main() { i=1 return; } 其中,i属于BBS段,而buf属于数据段。两者都属于静态内存,因为他们在程序中虽然可以改变值,但是其分配的内存大小是固定的,如buf的数据大于三个字符,将会覆盖其他数据。 与静态内存形成对比,堆和堆栈是动态的,可以在程序运行的时候改变大小。堆的程序员接口因语言而异。在C语言中,堆是经由 malloc() 和其它相关函数来访问的,而C++中的new运算符则是堆的程序员接口。堆栈则比较特殊,主要是在调用函数时来保存现场,以便函数返回之后能继续运行。

  四、堆溢出 堆溢出的思路很简单,覆盖重要的变量以达到自己的目的。而在实际操作的时候,这显得比较困难,尤其是源代码不可见的时候。第一,你必须确定哪个变量是重要的变量;第二,你必须找到一个内存地址比目标变量低的溢出点;第三,在特定目的下,你还必须让在为了覆盖目标变量而在中途覆盖了其他变量之后,程序依然能运行下去。下面以一个源代码看见的程序来举例演示一次简单的堆溢出是如何发生的: #include malloc.h #include string.h #include stdio.h void main() { char *large_str = (char *)malloc(sizeof(char)*1024); char *important = (char *)malloc(sizeof(char)*6); char *str = (char *)malloc(sizeof(char)*4); strcpy(important,abcdef);//给important赋初值 //下面两行代码是为了看str和important的地址 printf(%d/n,str); printf(%d/n,important); gets(large_str);//输入一个字符串 strcpy(str, large_str);//代码本意是将输入的字符串拷贝到str printf(%s/n,important); } 在实际应用中,这样的代码当然是不存在的,这只是一个最简单的实验程序。现在我们的目标是important这个字符串变成hacker。str和important的地址在不同的环境中并不是一定的,我这里是7868032和7868080。很好,important的地址比str大,这就为溢出创造了可能。计算一下可以知道,两者中间隔了48个字节,因此在输入溢出字符串时候,可以先输入48个任意字符,然后再输入hakcer回车,哈哈,出来了,important成了hacker。 五、堆栈溢出 堆溢出的一个关键问题是很难找到所谓的重要变量,而堆栈溢出则不存在这个问题,因为它将覆盖一个非常重要的东西----函数的返回地址。在进行函数调用的时候,断点或者说返回地址将保存到堆栈里面,以便函数结束之后继续运行。而堆栈溢出的思路就是在函数里面找到一个溢出点,把堆栈里面的返回地址覆盖,替换成一个自己指定的地方,而在那个地方,我们将把一些精心设计了的攻击代码。由于攻击代码的编写需要一些汇编知识,这里我将不打算涉及。我们这里的目标是写出一个通过覆盖堆栈返回地址而让程序执行到另一个函数的堆栈溢出演示程序。 因为堆栈是往下增加的,因此,先进入堆栈的地址反而要大,这为在函数中找到溢出点提供了可能。试想,而堆栈是往上增加的,我们将永远无法在函数里面找到一个溢出点去覆盖返回地址。还是先从一个最简单的例子开始: void test(int i) { char buf[12]; } void main() { test(1); } test 函数具有一个局部参数和一个静态分配的缓冲区。为了查看这两个变量所在的内存地址(彼此相对的地址),我们将对代码略作修改: void test(int i) { char buf[12]; printf(&i = %d/n, printf(&buf[0] = %d/n, buf); } void main() { test(1); } 需要说明的是,由于个人习惯的原因,我把地址结果输出成10进制形式,但愿这并不影响文章的叙述。在我这里,产生下列输出:&i = 6684072 &buf[0] = 6684052。这里我补充一下,当调用一个函数的时候,首先是参数入栈,然后是返回地址。并且,这些数据都是倒着表示的,因为返回地址是4个字节,所以可以知道,返回地址应该是保存在从6684068到6684071。因为数据是倒着表示的,所以实际上返回地址就是:buf[19]*256*256*256+buf[18]*256*256+buf[17]*256+buf[16]。 我们的目标还没有达到,下面我们继续。在上面程序的基础,修改成: #include stdio.h void main() { void test(int i); test(1); } void test(int i) { void come(); char buf[12];//用于发生溢出的数组 int addr[4]; int k=(int)&i-(int)buf;//计算参数到溢出数组之间的距离 int go=(int) //由于EIP地址是倒着表示的,所以首先把come()函数的地址分离成字节 addr[0]=(go 24)24; addr[1]=(go 16)24; addr[2]=(go 8)24; addr[3]=go24; //用come()函数的地址覆盖EIP for(int j=0;j4;j++) { buf[k-j-1]=addr[3-j]; } } void come() { printf(Success!); } 一切搞定!运行之后,Success!成功打印出来!不过,由于这个程序破坏了堆栈,所以系统会提示程序遇到问题需要关闭。但这并不要紧,因为至少我们已经迈出了万里长征的第一步。

  0x01PoCPoC(全称:ProofofConcept),又叫概念验证。作为我们的漏洞验证程序,他可能是一段不完整的程序,仅仅是为了证明我们提出漏洞的观点。推荐使用Python编写PoC,因为安全界...博文来自:weixin_34302561的博客

  现在,开始!0x00前言今天刚刚把放到收藏夹准备看的,然后又看到题主的这个问题。顺便观摩了1楼大神的博客,我这种炒鸡新手表示很兴奋啊...博文来自:adislj007的博客

  在学习渗透测试过程中,一定要看shellcode编程揭秘,在该书中存在很多自己需要掌握的基础的知识,其中一个难点溢出分析,其中重点与难点是缓冲区溢出,转摘一篇写的很好的文章,分享给大家。缓冲区溢出(B...博文来自:一小平民

  缓冲区溢出漏洞实验本实验利用缓冲区溢出漏洞,通过修改函数返回地址,实现了获取带有root权限的shell。...博文来自:的博客

  一、实验内容利用一个程序漏洞,编写shellcode,达成效果:蹦出对话框,显示“Youhavebeenhacked!(byJWM)”二、实验原理因为输入了过长的字符,而缓冲区本身又没有有效的验证机制...博文来自:pianogirl123的博客

  由于缓冲区滋出漏洞非常广泛.如何防止其造成系统安全性下降也就成为了人们的重要研究对象。事实上.有大量的方法可以在一定程度L减少或者防止特定的缓冲区滋出漏洞出现.这些方法包括程序语ii、编译器、运行库,...博文来自:ljuyx010的专栏

  本文转载自WinDbg漏洞分析调试(一)WinDbg漏洞分析调试(二)引子最近开始要在部门内进行WinDbg漏洞分析方面的专题showcase,打算将每次分享的内容整理成文章,希望能写一个系列。另外,...博文来自:houjingyi的博客

  C和C++不能够自动地做边界检查,边界检查的代价是效率。一般来讲,C在大多数情况下注重效率。然而,获得效率的代价是,C程序员必须十分警觉以避免缓冲区溢出问题。C语言标准库中的许多字符串处理和IO流读取...博文来自:菜鸟的自留地-mooyang

  一、什么是缓冲区溢出?缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量,使得溢出的数据覆盖在合法数据上,通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,...博文来自:u012043391的专栏

  践踏堆栈-缓冲区溢出漏洞打算写这篇文章是因为在网上看过一篇论文,讲了缓冲区溢出破坏堆栈来执行恶意程序的漏洞。该论文请见参考资料1。这篇文章会涉及一些汇编的基础知识,以及虚拟内存的一些基本概念等。当然用...博文来自:__七把刀__

  KaliLinux从入门到精通(十)-漏洞挖掘之缓冲区溢出程序漏洞从哪里来?罪恶的根源:变量数据与代码边界不清(注入攻击)最简漏洞原理-shell脚本漏洞(本质:输入数据本身,程序本身没做检查导致)缓...博文来自:Geek_pwn

  1.概说缓冲区溢出又叫堆栈溢出(还有许许多的称呼),这是计算机程序难以避免的漏洞,除非有新的设计方式将程序运行的堆栈设计取代。溢出的目的是重写程序的运行堆栈,使调用返回堆栈包含一个跳向预设好的程序的程...博文来自:不断攀登的梦想

  Info:本篇主要是为了验证本地缓冲区溢出,这是理解缓冲区溢出攻击的第一步,有了这一步,才能更深刻的理解到什么是缓冲区漏洞攻击,从而对以后的学习奠定一定的基础(注意:以下请在linux环境下实验)基本...博文来自:我的天,bug!

  Linux系统下穿越火线版本接受入站socket连接时存在缓冲区溢出漏洞。工具:调试工具:edb;实验对象:crossfire运行平台:Kalii686虚拟机【32位,计算...

  之前的文章,我们写了一个小程序,输入到mnop的时候报错了。那么为什么name[]较短的时候没有事情,而比较大的时候就会发生羞羞的事情呢?!这就得谈起Windows的运行机制了,分为两个概念。第一个概...

  实验内容:分析缓冲区溢出漏洞,利用CCProxy6.2的这个缓冲区溢出漏洞,利用ping命令向其发送一个长的字符串,溢出局部变量,覆盖RET的位置,从而实现程序跳转到自己想要让其执行的程序上去。 定...

  一漏洞简介       整数溢出漏洞(integeroverflow):在计算机中,整数分为无符号整数以及有符号整数两种。其中有符号整数会在最高位用0表示正数,用1表示负数,而无符号整数则没有这种限制...

  一、内存攻防技术1.缓冲区溢出缓冲区溢出漏洞是程序由于缺乏对缓冲区边界条件检查而引起的一种异常行为,通常是程序向缓冲区中写数据,但内容超过了程序员设定的缓冲区边界,从而覆盖了相邻的内存区域,造成覆盖程...

  缓冲区溢出当缓冲区边界限制不严格时,由于变量传入畸形数据或程序运行错误,导致缓冲区被”撑爆”,从而覆盖了相邻内存区域的数据;成功修改内存数据,可造成进程劫持,执行恶意代码,获取服务器控制权等后果如何发...

  真的很小白,从安装虚拟机开始主要参考Mr.Buffoon这篇文章,增加了一些遇到的问题和解决方案1.环境配置我用的是virtualbox,百度搜索从官网下就好了。然后从这里下载WindowsXPsp3...

  1、简介GNUglibc是一种按照LGPL许可协议发布的开源免费的C语言编译程序。GNUglibc存在栈缓冲区溢出漏洞,允许攻击者可利用该漏洞使应用程序崩溃或执行任意代码。2、解决方案yumupdat...

  一、什么是溢出攻   首先,溢出,通俗的讲就是意外数据的重新写入,就像装满了水的水桶,继续装水就会溢出,而溢出攻击就是,攻击者可以控制溢出的代码,如果程序的对象是内核级别的,如dll、sys文件等,就...

  前言:用了2天时间把堆溢出研究了一下,起因是看了几篇有关堆溢出的文章,都谈及MOV [ECX],EAX、MOV [EAX+4],ECX让我一时无法理解,于是决定深入研究一下。现把学习成果回报看雪论坛的...

  杯具这东西也出溢出,不过版本貌似也太高了点吧。现在多用5.1几的吧。呃。TOOLS大牛搞的?有用的拿去玩玩吧!!! /* ** **

  一直有人说这个时代做渗透太难了,各个平台都开始重视安全性,不像十几年前,随便有个栈溢出就能轻松利用.现在的环境对于新手而言确实不算友好,上来就需要面临着各种边界保护,堆栈保护,地址布局随机化.但现实如...

  作者:fannywei在国外,早在80年代初就有人开始讨论溢出攻击,1989年,Spafford提交了一份关于运行在VAX机上的BSD版UNIX的fingerd的缓冲区溢出程序的技术细节的分析报告,这...

  1.栈溢出的原因栈溢出(stack-basedbufferoverflows)算是安全界常见的漏洞。一方面因为程序员的疏忽,使用了strcpy、sprintf等不安全的函数,增加了栈溢出漏洞的可能。另...

  在过去N年里,缓冲区溢出一直是网络攻击中最常被利用的漏洞。看一下缓冲区是如何创建的,就能知道原因所在。下面是C语言的一个例子:第一步,程序员使用malloc函数并定义缓冲区内存的数量(例如32位)第二...

  该漏洞使得攻击者只要接入同一Wi-Fi网络,即可向其他毫不知情的用户发送恶意数据包来触发任何Mac或iOS设备的崩溃和重启。由于该漏洞存在于系统网络核心代码,因此任何反病毒软件均无法防御。运行以下操作...

  1,xssCrossSiteScript恶意攻击者在某web页面植入恶意的html代码,当用户浏览该页面时,恶意的html代码会被执行,从而达到恶意用户的特殊目的,比如窃取用户的用户名与密码,cook...

  简要介绍这个软件是立阳明大学医学系的一个学生在大四的时候写的,这个漏洞是有CVE的(CVE-2013-4730),软件应该还挺普及的,这是一个缓冲区溢出漏洞具体exp可以点这里实验用pocimp...

  缓冲区溢出是一种非常普遍、非常危险的漏洞,在各种操作系统、应用软件中广泛存在。利用缓冲区溢出攻击,可以导致程序运行失败、系统宕机、重新启动等后果。更为严重的是,可以利用它执行非授权指令,甚至可以取得系...

  简介EFSWebServer是一个可以通过web端管理服务器文件的软件,发送GET请求长度过长会触发缓冲区溢出漏洞分析来源:

  一、前言最近由于研究需要,要用到线性判别分析(LDA)。于是找了很多资料来看,结果发现大部分讲的都是理论知识,因此最后还是看的一知半解,后来终于找到了个英文的文档,作者由PCA引入LDA,看过后豁然开...

  相信学习编程的同学,或多或少都接触到算法的时间复杂度和空间复杂度了,那我来讲讲怎么计算。        常用的算法的时间复杂度和空间复杂度 一,求解算法的时间复杂度,其具体步骤是: ⑴ 找出算法...

  reids是一个key-value存储系统,为了保证效率,缓存在内存中,但是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,以保证数据的持久化。   所以:redis是一...

  在网上所搜索很多操作Word的都是用VC,VS2010做了一些修改,添加操作的方式和用法都有所变化。 要操作Word必须先添加对应的类,如下图在工程中添加操作类(TypeLib中的 MFC类): ...

  本篇文章是根据我的上篇博客,给出的改进版,由于时间有限,仅做了一个简单的优化。相关文章:将excel导入数据库2018年4月1日,新增下载地址链接:点击打开源码下载地址十分抱歉,这个链接地址没有在这篇...

  前面一直跑caffe下的fcn,同时上一篇博客,也说明了关于fcn的数据集的制作。但是过程还是显的很复杂,因为我们都是模仿作者的数据集而作,而作者为了完成多任务,数据集制作的略显复杂,比如还需用到.m...

  supe_king的博客Cocos2dx游戏开发系列笔记8:开搞一个射击游戏《战神传说》//就个打飞机的

  又是一个愉快的夜晚 还是那张长长的工作桌 哲哲在左边做一个香云纱手包 骨头在这里噼里啪啦的解刨 pad里放着《赢在中国》 桌子中间各种饮料、奶、水果... 进击吧~骨头~ 首先感谢Androi...

  目前市场上比较多的应用在用户卸载后会弹出意见反馈界面,比如360手机卫士,腾讯手机管家,应用宝等等,虽然本人不太认同其交互方式,但是在技术实现上还是可以稍微研究下的。其实要实现这个功能,最主要的就是监...

  强连通分量: 简言之 就是找环(每条边只走一次,两两可达) 孤立的一个点也是一个连通分量   使用tarjan算法 在嵌套的多个环中优先得到最大环( 最小环就是每个孤立点)   定义: int Ti...

  前言: 本文主要讨论如何判断整型相加溢出(overflow)的问题. 我们知道计算机里面整型一般是有限个字节(4 bytes for int)表示, 正是因为只能用有限个字节表示一个整型变量, ...

  此处仅以VS2010为例,详细说明一下如何在VS环境下生成和使用C++的静态库与动态库。Qt下生成和使用静态和动态库后续再讲。 本文仅供初学者参考,如果有问题欢迎大家指正。        首先简单地理...

  luyan的博客jquery/js实现一个网页同时调用多个倒计时(最新的)

  jquery/js实现一个网页同时调用多个倒计时(最新的) 最近需要网页添加多个倒计时. 查阅网络,基本上都是千遍一律的不好用. 自己按需写了个.希望对大家有用. 有用请赞一个哦! //js ...

  最近在用yolo来做视频中的人员检测,选择YOLO是从速度考虑,在训练数据集的过程中碰到很多坑,并且现在yolo又到了v2的版本,在网络和命令中都有区别...

  花了几天,终于把matlab版的人脸检测运行成功了,虽然正确率不是很高,看着各种论文上的人脸检测正确率都出奇的高,我是不怎么相信的,有的论文连基于平均脸的人脸检测正确率都能达到98%,汗啊~~  也许...

  海海人生计算机视觉:相机成像原理:世界坐标系、相机坐标系、图像坐标系、像素坐标系之间的转换

  相机成像原理:世界坐标系、相机坐标系、图像坐标系、像素坐标系之间的转换...

  在MATLAB中,可以注释一段程序。 使用“%{”和“%}”。 例如 %{ 。。。 %} 即可。 经典方法是用 if 0,但缺点是不够直观,注释掉的内容仍然保持代码的颜色。现在可以用 ...

  gracia2015:博主,请问你给虚拟机上的macOS分了多少内存?我在虚拟机上运行特别卡,不知道是不是配置的问题,另外,在虚拟机上搞IOS开发可行吗?

本文链接:http://that-a-way.com/jingtaihuanchongqu/76.html

相关推荐:

网友评论:

栏目分类

现金彩票 联系QQ:24498872301 邮箱:24498872301@qq.com

Copyright © 2002-2011 DEDECMS. 现金彩票 版权所有 Power by DedeCms

Top