第4章 缓冲区溢出_第1页
第4章 缓冲区溢出_第2页
第4章 缓冲区溢出_第3页
第4章 缓冲区溢出_第4页
第4章 缓冲区溢出_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

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

文档简介

第四章缓冲区溢出何路helu@

本章内容4.1缓冲区溢出相关概念4.2缓冲区溢出原理4.3溢出保护技术4.4安全编程技术本章要求了解缓冲区溢出的相关概念明确缓冲区溢出的危害理解栈溢出、堆溢出、整型溢出、格式化字符串溢出及文件流溢出的原因掌握安全编程技术引子1988Morris蠕虫事件CERT统计数据4.1缓冲区溢出相关概念缓冲区从程序的角度,缓冲区就是应用程序用来保存用户输入数据、程序临时数据的内存空间缓冲区的本质数组存储位置StackHeap数据段4.1缓冲区溢出相关概念缓冲区溢出如果用户输入的数据长度超出了程序为其分配的内存空间,这些数据就会覆盖程序为其它数据分配的内存空间,形成所谓的缓冲区溢出简单溢出实例#include<stdio.h>intmain(){charname[8]={0};printf(“Yourname:”);gets(name);printf(“Hello,%s!”,name);return0;}缓冲区溢出的危害应用程序异常系统不稳定甚至崩溃程序跳转到恶意代码,控制权被窃4.2缓冲区溢出原理预备知识理解程序内存空间理解堆栈理解函数调用过程理解缓冲区溢出的原理Windows环境下的堆栈程序空间由何构成?堆栈是什么?堆栈里面放的都是什么信息?程序使用超过了堆栈默认的大小怎么办?在一次函数调用中,堆栈是如何工作的?程序在内存中的映像……文本(代码)段数据段堆栈段内存低地址内存高地址内存递增方向初始化数据段非初始化数据段(BSS)堆(Heap)栈(stack)堆的增长方向栈的增长方向内核数据代码0x800000000x7FFFFFFFPEB&TEB系统DLL代码段栈栈是一块连续的内存空间先入后出生长方向与内存的生长方向正好相反,从高地址向低地址生长每一个线程有自己的栈提供一个暂时存放数据的区域

使用POP/PUSH指令来对栈进行操作使用ESP寄存器指向栈顶,EBP指向栈帧底栈内容函数的参数函数返回地址EBP的值一些通用寄存器(EDI,ESI…)的值当前正在执行的函数的局部变量三个重要的寄存器SP(ESP)即栈顶指针,随着数据入栈出栈而发生变化BP(EBP)即基地址指针,用于标识栈中一个相对稳定的位置。通过BP,可以方便地引用函数参数以及局部变量IP(EIP)即指令寄存器,在将某个函数的栈帧压入栈中时,其中就包含当前的IP值,即函数调用返回后下一个执行语句的地址函数调用过程把参数压入栈保存指令寄存器中的内容,作为返回地址放入堆栈当前的基址寄存器把当前的栈指针(ESP)拷贝到基址寄存器,作为新的基地址为本地变量留出一定空间,把ESP减去适当的数值函数调用中栈的工作过程调用函数前压入栈上级函数传给A函数的参数返回地址(EIP)当前的EBP函数的局部变量调用函数后恢复EBP恢复EIP局部变量不作处理例子intAFunc(inti,intj){

intm=3;

intn=4;

m=i;

n=j;

BFunc(m,n);

return8;}intBFunc(inti,intj){intm=1;intn=2;m=i;n=j;returnm;}intmain(){AFunc(5,6);

return0;}6当前EBP当前ESPAFunc(5,6);push6push5call_AFuncaddesp+8语句执行前的EBP语句执行前的ESP函数调用中栈的工作过程5EIP_AFuncpushebpmovebp,espsubesp,48h//压入环境变量//为局部变量分配空间EBP48hEDIESIEBX3(m=3)4(n=4)6当前EBP当前ESPAFunc(5,6);……call_AFuncaddesp+8语句执行前的EBP语句执行前的ESP函数调用中栈的工作过程5EIP_AFunc{……return0;}popedipopesipopebxaddesp,48h//栈校验popebpretEBP48hEDIESIEBX3(m=3)4(n=4)当缓冲区溢出发生时……intAFunc(inti,intj){

intm=3;

intn=4;

charszBuf[8]={0};strcpy(szBuf,“Thisisaoverflowbuffer!”);

m=i;n=j;

BFunc(m,n);

return8;}4.3缓冲区溢出原理及其利用缓冲区溢出种类栈溢出堆溢出整型溢出格式化字符串溢出其他溢出栈溢出特点缓冲区在栈中分配拷贝的数据过长覆盖了函数的返回地址或其它一些重要数据结构、函数指针栈溢出实例intAFunc(inti,intj){

intm=3;

intn=4;

charszBuf[8]={0};

*(int*)((int)szBuf+20)=BFunc;

m=i;n=j;

BFunc(m,n);

return8;}用BFunc的地址替换正常的AFunc返回地址,使程序运行至BFunc堆溢出堆和栈有何区别内存的动态分配与静态分配堆溢出特点缓冲区在堆中分配拷贝的数据过长覆盖了堆管理结构#defineBUFLEN32intmain(intargc,char*argv[]){char*buf1;buf1=(char*)malloc(BUFLEN);strcpy(buf1,argv[1]);

