网络安全第五讲

《网络安全第五讲》由会员分享,可在线阅读,更多相关《网络安全第五讲(53页珍藏版)》请在文档大全上搜索。
1、第五章第五章 缓冲区溢出攻击缓冲区溢出攻击5 5第五章 缓冲区溢出攻击 5.1缓冲区溢出程序的原理及要素缓冲区溢出程序的原理及要素5.2 攻击攻击UNIX5.3 缓冲区溢出攻击概述缓冲区溢出攻击概述5 55.4攻击攻击Windows 缓冲区溢出是一种非常普遍、非常危险的漏洞,在各种操作系统、应用软件中广泛存在。利用缓冲区溢出攻击,可以导致程序运行失败、系统宕机、重新启动等后果。更为严重的是,可以利用它执行非授权指令,甚至可以取得系统特权,进而进行各种非法操作。5.15.1缓冲区溢出攻击概述缓冲区溢出攻击概述 缓冲区溢出攻击有多种英文名称:buffer overflow,buffer overr
2、un,smash the stack,trash the stack,scribble the stack,mangle the stack,memory leak,overrun screw;它们指的都是同一种攻击手段。 第一个缓冲区溢出攻击Morris蠕虫,发生在1988年,它曾造成了全世界6000多台网络服务器瘫痪。5.15.1缓冲区溢出攻击概述缓冲区溢出攻击概述 缓冲区溢出攻击概述缓冲区溢出攻击概述 历史上最著名的例子 1988年,美国康奈尔大学的计算机科学系研究生、23岁的莫里斯利用Unix fingerd程序不限制输入长度的漏洞,输入512个字符后使缓冲器溢出,同时编写一段特别大的
3、恶意程序能以root(管理员)身份执行,并感染到其他机器上。 它造成全世界6000多台网络服务器瘫痪。参考:http:/en.wikipedia.org/wiki/Robert_Tappan_Morrishttp:/en.wikipedia.org/wiki/Blaster_%28computer_worm%295.15.1 1996 Aleph One,Smashing the Stack for Fun and Profit,Phrack 49 1998 Dildog:提出利用栈指针的方法完成跳转 The Tao of Windows Buffer Overflows 1999 Dark
4、Spyrit:提出使用系统核心DLL中的Jmp ESP指令完成跳转,Phrack 55 M.Conover:基于堆的缓冲区溢出教程5.15.1缓冲区溢出攻击概述缓冲区溢出攻击概述 2001年始,微软的IIS5.0一系列的漏洞被发现,其中不少漏洞是由于Unicode的处理问题造成的,在攻击利用的时候与Windows所支持的语言字符集密切相关。(Widechar的字符串缓冲区溢出攻击技术) 2003年8月引起全球轰动的“冲击波”病毒及变种,也是利用Windows RPC服务的缓冲区溢出漏洞来进行传播的。 2004年5月的“震荡波”病毒及变种也是利用了Windows系统的缓冲区漏洞。 目前5.15.
5、1缓冲区溢出攻击概述缓冲区溢出攻击概述 缓冲区溢出攻击概述缓冲区溢出攻击概述 定义 缓冲区溢出攻击是一种通过往程序的缓冲区写超出其长度的内容,造成缓冲区溢出,从而破坏程序的堆栈,使程序转而执行其他预设指令,以达到攻击目的的攻击方法。 分类 基于堆栈的缓冲区溢出(栈溢出) 基于堆/BSS的缓冲区溢出 整数溢出5.15.1 缓冲区溢出程序原理及要素缓冲区溢出程序原理及要素 缓冲区溢出程序的原理 众所周知,C语言不进行数组的边界检查。 在许多C语言实现的应用程序中,都假定缓冲区的长度是足够的,即它的长度肯定大于要拷贝的字符串的长度。事实并非如此事实并非如此5.25.2 缓冲区溢出程序原理及要素缓冲区
6、溢出程序原理及要素5.25.2例例1:#include void function(char *str) char buffer 9; strcpy(buffer,str);void main() char *input=1234567890; function(input); 缓冲区溢出程序原理及要素缓冲区溢出程序原理及要素5.25.2例例2:#includeint main() char name8; printf(please type your name:); gets(name); printf(hello,%s!,name); return 0; 在C语言中,指针和数组越界不保护是
7、Buffer overflow的根源。 在C语言标准库中存在像strcpy,gets这样问题的标准函数还有strcat(), sprintf()和scanf()等。 要透彻地理解这种攻击方式,需要计算机体系架构方面的基础知识,理解CPU、寄存器、内存是怎样协同工作而让程序流畅执行的。5.25.2缓冲区溢出程序原理及要素缓冲区溢出程序原理及要素 缓冲区溢出程序原理及要素缓冲区溢出程序原理及要素 缓冲区溢出攻击背景知识与技巧 进程内存空间结构 汇编语言基本知识 栈的基本结构 函数调用过程 编译器5.25.2进程内存空间结构进程内存空间结构 根据不同的操作系统,一个进程可能被分配到不同的内存区域去执
8、行。但是不管什么样的操作系统、什么样的计算机架构,进程使用的内存都可以按照功能大致分成以下4个部分: 代码区:这个区域存储着被装入执行的二进制机器代码,处理器会到这个区域取指并执行。 数据区:用于存储全局变量等。进程内存空间结构进程内存空间结构 堆区:进程可以在堆区动态地请求一定大小的内存,并在用完之后归还给堆区。 栈区:用于动态地存储函数之间的调用关系,以保证被调用函数在返回时恢复到调用函数中继续执行。Linux进程内存空间结构进程内存空间结构17Linux进程内存空间进程内存空间 Highest zone (0 xc0000000-3G) 进程环境参数: env strings &
9、 pointers 进程参数: argv strings & pointers, argc 栈 存储函数参数、本地参数和栈状态变量 (返回地址, ) LIFO, 向低地址增长 堆 动态分配变量 (malloc) 向高地址增长 .bss: uninitialized data .data: static initialized data .text(0 x80000000): 指令, 只读数据Win32进程内存空间进程内存空间19Win32进程内存空间进程内存空间 系统核心内存区间 0 xFFFFFFFF0 x80000000 (4G2G) 为Win32操作系统保留 用户内存区间 0 x
10、000000000 x80000000 (0G2G) 堆: 动态分配变量(malloc), 向高地址增长 静态内存区间: 全局变量、静态变量 代码区间: 从0 x00400000开始 栈: 向低地址增长 单线程进程: (栈底地址: 0 x0012FFXXXX) 多线程进程拥有多个堆/栈汇编语言基础知识汇编语言基础知识-寄存器寄存器汇编语言基础知识汇编语言基础知识-汇编指令汇编指令22栈的基本结构栈的基本结构 栈LIFO抽象数据结构 用于实现函数或过程调用 相关寄存器 BP (Base Pointer) = FP (Frame Pointer): 当前栈底指针 SP (Stack Pointer
11、): 当前栈顶指针 相关操作 PUSH: 压栈 POP: 弹栈23函数调用过程函数调用过程 函数调用过程的三个步骤 prologue: 保存当前的栈基址 (ebp). call: 调用参数和返回地址(eip)压栈,跳转到函数入口 return (or epilogue): 恢复调用者原有栈函数调用示例函数调用示例 int func_B(int arg_B1, int arg_B2)int var_B1, var_B2;var_B1=arg_B1+arg_B2;var_B2=arg_B1-arg_B2;return var_B1*var_B2;int func_A(int arg_A1, int