
负责本专栏的编辑: 计算机知识与技术计算机知识与技术第14卷第33期(2018年11月)第14卷第33期(2018年11月)缓冲区溢出漏洞分析与防范罗斌(南京分公司业务管理部)中国人民银行,江苏南京210002)摘要: 缓冲区溢出是各种操作系统和应用程序软件中普遍存在的危险漏洞. 可以使用缓冲区溢出攻击导致程序失败,系统崩溃和其他后果. 更严重的是,它可以用于执行未经授权的指令一定程度上能防范缓冲区溢出攻击的措施有哪些,甚至获得执行各种非法操作的系统特权. 本文分析了缓冲区溢出的基本原理,缓冲区漏洞利用的技术条件和利用方法,最后提出了Linux和Windows环境下缓冲区漏洞利用的预防策略. 关键字: 缓冲区溢出;漏洞利用;漏洞预防CLC: TP311文档标识代码: 商品编号: 1009-3044(2018)33-0044-021缓冲区溢出概述缓冲区是一个较宽泛的概念,用于存储数据的内存空间可以称为缓冲区. 缓冲区本身没有防止数据越过边界的机制. 当放置在缓冲区中的数据超出缓冲区范围时,称为缓冲区溢出. 可以利用的某些缓冲区溢出是安全漏洞,严重威胁了计算机的安全性. 每个进程在内存中都有一个相对独立的存储空间,该存储空间分为许多小分区. 我们关注六个主要的进程内存分区: 文本,数据,bss,堆,堆栈和Env段.

其中,重要的是集中于用于存储用户输入和变量(堆栈和堆)的缓冲区. 堆栈主要用于保存局部变量和函数调用的轨迹. 在大多数操作系统中,堆栈的增长方向与内存地址的增长方向恰好相反-堆栈从内存的高地址空间增长到低地址空间. 这种增长方法的结果是堆栈缓冲区溢出. 堆用于存储动态分配的变量,其增长方向是从内存的地址空间到高地址空间. 2堆栈缓冲区溢出漏洞2.1原理在讨论堆栈缓冲区溢出之前,首先要阐明两个不同的概念[1]: 堆栈缓冲区溢出和堆栈溢出,前者是本文中要讨论的漏洞,是安全漏洞,后者是由内存资源不足引起的,通常会导致程序崩溃,这是编程错误. 发生函数调用时,计算机的运行方式如下: 将参数压入堆栈,将指令寄存器eip压入堆栈(RET),将堆栈基地址寄存器ebp压入堆栈,堆栈指针esp为分配给堆栈基地址寄存器ebp,然后将局部变量压入堆栈. 堆栈缓冲区溢出的实质是堆栈帧(Stack Frame)溢出,溢出内容覆盖了存储在堆栈中的eip,即返回地址被更改,并且当函数返回时,从中弹出损坏的eip值堆栈转到eip寄存器执行,这将产生三个结果: 一个是最直接的结果,“好”结果是导致系统崩溃的程序段错误,第二个是可以控制eip寄存器执行用户级恶意代码的执行,第三是最糟糕的结果是,控制eip来执行系统级或根级恶意代码.

2.2漏洞利用2.2.1技术条件完整漏洞利用需要以下组件: 首先,NOP片段,即在有效负载之前用NOP填充缓冲区,这可以有效地增加目标区域的范围,即便于定位溢出点[1]. 尽管NOP片段在一定程度上大大提高了攻击成功率,但其成功还取决于堆栈偏移量的估计. 如果错误估计了堆栈偏移,则程序可能会崩溃并触发警报. 另外,NOP分片需要大量内存来存储NOP,这可能会导致堆栈区域不足,因为缓冲区太小. 由于这项技术非常流行,因此许多制造商提供了与NOP模式匹配的入侵防御系统来检测Shellcode. 第二个是Shellcode,它是指将达到黑客目的的机器代码. Shellcode是真正的二进制机器代码,通常以十六进制形式表示. 第三是修改寄信人地址. 缓冲区利用中最关键的元素是返回地址. 攻击者必须能够使用要返回的地址成功覆盖堆栈缓冲区中的eip值,然后才能控制程序跳转到其目的地. 您要执行的代码已执行. 2.2.2利用漏洞的第一种方法是从命令行使用堆栈缓冲区漏洞,并使用某些脚本语言直接编写攻击代码以获取root权限. 第二个是通过常见的攻击代码利用缓冲区漏洞. 常见的攻击代码可以在Internet或其他参考资料中找到,并且可以在许多情况下有效地用于多种用途.

第三种是使用小的缓冲区. 当有缺陷的缓冲区不足以存储相对较长的shellcode时,可以将shellcode注入到环境变量中,并使用main函数的argv参数从环境变量中读取shellcode. 内存. 该方法成功的原因是因为进程内存空间中的Env段是可写的. 2.2.3缓冲区溢出漏洞的实现过程通常包括以下步骤: 控制eip,确定抵销接收日期: 2018-09-21电子邮件: jslt@dnzs.net.cnhttp: //www.dnzs.net.cnTel : + 86-551-65690963 65690964ISSN 1009-3044 Computer Knowledge and Technology Vol.14,No.33,November. 201844万方数据网络通信和安全性本栏目编辑: 计算机知识和技术技术第14卷第33期(2018年11月)第14卷第33期(2018年11月)卷,确定攻击媒介,构造攻击“三明治”(NOP片段-Shell) ⁃代码-跳转地址),根据需要进行测试和调试.

