网络安全5缓冲区溢出

上传人:wt****50 文档编号:33105164 上传时间:2018-02-13 格式:PPT 页数:52 大小:354.55KB
返回 下载 相关 举报
网络安全5缓冲区溢出_第1页
第1页 / 共52页
网络安全5缓冲区溢出_第2页
第2页 / 共52页
网络安全5缓冲区溢出_第3页
第3页 / 共52页
网络安全5缓冲区溢出_第4页
第4页 / 共52页
网络安全5缓冲区溢出_第5页
第5页 / 共52页
点击查看更多>>
资源描述

《网络安全5缓冲区溢出》由会员分享,可在线阅读,更多相关《网络安全5缓冲区溢出(52页珍藏版)》请在金锄头文库上搜索。

1、第五章 缓冲区溢出,本章内容,5.1 缓冲区溢出相关概念5.2 缓冲区溢出原理5.3 溢出保护技术5.4 安全编程技术,本章要求,了解缓冲区溢出的相关概念明确缓冲区溢出的危害理解栈溢出、堆溢出、整型溢出、格式化字符串溢出及文件流溢出的原因掌握安全编程技术,引子,1988 Morris蠕虫事件CERT统计数据,5.1 缓冲区溢出相关概念,缓冲区从程序的角度,缓冲区就是应用程序用来保存用户输入数据、程序临时数据的内存空间缓冲区的本质数组 存储位置StackHeap数据段,5.1 缓冲区溢出相关概念,缓冲区溢出如果用户输入的数据长度超出了程序为其分配的内存空间,这些数据就会覆盖程序为其它数据分配的内

2、存空间,形成所谓的缓冲区溢出,简单溢出实例,#include int main() char name8 = 0; printf(“Your name:”); gets(name); printf(“Hello,%s!”,name); return 0;,缓冲区溢出的危害,应用程序异常系统不稳定甚至崩溃程序跳转到恶意代码,控制权被窃,5.2 缓冲区溢出原理,预备知识理解程序内存空间理解堆栈理解函数调用过程理解缓冲区溢出的原理,Windows环境下的堆栈,程序空间由何构成?堆栈是什么?堆栈里面放的都是什么信息?程序使用超过了堆栈默认的大小怎么办?在一次函数调用中,堆栈是如何工作的?,程序在内存中

3、的映像,文本(代码)段,数据段,堆栈段,内存低地址,内存高地址,内存递增方向,初始化数据段,非初始化数据段(BSS),堆(Heap),栈(stack),堆的增长方向,栈的增长方向,内核数据代码,0x80000000,0x7FFFFFFF,PEB&TEB,系统DLL,代码段,栈,栈是一块连续的内存空间先入后出生长方向与内存的生长方向正好相反, 从高地址向低地址生长每一个线程有自己的栈提供一个暂时存放数据的区域 使用POP/PUSH指令来对栈进行操作使用ESP寄存器指向栈顶,EBP指向栈帧底,栈内容,函数的参数函数返回地址EBP的值一些通用寄存器(EDI,ESI)的值当前正在执行的函数的局部变量,

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

5、数后恢复EBP 恢复EIP局部变量不作处理,例子,int AFunc(int i,int j)int m = 3;int n = 4;m = i;n = j;BFunc(m,n);return 8;,int BFunc(int i,int j) int m = 1; int n = 2; m = i; n = j; return m;,int main()AFunc(5,6);return 0;,6,AFunc(5,6);push 6push 5call _AFuncadd esp+8,函数调用中栈的工作过程,5,EIP,_AFuncpush ebpmov ebp,espsub esp,48h

6、/压入环境变量/为局部变量分配空间,EBP,48h,EDIESIEBX,3(m=3),4(n=4),6,AFunc(5,6);call _AFuncadd esp+8,函数调用中栈的工作过程,5,EIP,_AFuncreturn 0;pop edipop esipop ebxadd esp,48h/栈校验pop ebpret,EBP,48h,EDIESIEBX,3(m=3),4(n=4),当缓冲区溢出发生时,int AFunc(int i,int j)int m = 3;int n = 4; char szBuf8 = 0; strcpy(szBuf, “This is a overflow

7、buffer!”);m = i; n = j;BFunc(m,n);return 8;,5.3 缓冲区溢出原理及其利用,缓冲区溢出种类栈溢出堆溢出整型溢出格式化字符串溢出其他溢出,栈溢出,特点缓冲区在栈中分配拷贝的数据过长覆盖了函数的返回地址或其它一些重要数据结构、函数指针,栈溢出实例,int AFunc(int i,int j)int m = 3;int n = 4; char szBuf8 = 0; *(int *)(int)szBuf+20) = BFunc;m = i; n = j;BFunc(m,n);return 8;,用BFunc的地址替换正常的AFunc返回地址,使程序运行至B

