2.8 缓冲区溢出概述-0321_第1页
2.8 缓冲区溢出概述-0321_第2页
2.8 缓冲区溢出概述-0321_第3页
2.8 缓冲区溢出概述-0321_第4页
2.8 缓冲区溢出概述-0321_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

缓冲区溢出原理【引例】把1升的水注入容量为0.5升的容量中……第一次大规模的缓冲区溢出攻击是发生在1988年的Morris蠕虫,它造成了6000多台机器被瘫痪,利用的攻击方法之一就是fingerd的缓冲区溢出。缓冲区溢出攻击已经占了网络攻击的绝大多数,据统计,大约80%的安全事件与缓冲区溢出攻击有关。缓冲区溢出事件

根据CNNVD2020年以来每周的漏洞报告文档中,缓冲区溢出漏洞的所占总漏洞数量的百分比一直高居前五。缓冲区溢出是最常见的内存错误之一,也是攻击者入侵系统时所用到的最强大、最经典的一类漏洞利用方式。利用缓冲区溢出攻击,可以导致进程运行失败、系统宕机、重新启动等后果。更为严重的是,它可被利用来执行非授权命令,甚至可以取得系统特权,进而进行各种非法操作。Sudo发布安全通告,修复了一个类Unix操作系统在命令参数中转义反斜杠时存在基于堆的缓冲区溢出漏洞(CVE-2021-3156),普通用户可以通过利用此漏洞,而无需进行身份验证,成功获取root权限,据报道这个漏洞已存在十年了,大部分的linux系统都存在这个sudo漏洞。什么是缓冲区、缓冲区溢出?从程序的角度,缓冲区就是应用程序用来保存用户输入数据、临时数据的内存空间如果用户输入的数据长度超出了程序为其分配的内存空间,这些数据就会覆盖程序为其它数据分配的内存空间,形成所谓的缓冲区溢出样例程序1#include"stdafx.h"intmain(intargc,char*argv[]){ charbuffer[8];

printf("Pleaseinputyourname:"); gets(buffer); printf("Yournameis:%s!\n",buffer); return0;}发生溢出样例程序2voidfunc(char*input){ charbuffer[16]; strcpy(buffer,input);}上面的strcpy()将直接把input中的内容复制到buffer中。这样只要input的长度大于16,就会造成buffer的溢出,使程序运行出错C语言存在像strcpy这样问题的标准函数还有strcat(),sprintf(),vsprintf(),gets(),scanf()以及在循环内的getc(),fgetc(),getchar()等缓冲区溢出带来的问题引起程序运行失败严重时可导致系统崩溃可以人为利用缓冲区溢出来执行代码(shellcode),从而取得对系统的控制权最常见的手段是通过制造缓冲区溢出使程序运行一个用户shell,再通过shell执行其他命令。如果该shell程序属于root(或者system)权限的话,攻击者便可以对系统进行任意操作UESTC程序在内存中的映像……文本(代码)段数据段堆栈段内存低地址内存高地址内存递增方向初始化数据段非初始化数据段(BSS)堆(Heap)栈(stack)堆的增长方向栈的增长方向内核数据代码PEB&TEB系统DLL代码段程序在内存中的映像文本区域包括代码(指令)和只读数据.该区域相当于可执行文件的文本段。

这个区域通常被标记为只读。数据区域包含了已初始化和未初始化的数据。

静态变量储存在这个区域中。堆栈可用于给函数中使用的局部变量动态分配空间,给函数传递参数和函数返回值也要用到堆栈。堆往高地址增长,而栈往低地址增长。栈是一块连续的内存空间先入后出生长方向与内存的生长方向正好相反,从高地址向低地址生长每一个线程有自己的栈,提供一个暂时存放数据的区域使用POP/PUSH指令来对栈进行操作使用ESP寄存器指向栈顶,EBP指向栈帧底栈栈内容函数的参数函数返回地址EBP(栈底指针)的值一些通用寄存器(EDI,ESI…)的值当前正在执行的函数的局部变量CPU里的三个重要寄存器ESP:即栈顶指针,随着数据入栈、出栈而发生变化EBP:即基地址指针,用于标识栈中一个相对稳定的位置。通过EBP可以方便地引用函数参数以及局部变量EIP:即指令寄存器,在将某个函数的栈帧压入栈中时,其中就包含当前的EIP值,即函数调用返回后下一个执行语句的地址函数调用过程把参数压入栈保存指令寄存器中(EIP)的内容,作为返回地址放入堆栈当前的基址寄存器(EBP)把当前的栈指针(ESP)拷贝到基址寄存器(EBP)

,作为新的基地址为本地变量留出一定空间,把ESP减去适当的数值函数调用中栈的工作过程调用函数前,压入栈:上级函数传给A函数的参数返回地址(EIP)当前的EBP函数的局部变量调用函数后恢复EBP恢复EIP局部变量不作处理例子intAFunc(inti,intj){ intm=3;

intn=4; m=i; n=j; …………….. return8;}intmain(){ AFunc(5,6); return0;}语句执行前的EBP6当前EBP当前ESPAFunc(5,6);push6push5call_AFuncaddesp+8语句执行前的ESP函数调用中栈的工作过程5EIP_AFuncpushebpmovebp,espsubesp,0D8pushebxpushesipushediEBPd8hEDIESIEBX3(m=3)4(n=4)main(){语句执行前的EBP6当前EBP当前ESPmain(){AFunc(5,6);call_AFuncaddesp+8语句执行前的ESP函数调用中栈的工作过程5EIP_AFunc{……return8;popedipopesipopebxaddesp,0D8…………..popebpret}EBPd8hEDIESIEBX3(m=3)4(n=4)缓冲区溢出利用的思路Fun(char*input){ charszBuf[8]={0}; strcpy(szBuf,input); …}input的内容:用Shellcode函数的地址对EIP的填充6szBuf5EIPEBPEDIESIEBX3(m=3)4(n=4)ShellcodeShellcodeShellcode实际是

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论