3堆缓冲区溢出漏洞堆缓冲区溢出是指在堆数据区域中发生的缓冲区溢出,它也是可用的,但是其使用方法不同于堆栈缓冲区溢出[2]. 当程序需要在运行过程中分配和释放内存时,函数库提供诸如malloc(),realloca()和free()之类的函数. Malloc()将brk()分配的大内存块划分为小块,并为用户分配适当的块. 类似地,当需要free时,free()将确定新发布的块是否可以与其他块合并. 减少碎片. 为了提高操作效率,malloc元数据用于保存块的位置,大小或相关数据. 这些分配元数据通常以两种方式存在: 一种存储在全局变量中,另一种存储在全局变量中. 它存储在分配给用户的存储块之前或之后. 后一种方法是使用堆溢出来更改分配元数据,以更改程序的功能指针[3]. 4缓冲区溢出漏洞预防4.1 Linux下的缓冲区溢出漏洞预防由于缓冲区溢出和堆溢出的出现,许多程序员设计了内存保护方案来防止此类攻击: 首先,编译器的改进: libsafe可以有效地防止堆栈缓冲区溢出攻击,但是它对防止堆缓冲区溢出攻击没有太大作用;编译gcc时,Stackshield替换了一些不安全的选项; StackGuard添加了堆栈缓冲区和帧状态数据(帧状态数据)徽标,一旦缓冲区溢出破坏了存储在堆栈中的eip,该徽标将被破坏并被检测到; SSP根据stackgaurd重新分配堆栈变量,从而使攻击变得困难;基于gcc的非操作堆栈,GCC从4.1版开始实施了不可执行的堆栈,这意味着攻击者无法在堆栈上运行shellcode.
第二个是内核补丁和脚本: 不可执行的内存页面. 这项技术的主要思想是堆栈和堆不应该是可执行的,并且用户代码一旦加载到内存中就应该不可写. Page-eXec(PaX)修补程序试图通过更改内存分页的方法来提供对堆栈和堆的执行控制. PaX修补程序实丝雀,并且隐藏的标识符存储在ebp和以上的存储中RETN地址,一旦函数返回,它将检测隐藏标志是否已更改. 绕过/ GS的方法有很多: 猜测cookie的值,此方法仅适用于本地系统攻击;覆盖指向调用函数的指针;用特定标记替换cookie;覆盖SEH记录. (2)安全的结构化异常处理(SafeSEH),SafeSEH的目的是使用堆栈中的SEH结构存储来防止覆盖. SafeSEH保护机制对于异常处理非常有效一定程度上能防范缓冲区溢出攻击的措施有哪些,但是相对复杂. (3)SEH覆盖保护(SEHOP),SEHOP是Windows Server2008中新增的一种保护机制.
SEHOP是通过RtlDispatchExcep⁃tion程序实现的,该程序遍历异常处理链并确保它可以到达FinalExcep⁃tionHandler函数. 如果攻击者涵盖了异常处理结构,则RtlD⁃ispathcException将不会正常到达FinalExceptionHandler函数. (4)堆保护: 为了使用内存释放功能来伪造数据块头指针,Microsoft已实现了一系列保护堆免受此类攻击的方法: 安全释放和堆元数据标识,前者将块检测为释放前删除前一个堆的后向堆块指针和下一个堆的前向堆块指针都都指向当前数据块,实际上这个过程很难销毁,但是不幸的是,该方法也受制于某些先决条件有条件限制,后者是将标识符保存在堆数据块标头指针中并在删除链接之前对其进行检测. (5)数据执行保护(DEP)是为了防止放置在堆,堆栈或数据段中的代码运行. 这一直是操作系统的目标,但是直到2004年,AMD才将NX位添加到CPU中以首次实现DEP硬件支持. NX位可用于标识存储器页面是否可执行. 此后不久,英特尔也加入了CPU. XD位可以完成相同的操作. 但是,由于兼容性问题,并不总是启用DEP. (6)地址空间是随机分布的(ASLR),这将随机性引入到进程使用的内存地址中. 由于内存地址的变化,攻击更加困难.
Windows Vista及其后续版本引入了ASLR技术. 绕过ASLR的最简单方法是返回未链接到ASLR保护的模块. 5结束语缓冲区溢出攻击将对程序和系统造成严重损害,因此需要采取有效措施来防止缓冲区溢出漏洞. 在Linux和Windows操作系统中,通常可以通过漏洞检测,漏洞修复和运行时保护等技术来实现预防. 参考文献: [1]维基百科. 堆栈缓冲区溢出. 摘自Wikipedia: 缓冲区溢出[2] Wikipedia. 堆溢出. 摘自维基百科: 溢出. [3] Anley,C. 《 Shellcoder的手册: 发现和利用安全漏洞》. Wiley Publishing,Inc.,2007年. [通讯编辑: Guang Wenling] 450,000立方数据
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-228585-1.html
派军舰无害通过钓鱼岛12海里之内
喘气吗
那我们就真的只剩下麻将了