信息安全工程师案例分析真题考点:缓冲区(栈 ) 溢出
缓冲区溢出名词解释

缓冲区溢出名词解释
缓冲区溢出(Buffer Overflow),指当程序向缓冲区中写入超过其容量的数据,导致多余的数据覆盖了紧邻缓冲区的内存空间,从而破坏了程序原有的调用栈和指针。
攻击者可以通过逆向工程或其他手段找出缓冲区溢出的漏洞,并在缓冲区中注入恶意代码,从而获取系统管理员权限,进行非法操作。
缓冲区溢出是最常见和最危险的安全漏洞之一,也是黑客攻击常用的手段之一。
因此,在软件开发过程中,一定要注意对缓冲区操作的合法性、正确性和安全性进行严格的检查和控制。
缓冲区溢出

void main() { function(1,2,3);
}
展示堆栈的示例 example1
(gdb) disass main
❖ 0x08048358 <main+28>: push $0x3 ❖ 0x0804835a <main+30>: push $0x2 ❖ 0x0804835c <main+32>: push $0x1 ❖ 0x0804835e <main+34>: call 0x8048334 <function> ❖ 0x08048363 <main+39>: add $0xc,%esp
有关缓冲区溢出的数据
❖ 1998年Lincoln实验室用来评估入侵检测的的5种 远程攻击中,有2种是缓冲区溢出。
❖ 1998年CERT的13份建议中,有9份是与缓冲区 溢出有关的;1999年,至少有半数的建议是和缓 冲区溢出有关的。
❖ 在Bugtraq的调查中,有2/3的被调查者认为缓冲 区溢出漏洞是一个很严重的安全问题。
利用缓冲区溢出漏洞的攻击
❖ 随便往缓冲区中填东西造成它溢出一般只会出现 “分段错误”(Segmentation fault),而不能 达到攻击的目的。
❖ 如果覆盖缓冲区的是一段精心设计的机器指令序 列,它可能通过溢出,改变返回地址,将其指向 自己的指令序列,从而改变该程序的正常流程。
可利用的堆栈溢出 ❖ void fun () { example3
❖ 基于栈 ❖ 基于堆 ❖ 基于格式化字符串
Next
缓冲区溢出的原 理
典型的寄存器
❖ EIP:扩展指令指针,用于存放下一条指令 的地址。
缓冲区溢出原理及防范

摘要:正文:大纲:1.引言;随着网络安全技术的飞速发展,缓冲区溢出漏洞已经成为当前最具安全威胁的漏洞之一,缓冲区溢出攻击也成为一种非常有效而常见的攻击方法。
如Internet上的第1例蠕虫(Morris)攻击,就是利用了fingerd的缓冲区溢出漏洞。
SANS评选出的2005年威胁最大的20个漏洞中,有8个跟缓冲区溢出有关。
根据CNCERT最近几周的计算机安全漏洞的统计数据,与缓冲区溢出有关的安全事件占了很大的比例。
这些都充分说明了研究缓冲区溢出的重要性。
本文主要介绍了windows下的缓冲区溢出的相关知识。
2.漏洞原因和原理;2.1 产生原因;当向一个已分配了确定存储空间的缓冲区内复制多于该缓冲区处理能力的数据时,就会发生缓冲区溢出,溢出包括堆溢出和堆栈溢出。
它与程序在内存中的分布有关,而它产生的直接原因是由于C/C++程序中的一些函数调用时,没有进行边界检查,如C函数库中的strcpy(),strcat(),sprintf(),gets()等都是不安全的。
由上面的分析可知要产生缓冲区溢出,需要有几个条件: 1) 程序编译时在堆栈上分配了固定大小的缓冲区,并且在对缓冲区进行访问时没有提供边界检查。
这条在C/C ++语言中就满足,而对于有边界检查的语言,如Pascal 等,就没有这样的溢出问题。
2) 程序调用了没有进行边界检查的函数来访问(写操作) 缓冲区,这些函数没有对访问的缓冲区的大小进行判断。
由于在C语言中,字符串以0字节来标识结尾,其中没有字符串的长度信息,所以几个没有判断字符串长度的字符串拷贝函数就是容易出现问题的函数。
这些函数有: strcat()、strcpy()、sprintf()等。
3) 即使程序使用了上面所说的问题函数也不一定会出现溢出漏洞,漏洞发生的最后一个条件是程序员由于粗心,未检查用户输入数据的长度就将其直接复制到缓冲区中去。
虽然这看起来是一件小事,很容易杜绝。
可惜的是正因为有大量粗心的程序员的存在,使得溢出漏洞变得非常的普遍。
缓冲区溢出

