计算机等级考试三级信息安全技术章节习题5

五、应用安全

简述软件漏洞概念中包含的3个要素

简述软件漏洞的四个特点

按照软件漏洞被攻击者利用的地方进行分类,软件漏洞可以分为哪几类?

根据漏洞生命周期不同阶段进行划分,软件漏洞可以分为哪几类?

描述软件漏洞危险等级的划分

简单说明国内外知名漏洞库及其包含漏洞信息的特点

介绍缓冲区溢出的原理

缓冲区是一块连续的内存区域,用于存放程序运行时加载到内存的运行代码和数据。缓冲区溢出是指程序运行时,向固定大小的缓冲区写入超出其容量的数据,多余的数据会越过缓冲区的边界覆盖相邻内存空间,从而造成溢出。缓冲区的大小是由用户输入的数据决定的,如果程序不对用户输入的超长数据做长度检查,同时用户又对程序进行非法操作或错误输入,就会造成缓冲区溢出。

缓冲区溢出攻击是指发送缓冲区溢出时,溢出的数据会覆盖相邻内存空间的返回地址、函数指针、堆管理结构等合法数据,从而使程序运行失败,或发生转向去执行其他程序代码,或执行预先注入内存缓冲区中的代码。

说明操作系统的内存管理机制

操作系统中的每一个进程都会被分配一块独立的虚拟地址空间,用以保存进程运行时的数据和代码,虚拟地址空间是实际空间的映射。

堆(heap)是先进先出的数据结构,往高地址增长

栈(stack)是后进先出的数据结构,往低地址增长

介绍堆溢出和栈溢出的原理

堆是内存中用于存放动态数据的区域,堆空间由地址向高地址方向增长,堆溢出指堆中发生缓冲区溢出,利用堆溢出向内存单元写入任意数据,实现改写内存中的关键数据,达到攻击目的

栈的存取采用先进后出的策略,程序用它来保存函数调用时的有关信息,如函数参数、返回地址,函数中的非静态局部变量存放在栈中,栈溢出是缓冲区中最简单的一种,通过溢出数据覆盖返回地址,程序会转到覆盖后的地址指向的程序

介绍格式化字符串漏洞、整数溢出漏洞的原理

C 语言中的格式化函数允许可变参数,它根据传人的格式字符串获知可变参数的个数和类型,并依据格式化符号进行参数的输出。如果调用这些函数时,给出了格式符号串,但没有提供实际对应参数,这些函数会将格式化字符串后面的多个栈中的内容弹出作为参数,并根据格式化符号将其输出

整数分为无符号和有符号两类,对整数进行加、乘等运算时,计算的结果大于该类型的整数所表示的范围,就会发生整数溢出,分为:存储溢出、运算溢出、符号问题

介绍数组越界漏洞、写污点值到污点地址漏洞,以及内存地址对象破坏性调用漏洞的原理

介绍漏洞利用的概念和 shellcode 的编写方法

实施攻击前,需要做大量的调试工作,包括了解存放缓冲区溢出漏洞的程序有几个输入参数,哪个输入参数会造成缓冲区溢出,如何构造输入参数的长度和内容,以便使缓冲区的偏移距离恰好能覆盖返回地址,并将攻击者构造的可执行 shellcode 代码的地址写入到返回地址。根据软件漏洞具体条件构造相应输入参数和 shellcode 代码,最终实现获得程序控制权的工程,就是漏洞利用,一般用 exploit 来表示。

shellcode 代码是一段机器指令,可实现攻击者指定的操作,shellcode 通称缓冲区溢出攻击中植入的一段以获得执行权限的代码

shellcode 可用 C 语言编写,编译后用 OllyDbg加载其可执行文件,在从中选中所需的机器代码,也可通过 IDA Pro 等反编译工具从 PE 文件中得到对应的机器代码

对于Linux 系统 shellcode 中要实现的功能主要是通过系统调用来完成,而每个系统调用都有固定的系统调用号

对于 Windows 系统,虽然 Windows 也有系统调用,但都是封装在高级的 API 中调用的,且不同的 Service Pack 版本的操作系统其 API 都可能有所改动,所以不可能直接调用。需要采用动态的方法获取 API 地址,从而编写 shellcode

针对静态的 shellcode 地址、动态变化的 shellcode 地址分别说明其漏洞利用技术的原理

存在溢出漏洞的程序是一个操作系统每次启动都要加载的程序,操作系统启动时为其分配的内存地址一般是固定的,则函数调用时分配的栈帧地址也是固定的,溢出后写入栈帧的 shellcode 代码其内存地址也是静态不变的,所以可以直接将 shellcode 代码在栈帧中的静态地址覆盖原有返回地址。在函数返回使,通过新的返回地址指向 shellcode 代码地址,从而执行 shellcode 代码

有些软件的漏洞存在与某些动态链接库中,这些动态链接库在进程运行时被动态加载,因而在下一次这些动态链接库被重新装载到内存中,其在内存中的栈帧地址时动态变化的,则植入的 shellcode 代码在内存中的其实地址也时变化的。在这种情况下,需要让溢出发生时,覆盖返回地址后新写入的返回地址能自动定位到 shellcode 的起始地址。

说明针对堆漏洞的 Heap Spray 漏洞利用的技术

Heap Spray 也称为堆喷洒技术,在 shellcode 的前面加上大量的滑板指令,组成一个非常长的注入的代码段。然后向系统申请大量内存,并且反复用这个注入代码段来填充。这样就使得内存空间被大量的注入代码占用,攻击者在结合漏洞利用技术,只要使程序跳转到堆中被填充了注入代码的任何地址,程序指令就会顺者滑板指令最终执行到 shellcode 代码

滑板指令由大量 NOP 空指令 0x90 填充组成的指令序列,当遇到这些 NOP 指令时,CPU 指令指针会一个指令接一个指令地执行,总结不做任何具体操作,直到滑过最后一个滑板指令后,接着执行这些指令后面的其它指令,往往后面接着的时 shellcode代码,Heap Spray 技术通过使用类 NOP 指令来进行覆盖,对 shellcode 地址的跳转准确性要求不大,从而增加来缓冲区溢出攻击的成功率

说明微软操作系统中几种常用的漏洞防护技术

说明软件开发生命周期的概念和阶段划分

软件编码人员进行软件开放过程中,一般都会遵循相应的软件开发生命周期模型用于指导编码的整个过程。计算机软件产品从需求分析、设计、编码、测试、发布到维护,类似于经历一个生命的孕育、诞生、成长、成熟、衰亡的周期,一般称为软件开发生命周期。

介绍软件开发生命周期的几种模型

说明微软公司采用的软件安全开发生命周期模型12个阶段的内容

说明主要的软件静态和动态安全检测技术

静态完全检测技术包括词法分析、数据流分析、污点传播分析、符号执行、模型检查、定理证明等

动态安全检测技术主要包括模糊测试、智能模糊车上和动态污点分析等

详细介绍基于软件技术的软件安全保护技术

说明恶意程序主要的传播技术

说明恶意程序的4种检测技术

介绍10种常见的 Web 安全威胁手段