printf("%s\n",buf1); free(buf1); return0;}整型溢出宽度溢出(WidthnessOverflow)尝试存储一个超过变量表示范围的大数到变量中运算溢出(ArithmeticOverflow)如果存储值是一个运算操作,稍后使用这个结果的程序的任何一部分都将错误的运行,因为这个计算结果是不正确的。符号溢出(SignednessBug)一个无符号的变量被看作有符号,或者一个有符号的变量被看作无符号宽度溢出示例voidmain(intargc,char*argv[]){ unsignedshorts; inti; charbuf[80]; i=atoi(argv[1]); s=i; if(s>=80) return; memcpy(buf,argv[2],i);}运算溢出示例voidCopyIntArray(int*array,intlen){ int*myarray,i; myarray=malloc(len*sizeof(int)); if(myarray==NULL) return; for(i=0;i<len;i++) myarray[i]=arrary[i];}符号溢出示例voidCopySomething(char*buf,intlen){ charkbuf[800]; intsize=sizeof(kbuf); if(len>size) return; memcpy(kbuf,buf,len);}格式化字符串溢出关键字“%n”产生原因printf()是不定参数输入printf()不会检查输入参数的个数其他溢出类型.datasection溢出PEB/TEB溢出文件流溢出归纳溢出的共性大object向小object复制数据(字符串或整型),容纳不下造成溢出溢出会覆盖一些关键性数据(返回地址、管理数据、异常处理或文件指针等)利用程序的后续流程,得到程序的控制权缓冲区溢出的利用charszBuf[8]={0};strcpy(szBuf,argv[2]);argv[2]的内容:对EIP的填充Shellcode6szBuf5EIPEBPEDIESIEBX3(m=3)4(n=4)ShellcodeShellcodeShellcode其实就是一段可以完成某种特定功能的二进制代码Shellcode的功能基本功能添加administratororroot组用户远程可用shell下载程序(TrojanorRootkit)执行高级功能抗NIDS检测穿透防火墙Shellcode不通用Shellcode为什么不通用不同硬件平台IBMPC、Alpha,PowerPC不同系统平台Unix、Windows不同内核与补丁版本不同漏洞对字符串限制不同4.3溢出保护技术人—代码作者编译器语言RunTime保护操作系统硬件人—代码作者编写正确的代码方法学习安全编程软件质量控制源码级纠错工具编译器数组边界检查编译时加入条件例如canary保护语言为什么会出现缓冲区溢出?C/C++出于效率的考虑,不检查数组的边界(语言固有缺陷)类型非安全语言类型安全语言C,C++C#,Java?RunTime保护二进制地址重写Hook危险函数技术操作系统非执行缓冲区缓冲区是存放数据地方,我们可以在硬件或操作系统层次上强制缓冲区的内容不得执行许多内核补丁用来阻止缓冲区执行操作系统堆栈不可执行内核补丁Solardesigner’snonexeckernelpatchSolaris/SPARCnonexec-stackprotection数据段不可执行内核补丁kNoX:Linux内核补丁,仅支持2.2内核。RSX:Linux内核模块。Execshield增强的缓冲区溢出保护及内核MACOpenBSDsecurityfeaturePaX硬件X86CPU上采用4GB平坦模式,数据段和代码段的线性地址是重叠的,页面只要可读就可以执行,诸多内核补丁才会费尽心机设计了各种方法来使数据段不可执行.Alpha、PPC、PA-RISC、SPARC、SPARC64、AMD64、IA64都提供了页执行bit位。Intel及AMD新增加的页执行bit位称为NX安全技术.WindowsXPSP2及LinuxKernel2.6都支持NX缓冲区溢出漏洞挖掘Xcon2004基于数据流分析的静态漏洞挖掘Xcon2005结构化的签名和签名的结构化4.4安全编程技术设计安全的系统代码的规范和风格危险的函数安全测试设计安全的系统赖以生存的安全策略建立一个安全步骤定义产品的安全目标将安全看作产品的一个功能从错误中吸取教训使用最小权限使用纵深防御假设外部系统是不安全的做好失效计划使用安全的默认值设计安全的系统威胁模型STRIDE威胁模型欺骗标识Spoofingidentity篡改数据Tamperingwithdata拒绝履约Repudiation信息泄露Informationdisclosure拒绝服务Denialofservice特权提升Elevationofprivilege设计安全的系统部分威胁缓解方法欺骗标识篡改数据拒绝履约信息泄露拒绝服务特权提升认证保护秘密不存储秘密授权Hash消息认证代码数字签名抗篡改的协议数字签名时间戳审核跟踪授权加强保密的协议加密保密存储认证授权过滤扼杀服务质量以最小权限运行代码的规范和风格基本编程规

温馨提示

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

评论

0/150

提交评论