缓冲区溢出分类
• 内存的概念
内存高址
Stack(栈) Heap(堆) Bss(非初始化文本区域) 初始化文本区域 Text(文本区)
内存低址
缓冲区溢出分类
• 基于栈的缓冲区溢出
桟是程序的临时变量的存储区域。一个简单的桟溢 出的例子:
int main(int argc, char **argv) { char buffer[16]; // 存储在Stack strcpy(buffer,argv[1]); //strcpy拷贝没有检测argv[1]参数的长度 //导致溢出 }
缓冲区溢出分类
• 基于栈的缓冲区溢出
程序执行流程: 压入当前的指令(寄存器(IP)作为函数返回的地址(ret) 压入当前的桟帧ebp寄存器 给局部变量分配空间(sub $0x10,%esp) [局部变量 16 字节][ebp 4字节][ret 4字节] |----填充大于16字节的数据导致溢出-----|
缓冲区溢出分类
• 格式化字符串溢出攻击
程序执行结果:
Before overwrite: retloc = 0x00000000 After overwrite: retloc = 0xffacffbe
程序执行分析:
printf("%.65470u%hn%65518c%hn", 'A', &retloc, 'B', (char*)(&retloc) + 2 ); |--ffbe--| |--ffac--|
缓冲区溢出分类
• 格式化字符串溢出攻击
格式化字符串:就是在*printf()系列函数中按照一 定的格式对数据进行输出,可以输出到标准输出,即 printf(),也可以输出到文件句柄,字符串等。 黑客可以利用的几个条件: (1)参数个数不固定造成访问越界数据 (2)利用%n/%hn格式符写入跳转地址 (3)利用附加格式符控制跳转地址的值
缓冲区溢出

网络安全实验教程
16
4.5 UAF类型缓冲区溢出实验
实验目的
✓ 了解UAF类型缓冲区溢出的原理; ✓ 掌握UAF类型缓冲区溢出的发生过程。
实验内容
✓ 使用VC 6.0的源码调试功能,观察内存块 p1的创建和释放过程,并观察p1释放后再 次使用的情况,以了解UAF类型缓冲区溢出 的原理。
网络安全实验教程
17
4.5 UAF类型缓冲区溢出实验
实验环境
✓ 操作系统:Windows XP SP3 32位; ✓ 编译工具:VC6.0。
网络安全实验教程
18
4.5 UAF类型缓冲区溢出实验
实验步骤
✓ 1.编译代码;
✓ 2.观察内存块p1->func仍然为未初始化的 0xcdcdcdcd;
✓ 3.观察内存块p1->func被赋值为myfunc函数 地址;
网络安全实验教程
20
4.6 覆盖返回地址实验
实验目的
✓ 了解通过覆盖返回地址进行缓冲区溢出利用 的原理;
✓ 掌握覆盖返回地址过程。
实验内容
✓ 在栈溢出实验的基础上,通过观察返回地址 被覆盖后的后续流程,了解和掌握通过覆盖 返回地址进行缓冲区溢出利用的技术。
网络安全实验教程
21
4.6 覆盖返回地址实验
✓ 1.编译代码; ✓ 2.使用VC6.0加载程序t1; ✓ 3.检查参数i大于10,不能通过条件判断; ✓ 4.修改参数i为65537; ✓ 5.观察上下文环境,i=0x00010001(65537)。
网络安全实验教程
14
4.4 整型溢出实验
✓ 6.发生宽度溢出:
➢ 注意到s=0x0001,i的高位被截断了。
EBP
信息安全管理与评估-缓冲区溢出原理

缓冲区溢出原理
• 在这里,我们假设现在有一个程序, 它的函数调用顺序如 下。 main() ->; func_1() ->; func_2() ->; func_3() 即: 主函数main调用函数func_1; 函数func_1调用函 数func_2; 函数func_2调用函数func_3。 其详细结构图如下页图所示。
缓冲区溢出原理
• 栈(Stack)是一种用来存储函数调用时的临时信息的结构, 如函数调用所传递的参数、函数的返回地址、函数的局部 变量等。
• 在程序运行时由编译器在需要的时候分配,在不需要的时 候自动清除。
• 栈的特性: 最后一个放入栈中的物体总是被最先拿出来,这 个特性通常称为先进后出(FILO)队列。
程序所使用的栈
• 在使用栈时,引用栈帧需要借助两个寄存器。 • 一个是SP(ESP),即栈顶指针,它随着数据入栈出栈而发生
变化。 • 另一个是BP(EBP),即基地址指针,它用于标识栈中一个
相对稳定的位置,通过BP,再加上偏移地址,可以方便地 引用函数参数以及局部变量。
程序所使用的栈
• 函数被调用的时候,栈中的压入情况如下:
内存高地址
传递给Func的实参
最先压入栈
退出Func函数后的返回地址
调用Func函数前的EBP
内存低地址 Func函数中的局部变量
最后压入栈
程序所使用的栈
• 在局部变量的下面,是前一个调用函数的EBP,接下来就 是返回地址。
• 如果局部变量发生溢出,很有可能会覆盖掉EBP甚至RET (返回地址),这就是缓冲区溢出攻击的“奥秘”所在。
网络安全知识:缓冲区溢出攻击

网络安全知识:缓冲区溢出攻击网络安全知识:缓冲区溢出攻击攻击原理几十年来,缓冲区溢出一直引起许多严重的安全性问题。
其中最著名的例子是:1988 年,因特网蠕虫程序在finger 中利用缓冲区溢出感染了因特网中的数万台机器。
但是,缓冲区溢出问题并非已成古老的历史,缓冲区溢出(又称堆栈溢出)攻击已成为最常用的黑客技术之一。
据统计,仅去年缓冲区溢出就占使CERT/CC 提出建议的所有重大安全性错误的百分之五十以上。
引起缓冲区溢出问题的根本原因是C(与其后代C++)本质就是不安全的,没有边界来检查数组和指针的引用,也就是开发人员必须检查边界(而这一行为往往会被忽视),否则会冒遇到问题的风险。
标准 C 库中还存在许多非安全字符串操作,包括:strcpy() 、sprintf() 、gets() 等。
缓冲区溢出源于每个程序运行的需要:放置数据的空间。
多数计算机程序都在内存中创建多个地址用于信息存储。
C 编程语言允许程序员在运行时在内存的两个不同部分(堆栈和堆)中创建存储器。
通常,分配到堆的数据是那些malloc() 或新建时获得的数据。
而分配到堆栈的数据一般包括非静态的局部变量和所有按值传递的参数。
大部分其它信息存储在全局静态存储器中。
在分配同一数据类型的相邻块时,这块内存区域称为缓冲区。
在写入缓冲区时,C 程序员必须注意存储在缓冲区中的数据不能超过它所能容纳的量。
缓冲区只能容纳一定数量的位,就象一个杯子只能盛一定量的水。
如果放到杯子中的水太多,多余的水就会溢出到别的地方。
相似地,如果试图放入缓冲区的数据比它能装入的要多,额外的数据就会溢出到别处。
当程序写入超过缓冲区的边界时,这就是所谓的”缓冲区溢出”。
发生缓冲区溢出时,会覆盖下一个相邻的内存块。
由于C 语言本质上的不安全性,所以它允许程序随意(或者更准确地说是完全出于偶然)溢出缓冲区。
没有运行时检查来这一防止写入超过缓冲区末尾,所以程序员必须在其自己的代码中执行这一检查,否则继续下去会出现问题。
栈溢出攻击原理(一)

栈溢出攻击原理(一)栈溢出攻击背景介绍•栈的概念•栈溢出的概念栈的构成•LIFO原则•栈帧•参数传递栈溢出原理•栈溢出的定义•缓冲区溢出•寄存器覆盖攻击栈溢出攻击的实现方式•缓冲区溢出攻击•格式化字符串攻击栈溢出攻击的实际案例•“Code Red”蠕虫病毒•Heartbleed漏洞防御措施•编写安全的代码•栈保护技术•输入验证结论•栈溢出攻击对计算机系统的危害•防御措施在提高系统安全性中的重要性栈溢出攻击背景介绍栈溢出攻击是一种常见的计算机安全漏洞,利用栈的特性对系统进行攻击。
栈是用于存储程序执行过程中的局部变量、临时数据和调用函数的返回地址等信息的一种数据结构。
栈的构成栈遵循LIFO(后进先出)原则,最后进入栈的数据首先出栈。
栈由多个栈帧组成,每个栈帧对应一个函数调用。
栈帧包括局部变量、函数参数、返回地址等信息。
栈溢出原理栈溢出是指当向栈中写入数据时,超出了栈的分配内存大小,导致覆盖了原本的数据。
主要有两种情况:缓冲区溢出和寄存器覆盖。
栈溢出攻击的实现方式1.缓冲区溢出攻击:攻击者通过向缓冲区写入大量数据,超出缓冲区的大小,覆盖并改变原本保存在栈上的数据。
2.格式化字符串攻击:利用格式化字符串的特性,向栈中写入恶意代码,改变程序的执行路径。
栈溢出攻击的实际案例1.“Code Red”蠕虫病毒:攻击者利用IIS服务器的缓冲区溢出漏洞,通过发送特定的HTTP请求触发蠕虫病毒的传播,导致服务器系统崩溃。
2.Heartbleed漏洞:OpenSSL库中存在缓冲区溢出漏洞,攻击者可以通过这个漏洞读取服务器内存中敏感信息,造成严重后果。
防御措施1.编写安全的代码:进行良好的输入验证和边界检查,确保代码中没有缺陷,减少攻击面。
2.栈保护技术:利用栈保护技术,如堆栈随机化(ASLR)、Non-executable Stack/Heap(NX)等,提高系统的抵抗能力。
3.输入验证:对输入数据进行验证和过滤,防止恶意数据影响程序的执行。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
信息安全工程师案例分析真题考点:缓冲区(栈 ) 溢出
缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓
冲区本身的容量溢出的数据覆盖在合法数据上。缓冲区溢出有堆缓冲
区和栈缓冲区溢出,二者有些不同,大部分情况下都是讨论栈溢出。
程序运行时,为了实现函数之间的相互隔离,需要在调用新函数
时保存当前函数的状态,这些信息全在栈上,为此引入栈帧。每一个
栈帧保存者一个未运行完的函数的信息,包括局部变量等等。缓冲区
溢出漏洞是由于函数内的本地变量溢出造成的,而本地变量都位于堆
栈区域,因此这类漏洞一般称为栈溢出漏洞。主要是因为C语言编
译器对数组越界没有进行检查导致的。
相关真题: 2020年信息安全工程师下午案例分析真题,第五大
题,问题1【图5-1给出了一段有漏洞的C语言代码(注:行首数字是
代码行号),请问,上述代码存在哪种类型的安全漏洞?该漏洞和C语
言数组的哪一个特性有关?】