8、Func,堆溢出,堆和栈有何区别内存的动态分配与静态分配堆溢出特点缓冲区在堆中分配拷贝的数据过长覆盖了堆管理结构,#define BUFLEN 32int main(int argc, char* argv )char *buf1;buf1 = (char*)malloc(BUFLEN);strcpy(buf1,argv1); printf(%sn,buf1);free(buf1);return 0;,整型溢出,宽度溢出(Widthness Overflow)尝试存储一个超过变量表示范围的大数到变量中运算溢出(Arithmetic Overflow)如果存储值是一个运算操作,稍后使用这个结果的

9、程序的任何一部分都将错误的运行,因为这个计算结果是不正确的。符号溢出(Signedness Bug) 一个无符号的变量被看作有符号,或者一个有符号的变量被看作无符号,宽度溢出示例,void main(int argc,char* argv)unsigned short s; int i;char buf80;i = atoi(argv1);s = i;if(s = 80) return;memcpy(buf,argv2,i);,运算溢出示例,void CopyIntArray(int *array,int len)int* myarray,i;myarray = malloc(len*size

10、of(int);if(myarray = NULL)return;for(i=0;i size)return;memcpy(kbuf,buf,len);,格式化字符串溢出,关键字“%n”产生原因printf()是不定参数输入printf()不会检查输入参数的个数,其他溢出类型,.data section溢出PEB/TEB溢出文件流溢出,归纳,溢出的共性大object向小object复制数据(字符串或整型),容纳不下造成溢出溢出会覆盖一些关键性数据(返回地址、管理数据、异常处理或文件指针等)利用程序的后续流程,得到程序的控制权,缓冲区溢出的利用,char szBuf8 = 0;strcpy(sz

11、Buf,argv2);argv2的内容:对EIP的填充Shellcode,6,5,EIP,EBP,EDIESIEBX,3(m=3),4(n=4),Shellcode,Shellcode其实就是一段可以完成某种特定功能的二进制代码Shellcode的功能基本功能添加administrator or root组用户远程可用shell下载程序(Trojan or Rootkit)执行高级功能抗NIDS检测穿透防火墙,Shellcode不通用,Shellcode为什么不通用不同硬件平台IBM PC、Alpha,PowerPC不同系统平台Unix、Windows不同内核与补丁版本不同漏洞对字符串限制不同

12、,利用缓冲区溢出的攻击实例,login: zchPassword:Last login: Fri Jan 12 15:21:34 from 210.34.6.82Sun Microsystems Inc. SunOS 5.6 Generic August 1997You have mail.$ whozch pts/1 Jan 12 15:22 ()$ lpsetUsage: lpset -n (system|xfn) -x -a key=value -d key (printer)#查看是否有lpset程序$ ./lpset2 944 1600 2Usages: ./lpset2 Using

13、 RET address = 0xefffff40 ,Offset = 1600, Align= 2# iduid=0(root) gid=1(other)#入侵成功。lpset2源程序可在绿盟站点下载。,5.3 溢出保护技术,人代码作者编译器语言RunTime保护操作系统硬件,人代码作者,编写正确的代码方法学习安全编程软件质量控制源码级纠错工具,编译器,数组边界检查编译时加入条件例如canary保护,语言,为什么会出现缓冲区溢出?C/C+出于效率的考虑,不检查数组的边界(语言固有缺陷)类型非安全语言类型安全语言C,C+C#,Java?,RunTime保护,二进制地址重写Hook危险函数技术,

14、操作系统,非执行缓冲区缓冲区是存放数据地方,我们可以在硬件或操作系统层次上强制缓冲区的内容不得执行许多内核补丁用来阻止缓冲区执行,操作系统,堆栈不可执行内核补丁Solar designers nonexec kernel patchSolaris/SPARC nonexec-stack protection数据段不可执行内核补丁kNoX:Linux内核补丁,仅支持2.2内核。RSX:Linux内核模块。Exec shield增强的缓冲区溢出保护及内核MACOpenBSD security featurePaX,硬件,X86 CPU上采用4GB平坦模式,数据段和代码段的线性地址是重叠的,页面只要可读就可以执行,诸多内核补丁才会费尽心机设计了各种方法来使数据段不可执行.Alpha、PPC、PA-RISC、SPARC、SPARC64、AMD64、IA64都提供了页执行bit位。Intel及AMD新增加的页执行bit位称为NX安全技术.Windows XP SP2及Linux Kernel 2.6都支持NX,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号