2.8.1 缓冲区溢出原理-0321_第1页
2.8.1 缓冲区溢出原理-0321_第2页
2.8.1 缓冲区溢出原理-0321_第3页
2.8.1 缓冲区溢出原理-0321_第4页
2.8.1 缓冲区溢出原理-0321_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

缓冲区溢出原理【引例】把1升的水注入容量为0.5升的容量中……第一次大规模的缓冲区溢出攻击是发生在1988年的Morris蠕虫,它造成了6000多台机器被瘫痪,利用的攻击方法之一就是fingerd的缓冲区溢出。根据CNNVD2020年以来每周的漏洞报告文档中,缓冲区溢出漏洞的所占总漏洞数量的百分比一直高居前五。Windows系统中与缓冲区溢出相关的病毒:红色代码、Slammer、冲击波、震荡波、永恒之蓝。Sudo发布安全通告,修复了一个类Unix操作系统在命令参数中转义反斜杠时存在基于堆的缓冲区溢出漏洞(CVE-2021-3156),普通用户可以通过利用此漏洞,而无需进行身份验证,成功获取root权限,据报道这个漏洞已存在十年了,大部分的linux系统都存在这个sudo漏洞。2022年共披露安全漏洞23900+枚,其中低风险漏洞占比11.13%,中高风险漏洞占比较约53.82%,高危漏洞占比35.05%。什么是缓冲区、缓冲区溢出?从程序的角度,缓冲区就是应用程序用来保存用户输入数据、临时数据的内存空间。如果用户输入的数据长度超出了程序为其分配的内存空间,这些数据就会覆盖程序为其它数据分配的内存空间,形成所谓的缓冲区溢出。缓冲区溢出后果

缓冲区溢出是最常见的内存错误之一,也是攻击者入侵系统时所用到的最强大、最经典的一类漏洞利用方式。利用缓冲区溢出攻击,可以导致:进程运行失败;系统宕机、重新启动等;它可被利用来执行特定的程序;可以取得系统特权,进而进行各种非法操作(提权)。样例程序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代码段程序在内存中的映像

代码段数据只读,可执行。在代码段一切数据不允许更改。在代码段中的数据是在编译时生成的2进制机器代码,可供CPU执行。

数据段在程序开始运行的时候被加载。可读、写。存储已初始化和未初始化的数据。(全局变量、静态变量)

堆栈段放置程序运行时动态的局部变量,即局部变量的空间被分配在堆栈里面。可读、写。

堆往高地址增长,而栈往低地址增长。栈栈是一块连续的内存空间先入后出生长方向与内存的生长方向正好相反,从高地址向低地址生长每一个线程有自己的栈,提供一个暂时存放数据的区域使用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)1.早期的C和C++程序语言没有对数组读写数据进行边界检查的机制,导致了这一漏洞常常被攻击者所利用。

例如:标准C程序库中还存在许多不安全的字符串操作函数,包括:strcpy(),sprintf(),gets()等等,从而带来了很多脆弱点,这些脆弱点也便成了缓冲区溢出漏洞。缓冲区溢出产生的原因1.C和C++程序语言没有对数组读写数据进行边界检查的机制,导致了这一漏洞常常被攻击者所利用缓冲区溢出的步骤缓冲区溢出利用的思路Fun(char*input){ charszBuf[8]={0}; strcpy(szBuf,input); …}input的内容:用Shellcode函数的地址对EIP的填充6szBuf5EIPEBPEDIESIEBX3(m=3)4(n=4)ShellcodeShellcodeShellcode实际是一段代码,是发生缓冲区溢出后将要执行的代码Shellcode的作用就是实现漏洞利用者想要达到的目的,一般是用来安装木马或者提升权限的Shellcode的功能添加administrators或者root组用户开启远程shell下载程序(Trojan或者Rootkit)执行强制程序开发人员书写正确的、安全的代码。可以借助安全的开发工具帮助开发人员发现程序中的安全漏洞。通过对数组的读

温馨提示

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

评论

0/150

提交评论