又考完一门试了,把笔记扔这里吧。
第一章 软件安全概述
1.1软件的概念
软件 = 程序 + 数据 + 文档资料
-
软件功能
-
系统软件
-
支撑软件
-
应用软件
-
-
软件规模
- 微型、小型、中型、大型、甚大型、极大型
-
服务对象的范围
-
面向客户的项目软件
-
面向市场的产品软件
-
1.2软件安全的由来
- 软件应用越来越广泛
- 软件自身的原因
- Connectivity 互联性
- Extensibility 拓展性
- Complexity 复杂性
- 黑客攻击方式的进化
- 传统技术的不足
- 传统网络安全技术只能对网络层进行防护
- 无法分辨与正常应用数据混杂在一起的攻击
- XSS
- SQL注入
- 未校验参数
- 传统的安全模式
- 保护边界
- 网络安全
- 被动式
- 新的安全模式
- 构建安全的系统
- 设计安全的软件
- 软件开发人员和设计人员对安全负责
- 主动式
- 传统安全教育的不足
- 有些开发人员、测试人员、设计人员逃避安全设计 和安全测试
1.3软件安全的概念
-
软件自身的安全:放破解,保护公司利益
-
用户使用中的安全:保护客户利益
-
安全的目的
- 数据的安全
- 业务的可持续性
-
软件安全的定义:采用工程的方法使得软件在敌对攻击的情况下仍能够继续正常工作。即采用系统化、规范化和数量化的方法来指导构建安全的软件。
需要和软件可靠性相区分。它是指软件产品在规定的条件下和规定的时间区间内完成规定功能的能力。
1.4软件安全的知识体系
- 描述性知识
- 原则
- 方针
- 规则
- 提供一些建议,旨在说明该做什么和在构建安全的软件时应该说明什么
- 诊断性知识
- 攻击模式
- 攻击程序
- 弱点
- 其更重要的目标是帮助操作人员识别和处理导致安全攻击的常见问题
- 历史性知识
- 包括历史风险,有些情形下也包括弱点和历史数据库
1.5软件安全威胁与来源
四大典型软件安全威胁
- 软件缺陷和漏洞 (正常软件)
- 功能性逻辑缺陷
- 安全性逻辑缺陷
- 功能型逻辑缺陷不算漏洞,只是缺陷,只有引发安全性的才叫做漏洞。
- 危害
- 软件正常功能被破坏
- 系统被非法控制和破坏
- 信息泄露
- 恶意软件:实现恶意目的
- 指哪些设计目的是为了实施特定恶意软件功能的一类软件程序
- 典型恶意软甲种类
- 计算机病毒
- 蠕虫
- 特洛伊木马
- 后门
- 僵尸
- 间谍软件
- 恶意软件的威胁
- 修改或者破坏已有软件的功能
- 窃取目标系统中的重要数据
- 监视目标系统中的用户行为
- 控制目标系统
- 非法破解,知识产权被侵害 (正常软件)
- 软件后门 (正常软件)
- 漏洞形式的后门优势
- 难发现
- 易利用
- 难取证
- 目前,以漏洞形式存在的后门也是软件产品的重要安全威胁之一。
- 漏洞形式的后门优势
1.6软件安全防护手段
- 安全设计
- SDL-IT
- 保障运行环境
- 软件完整性校验
- 系统完整性校验
- 加强软件自身行为认证
- 软件动态可信认证
- 恶意软件测试与查杀
- 黑客攻击防护
- 防火墙
- 入侵检测系统 IDS
- 入侵防护系统 IPS
- 基于主机的漏洞攻击阻断技术
- 系统还原
- 虚拟隔离
- 虚拟机
- 沙箱
1.7专有名称及定义
- Big-edian
- 高字节在低地址,低字节在高地址
- Little-edian
- 高字节在高地址,低字节在低地址
- 缓冲区
- 已经分配的一段大小确定的内存空间,当数据在两个运行速度或者作业量不同的设备间传递时,通常使用缓冲区作为临时存储区。
- 堆
- 应用程序使用的一块内存区域,它在运行应用程序时动态分配
- 栈
- 用来存储临时数据的内存空间,它在程序运行期间不停地增长或收缩
- 软件缺陷
- 不是所有的缺陷都是漏洞,如果不被利用,软件缺陷就不是漏洞
- 反汇编程序
- 将机器代码程序转变为汇编代码的软件工具
- API
- 应用程序编程接口是包含特殊函数功能的程序组件,这些函数功能可以被程序员在程序中使用。
- 字节码
- 介于高级语言代码和机器代码之间的程序。
- exploit
- 典型的exploit是一个程序,通过使用该程序可以触发一个软件漏洞并被攻击者所利用完成恶意操作。
- shellcode
- 传统的shellcode是执行shell的代码,现在通过被定义一个成功exploit所执行的代码。
- 黑客
- 真正里了解计算机内部是如何工作的计算机精湛的安全人员
- 破解者
- 有能力编写入侵程序的攻击者
- 脚本小子
- 依靠别人编写的入侵程序的人
- 白帽子
- 灰帽子
- 黑帽子
- Sandbox
- 虚拟机
- 社会工程
- 0day
- off-by-one
1.8软件安全工具简介
- 反编译器&反汇编器
- 对于编译型语言
- IDA Pro
- Hopper
- 对于解释型语言
- Java-Jad
- Python-uncompyle2
- 对于编译型语言
- 调试器
- 可以让软件安全人员在程序运行的同时观察程序的运行过程和状态
- 两个基本功能
- 设置断点
- 代码跟踪
- 分为用户模式和内核模式调试器
- 用户模式调试器
- OllyDbg
- x64dbg
- WinDbg
- 内核模式调试器
- WinDbg
- SoftIce
- 内核模式调试建议在虚拟机上
- 系统监视工具
- Windwos Sysinternals Suite
- 一套针对Windows系统的监控、分析工具
- FileMon
- 监控程序和操作系统之间所有文件系统级的通信。
- RegMon
- 监控注册表的活动
- Process Explorer
- 显示进程、加载在各自地址空间的DLL等详细 信息
- Autoruns工具
- 显示了完整的开机启动的项目,还可以显示系统服务、启动阶段执行的项目、驱动等内容
- TCPView
- 监控每个进程的所有活动的TCP和UDP网络连接
- Portmon
- 物理端口监视器,监控系统中所有的并行和串行I/O通信
- Windwos Sysinternals Suite
- 修补和转储工具
- 修补工具指可以修改二进制可执行代码以改变其行为的过程,常常与软件破解相关。
- Hex Workshop
- UltraEdit
- WinHex
- 010Editor
- PEview
第二章 软件安全基础
2.1系统引导与控制权
- BIOS
- 基本输入输出系统。存储在主板的BIOS Flash芯片
- 未计算机提供最底层的最直接的硬件设置ihe控制
- BIOS的自检与初始化工作
- 任务
- 检测系统的一些关键设备,比如内存和显卡是否正常和能否正常工作,进行初始化,并将控制权交给后续引导程序
- 显卡初始化
- 显示 系统BIOS启动画面
- 检测CPU
- 检测一些标准硬件设备及即插即用设备 比如硬盘
- 根据用户指定的启动顺序从硬盘或者usb启动
- 如果从硬盘启动,则将控制权交给硬盘主引导程序
- 任务
- 硬盘主引导程序
- 所在位置
- MBR Master Boot Record
- 硬盘的第一个扇区
- 主要功能
- 通过主分区表中定位活动分区
- 装载活动分区的引导程序,并移交控制权。
- 所在位置
- 活动分区引导程序
- 所在位置
- DBR DOS Boot Record、
- 或者叫做 OBR OS Boot Record
- 或者叫做 分区引导记录 PBR Partition Boot Record
- 它是分区的第一个扇区
- 功能
- 加载操作系统引导程序
- 如Windows XP的NTLDR
- 所在位置
- 系统引导和恶意软件有何关系?
- 恶意软件在植入系统之后,如何再次获得控制权?
- 在操作系统引导阶段控制权
- BootKit:BIOS木马,MBR木马等,可用于长期驻留在系统;早期的DOS引导区病毒等。
- CIH病毒
- 在操作系统启动阶段获得控制权
- 最常见的恶意软件启动方法,多见于独立的恶意软件程序。
- 在应用提程序执行阶段获得控制权
- 最常见的文件感染型病毒启动方法
- 在操作系统引导阶段控制权
- 恶意软件在植入系统之后,如何再次获得控制权?
2.2 Windows内存结构与管理
Windows内存可以分为
- 物理内存
- 需要进入Windows内核级别ring0才能看到
- 虚拟内存
- 通常在用户模式下,我们用调试器看到的内存都是虚拟内存
CPU特权级与内存访问
- 用户模式 Ring 3
- 内核模式 Ring0
- 可以访问所有的内存空间(包括用户模式分区)和硬件,可使用所有处理器指令。
- 用户区内存
- 每个进程真正独立的可用内存空间,进程中的绝大部分数据都保存在这一区域中。
- 主要包括应用程序代码
- 全局变量
- 所有线程的线程栈
- 加载的DLL带啊吗
- 每个进程的用户区的虚拟内存空间相互独立,一般不可以直接跨进程访问,这使得一个程序直接破坏令一个程序的可能性非常小。
- 每个进程真正独立的可用内存空间,进程中的绝大部分数据都保存在这一区域中。
- 内核区的内存
- 所有数据都是所有进程共享的,是操作系统代码的驻地
- 操作系统内核代码
- 线程调度
- 内存管理
- 文件系统支持
- 网络支持
- 设备驱动程序
- 该分区的所有代码和数据都被操作系统保护
- 用户区模式代码无法直接访问和操作
- 如果系统直接堆内存空间内的地址访问,将会发生地址访问违规。
- 所有数据都是所有进程共享的,是操作系统代码的驻地
x86 Windows 默认使用二级页面把虚拟地址转译为物理地址。
- 一个32位地址 被划分为三个单独部分
- 页目录索引
- 页表索引
- 字节索引
- x86系统上默认页面大小为4KB,故业内字节索引宽度为12位。
2.3 磁盘物理与逻辑结构
硬盘是
- 控制代码的静态存储结构
- 系统引导代码
- 各类程序与数据
- 恶意软件执行控制权争夺的中心
硬盘的逻辑结构
-
寻址方式
- CHS Cylinder / Head / Sector
- Cylinders 柱面:每个盘片的半径均为固定值R的同心圆
- Headers 磁头: 每个盘片有两个面,每个面都有一个读写磁头
- Sector 扇区:每个磁道被划分为几十个扇区
-
CHS的参数取值范围
- 磁头数 0~255 8位
- 柱面数 0~1023 10位
- 扇区数 1-63 6位 通常每个删除512字节。
-
CHS参数寻址的磁盘最大容量
1024 * 256 * 64 * 512 / 1024 / 1024 = 8064MB
-
老式磁盘
- 每个磁道的扇区数相等
-
当前磁盘
- 采用等密度结构
- 寻址方式采用线性逻辑块寻址 LBA Logical Block Address。
- 以扇区为单位进行线性寻址
-
总体结构
- 磁盘的机构
- 主引导扇区
- 基本分区
- 拓展分区
- 逻辑驱动器
- Windows常见分区类型
- FAT32
- NTFS
- 磁盘的机构
-
主引导扇区
- 位于整个磁盘的0柱面0磁头1扇区,即硬盘的第一个扇区。
- MBR引导程序:占了其中的前446个字节
- DPT 硬盘分区表
- 描述各分区的基本信息
- 分区开始位置、总扇区数
- 分区类型【主分区/主拓展分区】
- 拓展分区的每个逻辑驱动器的分区信息都保存在一个类似MBR的拓展引导记录 Extended Boot Record中
- 拓展引导记录包括分区表和结束表示55 AA,没有引导代码部分。
- 结束标志:最后的两个字节:55AA
2.4 FAT32文件系统
簇
- 文件系统将磁盘空间以一定数目的扇区为单位进行划分,这样的单位称为簇。
- 每扇区大小为512字节
- 簇的大小一般是512B、1KB、2KB。。。64Kb等。
- 簇是进行文件空间分配的最小单位。
FAT表
- File Allocation Table 文件分配表。是微软在FAT文件系统中用于磁盘数据文件索引和定位引进的单项链式结果
- FAT区用每一个Fat项来记录每一个簇的占用情况
- FAT表中表项的个数 = 簇的个数
- FAT表按顺序依次记录了该盘各簇的使用情况
- 如果为0,则表示对应簇空间,可存储数据
- 每个表项多大?
- FAT16系统的FAT表项战16位。
- 可表达的最大簇号空间位64K
- FAT32系统的FAT表项占用32位,4字节
- 可表示的最大簇号空间位4G
- FAT16系统的FAT表项战16位。
簇链
- 一个文件所占用簇的序号形成的单向链表
- 实现方法
- 在文件占用簇的对应簇号的FAT表,填写下一个簇的簇号,如果位最后一簇,则输入结束表示
FFFFFF0F
- 在文件占用簇的对应簇号的FAT表,填写下一个簇的簇号,如果位最后一簇,则输入结束表示
文件存储
- 按照文件大小定位足够的空闲簇
- 创建文件目录项
- 在FAT中构架簇链表
- 在对应分配的簇中写入数据
文件删除、
-
目录项
- 文件名首字节被修为E5
- 首簇高位被清零
-
FAT表簇链
- 全部被清空
-
文件内容
- 无变化
重要文件被删除后,不得堆分区继续进行写
被删除文件的恢复机理
- 确定高位并还原
- 参考相邻目录项的首簇高位
- 从0往上试探,看首簇指向内容是否为预期文件头
- 修复FAT表簇链
- 通过文件大小计算所占簇数
- 按照连续假设存储,进行簇链修补,其中末尾FAT项采用0xFFFFFFF结尾。
2.5 PE文件格式
2.5.1 PE文件及其表现形式
- 可移植的可执行文件 PE Portable Executable File
- win32平台可执行文件使用的一种格式
- 其他EXE文件格式
- DOS :MZ格式
- Windows 3.0/3.1
- NE New Executable
- 16位Windows可执行文件格式
- PE文件
- 一个可执行文件不光包括了二进制吧h的机器代码、还会自带许多其他信息
- 字符串
- 菜单
- 图标
- 位图
- 字体
- PE文件格式规定了所有的这些信息在可执行文件中如何组织
- 在程序被执行时,操作系统会按照PE文件格式的约定区相应的地方准确地定位各种类型地资源,并分别装入内存地不同区域。
- 一个可执行文件不光包括了二进制吧h的机器代码、还会自带许多其他信息
2.5.2 PE文件格式与恶意软件的关系
文件感染 / 控制权地获取
- 使得目标PE文件具备/启动 病毒功能 / 目标程序
- 但不破坏目标PE文件原有功能和外在形态等。
病毒代码如何与目标PE文件融为一体?
- 代码植入
- 控制权获取
- 图标更改等
2.5.3 PE文件格式总体结构
-
MS-DOS MZ 文件头 一共0x40,即64个字节
-
DOS Stub 开始于0x40
- 定位PE文件头的开始位置,也可以用于PE文件合法性检测
- DOS下运行该程序,将提示用户“This Progrm cannot be run in DOS mode!”
-
PE Header
- 由三个部分组成 kaishiyu 开始于0xB0
- 字串 “PE\0\0” signature
- 50h, 45h, 00h, 00h
- 本域为PE标记,可以以此识别给定文件是否为有效PE文件。
- 映像文件头 File_Header
- 此结构域包含了关于PE文件物理分布的信息,比如节数目,后续可选文件头大小,机器类型等。
- 一共0x14,即20个字节
- 可选文件头 Optional_Header
- 定义了PE文件的很多关键信息
- 内存镜像加载基础 ImageBase
- 程序入口点 (代码从哪开始执行) Address of EntryPoint
- 节在文件和内存中的对齐粒度
- 本程序在内存中的镜像大小、文件头大小等。
相关概念
- ImageBase
- PE文件在内存中的优先装载地址
- RVA
- Relative Birtual Address 相对虚拟机制。它是相对内存中的ImageBase的偏移地址
- 静态反汇编等工具看到的PE文件中某条指令的位置是相对于磁盘文件额如烟的,即所谓的文件偏移。我们可以还需要知道这条指令在内存中所处的位置,即虚拟内存地址VA
- 反之,在调试的时候看到的某条指令的地址是虚拟内存地址,我们也经常需要回到PE文件中找到这条指令对应的机器码。
- VA
- Virtual Address
- 虚拟内存地址
- PE文件中的指令被装入内存后的地址
- File Offset
- 文件偏移地址
- 数据在PE文件中的地址叫做文件偏移地址,即文件在磁盘上存放是相对于文件头的偏移
- VA = ImageBase + RVA
- 默认情况下,一般PE文件的0字节将对映到虚拟内存的0x400000位置,这个地址就是ImageBase
- 文件偏移是相对于文件开始处0字节的偏移,RVA是相对于ImageBase处的偏移。由于操作系统在进行装载时基本上保持PE中的各种数据结构,所以文件偏移地址和RVA有很大的一致性。
- 文件对齐粒度
- 内存对齐粒度
- FileOffset = RVA - Delta = VA - ImageBase - Delta
- 各个节之间的Delta不同,我们把这种由存储单位差异引起的节基址差称作节偏移。
回到可选文件头
- AddressOfEntryPoint 在0xd8处,它一共有4个字节,用来决定程序入口点。
- 我们可以修改它来实现开始时运行任何代码。
-
节表
- 是紧挨着PE Header的一个结构数组
- 每个节均对应着一个节表项
- 节名
- 节在文件和内存中的开始地址
- 长度
- 节属性
-
节
- 可执行文件的核心部分
- PE文件一般有多个节。比较常见的有
- 代码节
- 数据节
- 引入函数节
- 资源节
- 引出函数节
- 重定位节
- 如果正常编译出来,其节信息大致相同,但这些section名字只是方便字节
- VC++ 中用#pragma data_seg() 可以把代码的任意部分编译到PE的任意节中,节名也可以自己定义
- 如果可执行文件经过了加壳处理,PE的节信息就会变得非常古怪。
2.5.4 代码节与数据节
代码节
- 一般名为.text 或 CODE,该节含有程序的可执行代码
- 每个PE文件都有代码节
已初始化的数据节
-
这个节一般名为.data或者DATA。
-
已初始化的数据节放的是在编译时刻就已经确定的数据
比如一些字符串
未初始化的数据节
- .bss
- 这个节里放油未初始化的全局变量和静态变量
2.5.5 引入函数节:PE文件的引入函数机制
- .rdata
- 引入函数:被程序调用但是其执行代码又不在程序中的函数。
- 这些函数位于一个或者多个DLL中,在调用者程序中只保留了函数信息,包括函数名及其驻留的DLL名。
- 动态链接库:例如kernel32.dll, user32.dll, gdi32.dll等。
- 如何从PE文件定位到引入目录表 IDT的起始位置?
- PE可选文件头的DataDirectory
- Import Directory Table
- 引入目录表由一系列的Image_Import_Descriptor结构组成
- 结构的数量取决于程序要使用的DLL文件的数量,每一个结构对应一个DLL文件。
- 在所有这些结构的最后,由一个内容全为0的Image_Import_Descriptor结构作为结束。
- Image_Import_Descriptor结构
- OriginalFirstThunk
- FirstThunk
- Image_Thunk_Data
- Import Name Table
- Import Address Table
- 可以通过可选文件头中的DataDirectory的第13项定位
- 在文件中时,其内容与Import Name Table完全一样
- 在内存中时,每个双字中存放着对应引入函数的地址。
2.5.6 引出函数节
- .edata
- 这时本文件向其他程序提供函数的列表、函数所在的地址及具体代码实现。
- 病毒在感染其他文件时时不能直接调用API函数的
- 因为病毒往其他HOST程序中所写的只是病毒代码节的部分。
- 不能保证HOST程序中一定由病毒所调用的API函数,这样就需要我们自己获取API函数的地址
- 一种方法就是暴力所有法从kernel32模块中获取API函数,这种该方法就充分利用了引出函数节中的数据
- 关键结构:导出目录表
- Image_Export_Directory
- 可以通过 可选文件头 DataDirectory第一项获得。
- 导出地址表
- Export Address Table
- 导出名字表
- Export Name Table
- 导出序号表
- Export Oridinal Table
2.5.7 资源节
- .rsrc
- 这个节放 如图标、对话框等程序要用到的资源
- 资源节是树形结构的,它有一个主目录,主目录下又有子目录,子目录下可以是子目录或者数据,通常有3层目录【资源类型/ 资源标识符/ 资源语言ID】,第四层是具体的资源
- 在病毒感染过程中,如果设计图标替换,则涉及对资源节相关数据的处理
- 三个重要的数据结构
- Image_Resource_Directory
- Image_Resource_Directory_Entry
- Image_Resource_Data_Entry
- 同样通过可选文件头DataDirectory来定位
2.5.8 重定位节
- 重定位节存放了一个重定位表,若装载器不是把程序装到程序编译时默认的基地址时,就需要这个重定位表来做一些调整。
- 重定位以Image_Base_Relocation结构开始。
- 为什么需要重定位?
- PE文件中部分数据时以VA地址存储的,当PE文件无法加载到预期ImageBase时,这些地址需要被修正。
- 由于dll中的需要修正的地址可能很多,所以需要用一张表记录那些写死的地址,将来装载内存时进行一一修正,被称为重定位表,一般每一个PE文件都有一个重定位表。
- Image_Base_Relocation
2.5.9 PE文件执行时的内存布局
- 当PE文件并加载到内存后,内存的版本称为模块【module】
- 加载后的执行作用
- PE装载器首先会为进程分配一个4GB的虚拟地址空间,然后把程序所占用的磁盘空间作为虚拟内存映射到这个4GB的虚拟地址空间。通常,会映射到虚拟地址 空间中的0x400000的位置
- PE装载器在内核中创建进程对象和主进程对象及其他内容
- PE装载器搜索 PE文件中Import Table 引入表,装载应用程序所使用的动态链接库
- PE装载器执行PE文件首部所指定地址处的代码,开始执行应用程序主线程
第三章 恶意软件的原理与防护
3.1 恶意代码及其分类
定义
恶意代码 Malicious Code 或者 MalCode,也称为恶意软件 MalWare。
- 设计目的时用来实现恶意功能的代码或者程序
- 正常软件也会引发安全问题,但绝大多数清空下并非作者有意。
- 恶意代码可能通过软件漏洞、电子邮件、存储媒介或者其他方式植入目标计算机,并随着目标计算机的启动而自动运行
- 恶意代码的主要存在形态时内存代码、可执行程序和动态链接库。
恶意代码攻击目的
- 恶作剧、炫耀
- 经济利益
- 商业竞争
- 政治目的
- 军事目的
恶意代码攻击目标
- 个人计算机
- 服务器
- 移动智能终端
- 智能设备
- 特斯拉汽车
- 智能家居
- 智能手表
- 通信设备
- 路由器
- 交换机
- 安全设备
- 防火墙
- IDS
- IPS
- VDS
- 攻击目标范围
- 定点攻击
- 邮件、IP、域名、QQ号
- 服务器列表、特定人员名单
- 群体性杀伤
- 挂马攻击、钓鱼攻击
- 病毒、蠕虫自动扩散
- 定点攻击
恶意代码的功能
- 获取数据
- 静态数据
- 文件、数据库
- 动态数据
- 口令、内存、计算机网络流量、通信网络数据、可移动存储介质、隔离电脑等
- 静态数据
- 破坏系统
- 数据:删除修改数据
- 系统服务:通用Web服务系统、数据库系统、特定行业服务系统
- 支撑设备:网络设备、线路。
- 动态控制与渗透拓展攻击路径等
- 中间系统
- 相关人员
恶意代码的分类
恶意代码,即广义上的计算机病毒,可以分为
- 计算机病毒、蠕虫
- 木马、后门
- Rootkit
- 僵尸bot
- 流氓软件、间谍软件
- 广告软件、Exploit、黑客工具等。
详细介绍
-
计算机病毒
- 一组能够进行自我传播、需要用户干扰来触发执行的破坏性程序或代码
- CIH、爱虫、美丽莎、新欢乐时光、求职信、恶鹰、rose、威金】熊猫烧香、小浩、机器狗、磁碟机、AV终结者、Flame
- 一组能够进行自我传播、需要用户干扰来触发执行的破坏性程序或代码
-
网络蠕虫
- 一组能够自我传播、不需要用户干预即可触发执行的破坏性程序或者代码+
- 如红色代码、SQL蠕虫王、冲击波、震荡波、急速波、魔波、震网。
-
特洛伊木马
- 是指一类具有正常功能、但实际上隐藏着很多用户不希望功能的程序。通常由控制端和被控制端两端组成
- 冰河、网络神偷、灰鸽子、Gh0st、上兴
- 是指一类具有正常功能、但实际上隐藏着很多用户不希望功能的程序。通常由控制端和被控制端两端组成
-
后门
- 使得攻击可以对系统进行非授权访问的一类后门程序
- Bits, WinEggDrop, Tini
- 使得攻击可以对系统进行非授权访问的一类后门程序
-
Rootkit
- 通过修改现有操作系统软件,使攻击者获得凡哥维纳全并隐藏在计算机中的程序。
- Rootkit, Hkdef, ByShell
- 通过修改现有操作系统软件,使攻击者获得凡哥维纳全并隐藏在计算机中的程序。
-
间谍软件
- 以主动收集用户个人信息、相关机密文件或者隐私数据为主,搜集到的数据会主动传送到指定服务器。
-
广告软件
- 未经用户允许,下载并安装与其他软件捆绑通过弹出式广告或以其他形式进行商业广告宣传的程序
-
流氓软件
- 具有一定的实用价值但是具备电脑病毒和黑客软件的部分特征的软件【特别是难以卸载】
- 他处于合法软件和电脑病毒的灰色地带,同样极大地侵害着电脑用户的权益,也称为灰色软件。
-
Exploit
- 精心设计的用于利用特定漏洞以对目标系统进行控制的程序。
-
黑客工具
- 各类直接或间接用于网络和主机渗透的软件,如各类扫描器,后门植入工具、密码嗅探器、权限提升工具。。。
恶意代码与网络犯罪
情节严重
- 获取支付结算、证券交易、期货交易等网络金融服务的身份认证信息十组以上的。
- 获取第一项以外的身份认证信息五百组以上的。
- 非法控制计算机信息系统二十台以上的。
- 违法所得五千元或者造成经济损失一万元以上的。
- 其他情节严重的情形。
如果是情节特别严重,则数量或者数额达到1~4项的标准5倍以上的。
3.2 Windows PE病毒
什么是PE病毒
- 以Windows PE程序为载体,能寄生于PE文件,或者Windows系统的病毒程序。
什么叫感染
- 在尽量不影响目标程序正常功能的前提下,使其具有病毒自己的功能
何为病毒自己的功能
- 感染模块:被感染程序同样具备感染能力。
- 触发模块:在特定条件下实施相应的病毒功能
- 破坏模块
PE病毒的分类
感染目标类型
- 文件感染
- 将代码寄生在PE文件
- 传统感染型
- 捆绑释放型
- 将代码寄生在PE文件
- 系统感染
- 将代码或程序寄生在Windows操作系统
- 即使通信软件
- U盘、光盘
- 电子邮件
- 网络共享
- 将代码或程序寄生在Windows操作系统
传统文件感染型
感染思路,让PE文件头指向恶意代码,大概是利用AddressofEntryPoint,先执行病毒代码,然后病毒代码执行完毕后再跳转到原程序。
优点
- 被感染后的程序注意依然是目标程序,不影响目标程序图标。隐蔽性稍后。
缺点
- 对病毒代码的编写编写要求较好,通常是汇编语言编写,难以成功感染自校验程序
关键技术
- 重定位
- 病毒代码目标寄生位置不固定
- 病毒程序的重定位不利用重定位节,而是在运行过程中进行自我重定向
- 常见方法
- 将下一条语句开始位置压入堆栈
- JMP到目标地址执行
- API函数自获取
- 需要使用的API函数
- 需要利用DLL文件的引出函数节
- 但无引入函数节支撑
- 需要使用的API函数
- 目标程序遍历搜索
- 全盘搜索或者部分盘符搜索
- 通常以PE文件格式的文件为感染目标
- 在对目标进行搜索时,通常调用两个API函数
- FindFirstFile
- FindNextFile
- 遍历算法:递归或者非递归
- 感染模块
- 病毒代码插入位置选择与写入
- 控制权返回机制
- 感染的关键
- 病毒代码能够运行
- 选择合适的位置 放入病毒代码
- 将控制权交给病毒代码
- 程序的正常功能不能被破坏
- 感染时记录原始的位置
- 病毒代码执行完毕后,返回控制权
- 避免重复感染:感染标记
- 病毒代码能够运行
- 代码插入位置
- 添加新节
- 基本步骤
- 判断目标文件开始的两个字节是否为MZ
- 判断PE文件标记PE
- 判断感染标记,如果已经感染则跳过
- 获得Directory 数据目录的个数
- 得到节表其实位置
- 得到目前最后节表的末尾偏移
- 开始写入节表和病毒节
- 修正文件头信息
- 写入人感染标记
- 碎片式感染
- 插入式感染
- 将病毒代码插入到HOST文件的代码节的中间或者前后
- 这种感染方式会增加代码节的大小,并且可能修改HOST程序中的一些参数的实际位置导致HOST程序运行失败。
- 添加新节
捆绑释放型
- 将HOST作为数据存储在病毒体内
- 当执行病毒程序时,还原并执行HOST文件
- 熊猫烧香病毒
- 优点
- 编写简单、效率高。可感染自校验程序
- 缺点
- 被感染后的程序主体时病毒程序,易被发现【程序叠加+释放执行】,程序目标问题
系统感染型
这类病毒通常为独立个体,不感染系统内的其他文件。
两个关键问题
- 如何再次获得控制权
- 自启动
- 如何传播
- 可移动存储介质
- 网络共享
- 电子邮件或者其他应用
3.3 宏病毒与脚本病毒
宏
- 能组织到一起作为独立命令使用的一系列word命令,可以实现任务执行的自动化,简化日常工作
- Microsoft officef使用Visual Basic for Applications 进行宏的编写。
宏病毒
- 存在于数据文件或者模板中,使用宏语言编写,利用宏语言的功能将自己寄生到其他数据文档。
宏病毒的感染
- 内建宏
- 位于文档中,对文档有效,如文档打开 autoopen,保存,打印。关闭等
- 全局宏
- 位于office模板中,为所有文档所共用,如打开word程序 autoexec
- 传播路线
- 单机
- 单个office文档->office文档模板->多个office文档
- 网络
- 电子邮件居多
- 单机
感染机理
- 让宏在数据文档和文档模板之间相互感染。
- 如何感染
- 自我保护
- 禁止提示信息
- 屏蔽命令菜单,不允许查看宏
- 隐藏宏的真实病毒代码
- 代码导出
- 代码导入
- 自我保护
- 宏病毒也可以在网络进行传播,譬如电子邮件。
什么是VBS
- Visual Basic Script的简称
- 微软环境下的轻量解释型语言,它使用COM组件,WMI、WSH、ADSI访问系统中的元素,对系统进行管理。
- 是ASP Active Server Page 的默认脚本语言。也可以在客户端作为独立程序 .vbs. /vbe运行
VBS的功能
- 高效的管理远程和本地计算机
- 读取及修改环境变量
- 管理注册表、文件系统
- 管理服务、进程、系统账户
- 管理活动目录、
- 进行网络交互(文件上传下载。邮件发送等)
VBS脚本病毒的传播方法
- 用VBS编写,能够进行自我传播的破坏性程序,其需要人工干预触发执行。
VBS病毒如何感染文件
- 通过自我复制来感染文件,病毒中的绝大部分代码都可以直接附加在其他同类程序中。
- 感染网页
- 通过IRC
VBS病毒产生机
- 脚本语言的特点
- 解释执行、不需编译
- 程序无需校验
- 每条语句之间分割清晰
- 模块执行位置不敏感
- VBS病毒产生机
- 病毒功能模块化,供用户进行病毒或参数功能,然后根据配置进行代码组合和参数修改,最后生成。
爱虫病毒
VBS自我保护
- 自变换与加密
- 巧妙运行EXcute函数
- 改变某些对象的声明方法
- 尝试关闭反病毒软件
3.4 网络蠕虫
计算机蠕虫的两个最基本的特征
- 可以从一台计算机移动到另一台计算机
- 可以自我复制
蠕虫的最初目的:分布式计算的模型计算
- 利用网络主机的空闲资源
- 破坏性和不可控性
蠕虫和计算机病毒的重新定义
- Eugene H.Spafford 为了区分蠕虫和病毒,给出了蠕虫和计算机病毒的定义
- 计算机蠕虫可以独立运行,并能把自己的一个包含所有功能的版本传播到另外的计算机上
- 计算机病毒是一段代码,能把自身加到其他程序包括操作系统上,它不能独立运行,需要她的宿主程序运行来激活它。
一些蠕虫
- CodeRed
- 蠕虫王 Slammer
- 可用于信息站的蠕虫——飞客 conficker
网络蠕虫的分类
- 产业通用分类标准
- 漏洞利用类蠕虫-ExploitWorm
- 口令破解类蠕虫-PassWorm
- 邮件传输类蠕虫-MailWorm
- 即时通信类-IMWorm
- P2PWorm, IRCWorm, USBWorm
网络蠕虫的基本功能
- 信息收集
- 对本地或者目标网络进行信息收集,为发现易感染目标提供支持
- 本机系统信息、用户信息、对本机信任或者授权的主机、主机所处网络的拓扑结构、边界路由器
- 扫描探测
- 完成特定目标的脆弱性检测,发现易感染目标
- 影响传播速度的主要因素
- 漏洞主机被发现的速度
- 漏洞主机的总数
- 网络蠕虫对目标的感染速度
- 扫描策略
- 随机扫描
- 选择性扫描
- 顺序扫描
- 基于目标列表的扫描
- 分治扫描
- 基于路由的扫描
- 基于DNS的扫描
- 攻击渗透
- 利用安全漏洞建立目标系统的控制权
- Explot
- 利用安全漏洞建立目标系统的控制权
- 自我推进
- 在本机与目标主机之前完成蠕虫副本的传递
- 文本直接传输
- 搭建Web、FTP、TFTP服务器
- P2P
- 拓展功能
- 取决于攻击者的目的
- 实体隐藏模块
- 宿主破坏模块
- 信息通信模块
- 远程控制模块
- 自动升级模块
蠕虫的检测与防止
蠕虫的传播阶段
- 慢启动期
- 快速传播期
- 慢结束期
- 被清理期
漏洞利用型蠕虫的行为特征
- 特点
- 利用系统、网络应用的服务漏洞
- 主动攻击、无需人为干预
- 速度激起迅猛
- 危害
- 造成网络拥塞
- 降低系统性能
- 产生安全隐患
- 反复性
- 破坏性
检测和防止
- 个人用户
- 即时修补漏洞补丁
- 使用防火墙软件阻断
- 安全防护软件及时更新
- 网络管理者
- 网关阻断
- 补丁下发
- 安全厂商
- 网络流量特征分析与提取
- 网络安全设备快速阻断
- 快速利用客户端安全软件清除蠕虫个体,并进行补丁修补。
- 网络应用厂商
- 应用流量过滤与阻断
- 补丁自动分发与修补
3.5 网络木马
木马
- 通过欺骗或者诱骗的方式安装,并在用户的计算机中隐藏以实现控制用户计算机的目的
- 具有远程控制、信息窃取、破坏等功能的恶意代码
- 特点
- 欺骗性
- 隐藏性
- 非授权性
- 交互性
木马的分类
- 行为视角
- 功能视角
- 远程控制型
- 交互性:双向
- Backdoor
- 冰河、网络渗透、广外女生、网络公牛、黑洞、上兴、彩虹桥、PCShare、灰鸽子
- 信息获取型
- 键盘输入、内存、文件数据
- 交互性:单向
- 发送至第三方空间,文件服务器、指定邮件等,或者直接开启FTP服务程序。
- Trojan-Bank Trojan-GAmeThief Trojan-IM, Trojan-Spy Trojan-PSW Trojan-Malifinder
- 破坏型
- 对本地或者远程主机系统进行数据破坏、资源消耗等。
- 交互性:单项 (攻击者->被控制端)或者无交互
- 典型案例 Trojan-DDos Trojan-Ransom Trojan-ArcBomb Trojan-Downloader Trojan-Dropper
- 远程控制型
木马的植入方式
- 网页挂马植入
- 自动下载安装
- 电子邮件植入
- 附件形式
- 电子邮件和恶意网页相结合,即使不打开附件,选中就会被植入
- 文档捆绑植入
- office文档 pdf文档漏洞
- 伪装欺骗植入
- 更改后缀名 图标伪装
- 捆绑植入
- EXE捆绑、文档嵌入、多媒体文件、电子书植入
- 其他
- 特定U盘植入
- 社会工程
木马的通信方式
- 传输通道构建信息
- IP地址、端口等信息、第三方网站地址
- 建立通信连接的方式
- 正向连接
- 控制端主动连接被控端
- 优点
- 攻击者无需外部IP地址
- 木马样本不会泄露
- 缺点
- 可能会被防火墙阻挡
- 被攻击者必须具备外部IP地址
- 定位被攻击者相对困难
- 被攻击者IP是否变化
- 目标主机何时上线
- 反向连接-1
- 优点
- 通过防火墙相对容易
- 攻击目标随时上线、随时控制
- 可以控制局域网内的目标
- 样本回暴露控制服务器信息
- 域名或者IP
- 攻击者通常应当具备外部IP
- 优点
- 反向连接-2【通过一台肉鸡】
- 优点
- 可绕过防火墙,自动连线上线,不易被发现
- 缺点
- 肉鸡的稳定性需要保障
- 优点
- 正向连接
远程木马的常见功能
-
木马结构
- 完整的而木马一般由木马配置程序、控制端程序和被控制端程序
-
常见功能
- 文件管理
- 进程管理
- 服务管理
- 注册表管理
- 屏幕监控、屏幕截取
- 语音视频截获
- 键盘记录
- 窗口管理
- 远程shell
木马的检测思路
- 静态文件特征
- 网络流量特征
- 系统行为特征
- 功能行为特征
- 攻击意图
3.6 恶意代码检测技术
恶意代码的检测是将检测对象与恶意代码特征【检测标准】进行对比检测,定位病毒程序或者代码。或者检测恶意行为。
检测对象
- 引导扇区
- 具有控制权的引导扇区
- 硬盘主引导扇区
- 硬盘操作系统引导扇区
- 可移动银盘引导扇区
- 检测目标
- 引导扇区病毒、MBR木马
- 具有控制权的引导扇区
- 文件系统中可能带毒的文件
- 可执行文件
- 数据文件
- 脚本文件
- 网页文件
- 内存空间
- 恶意代码在传染和执行时,必然要占有一定的内存空间,部分功能主流在内存中。
- 部分恶意代码仅存在于内存中
- 无文件存在或已经自行删除
- 或被外部动态按需注入
- 部分恶意代码仅在内存中被还原
- 部分恶意代码仅存在于内存中
- 恶意代码在传染和执行时,必然要占有一定的内存空间,部分功能主流在内存中。
- 主板BIOS
- 网络流量、系统行为等。
病毒的检测策略
- 专用检查技术
- 针对某个或者某些特定已知恶意代码
- 反病毒软件必须随着新病毒的不断出现而频繁更新病毒库版本
- 如问及那特征值检测技术
- 通用检测技术
- 针对已知和未知恶意代码
- 广义特征描述或者一般行为特征作为判断依据
- 启发式扫描技术、主动防御技术
特征值检测技术
- 病毒特征值时反病毒软件鉴别特定计算机病毒的一种表示。通常是从病毒样本中存取的一段或者多段字符串或者二进制。
- 具体思路
- 获取样本
- 提取样本特征
- 更新病毒库
- 查杀病毒
- 两个关键
- 特征值的提取
- 特征字符,从病毒体内提取的比如特定的提示信息、特定的签名信息
- 感染标记:病毒为避免重复感染而使用的感染标记
- 提取方法
- 人工提取
- 自动提取
- 特征值的匹配技术
- 模式匹配
- AC算法——有穷自动机的多模式匹配算法
- 特征值的提取
- 优点
- 检测速度快,误报率比较低,为广大反病毒厂商所采用,技术也比较成熟。
- 缺点
- 只能检测已知恶意代码。容易被免杀绕过。
- 恶意软件可能这样来对抗特征值检测技术
- 手动修改自身特征
- 首选利用反病毒软件定位
- 然后,进行针对性修改
- 自动修改自身特征
- 加密、多态、变形
- 手动修改自身特征
校验和检测技术——预期符合性
在文件使用/系统启动过程中,检查检测对象的实际是否和预期一致,因而可以发现文件/引导区是否感染。
预期:正常文件内容和正常引导扇区数据
使用方式
- 系统自动检测
- 专用检测工具
- 自我检测
校验检测对象
- 文件头部
- 文件属性
- 文件内容
- MD5
- CRC
- 系统数据等
优点
- 方法简单
- 能发现未知病毒
- 目标文件的细微变化也能发现
缺点
- 必须预先记录正常文件的校验和
- 误报率高
- 不能识别病毒名称
- 效率低
启发式扫描技术
Heuristic Scanning 实际上就是恶意代码检测经验和知识的软件实现。
可疑的程序代码指令序列
启发式扫描步骤
- 定义通用可疑特征(指令序列或者行为)
- 对上述功能操作将被按照安全和可以的等级进行排序,授以不同的权值。
- 鉴别特征,如果程序的权值总和超过一个事先定义的阈值,则认为“发现病毒”
优点
- 能够发现未知病毒
缺点
- 误报率高
解决方案
- 启发式扫描技术 + 传统扫描技术
- 可提高病毒检测软件的检测率,同时有效降低了总的误报率。
病毒面对启发式扫描技术如何博弈?
- 直接对抗
- Disabled启发式机制
- Disabled反病毒软件
- 绕行
- 那些式启发式特征的特征项
- 是否有其他替代实现方式
虚拟机检测技术
为什么需要虚拟机检测技术
- 加密、多态、变形病毒的出席那
加密病毒
- 真实代码被压缩或者加密,但最终需要在内存中还原
虚拟机检测技术
- 在反病毒系统中设置的一种程序机制,他能在内存中模拟一个小的封闭程序执行环境,所有待查的文件都以解释方式在其中被虚拟执行。
- 通常虚拟执行一小部分代码即可
优点
- 有效处理加密类病毒
- 虚拟机技术+特征值扫描,准确率更高
- 虚拟机技术+启发式扫描,有利于检测未知变形病毒。
主动防御技术
有时也被称为行为监控等技术。
- 动态监视所运行程序调用的api,自动分析程序动作之间的逻辑关系,自动判定程序行为的合法性。
- 监控应用程序的敏感行为,并向用户发出提示,供用户选择。
优点
- 可发现未知恶意软件、可准确地发现未知恶意软件地恶意软件
缺点
- 可能误报警、不能识别恶意软件名称,以及在是实现时有一定难度
3.7 恶意软件样本捕获与分析
恶意软件样本捕获方法
- 蜜罐
- 通常是指未采取安全防范措施并将模拟地程序漏洞主动地保留据在网络中地计算机
- 引诱恶意软件样本来攻击这类蜜罐计算机设备
- 特点
- 与一般计算机不同,其内部运行着多种多样地自我暴露程序和行为记录程序
- 引诱恶意程序在蜜罐内更加充分地运行,并记录下其行为
- 分类
- 被动性蜜罐
- 主动性蜜罐
- 用户上报
- 云查杀平台
- 诱饵邮件
- 有时候你会收到有恶意软件的垃圾邮件
- 样本共享
- 开放社区
恶意软件载体
- 在彻底清除主机内的恶意软件时,需要定位恶意软件的来源、传播方式和存在形式,即载体
- 不同类型的恶意软件有不同的传播方式与存在形式
文件感染型病毒
- 隐藏于BIOS存储区
蠕虫、木马恶意软件
- 和正常软件一样安装进入系统中
- 安装比较隐蔽,多通过漏洞利用直接进入目标主机
宏病毒
- Word、Excel、Powerpoint的模板文件
通过电子邮件传播的恶意软件
- 电子邮件的正文和附件
脚本类恶意代码
- 通过支持脚本的软件的漏洞进行传播
- 触发漏洞的恶意代码藏在脚本中
- 比如浏览器中JS、VBS触发浏览器漏洞,或者通过Flash的ActionScript触发漏洞,然后编码在脚本中的恶意代码
- 通过网页脚本直接传播
- 直接在网页中插入恶意代码
应用程序重打包
- Android APP 被逆向修改后可以再次打包为可运行App的特点。
- 所以以流行App为载体,向其中插入恶意代码后重打包,这种方式是Android恶意代码传播的重要方式
恶意软件样本分析方法
- 在线分析
- 本地静态分析
- 本地动态分析
- 网络交互的动态分析
第四章 软件的漏洞与防护
4.1 软件缺陷与漏洞机理概述
本地程序安全漏洞的本质:代码流程的变化。
任何安全漏洞都是导致程序走到了别的流程上去了,而非设计流程
改变程序执行流程的被黑客入侵实际上没有违反任何编程规则,他仅仅是知道了规则的更多的情况,而且以难以预料的方式使用规则。
安全漏洞是软件bug的一个子集。
安全漏洞
- 软件或者硬件生成过程中出现的bug,该bug在一定条件下会被触发,引起信息安全相关的问题
- 程序中存在的危害本地安全策略的问题或者弱点,大多数指那些会导致程序强制执行一些不同于作者本来意图的行为。
网络攻击为什么容易
- 静态性
- 确定性
- 相似性
攻击类型
- 非法获取访问全新啊
- 权限提升
- 拒绝服务攻击
- 恶意软件植入
- 主动植入
- 被动植入
- 数据丢失或者泄露
安全漏洞的分类
- 内存破坏导致代码执行
- 栈缓冲区溢出
- 堆缓冲区溢出
- 格式串问题
- 其他类型的问题
- 其他安全问题
- 逻辑错误
- 设计错误
- 从用户群体看
- 大众软件漏洞
- 专用软件漏洞
- 作用范围
- 远程漏洞
- 本地漏洞
- 触发条件
- 可主动发起攻击的漏洞
- 只能被动等待的漏洞
- 从数据角度分类
- 能读按理不能读的数据
- 能把指定的内容写入指定的地方
- 输入的数据可以被执行
- 从时序上分类
- 已经发现很久了的
- 刚发现的
- 0day
4.2 典型软件漏洞机理分析
分类
- 缓冲区溢出
- 整形溢出
- 单字节溢出
- 格式化串漏洞
- 覆盖C++虚函数指针
- Web应用程序漏洞
缓冲区溢出
-
C程序并不自动地支持内在的数组边界检查
-
这提高了语言的执行效率,但是可能会造成缓冲区溢出
-
目前缓冲区溢出攻击技术已经相当成熟
-
缓冲区溢出攻击作为网络攻击的 一种形式,占所有系统攻击总数的80%以上。
-
什么是缓冲区
- 内存空间中用于存储程序运行时临时数据的一片大小有限且连续的内存区域。
-
什么是溢出
- 数据过长导致无法存储在预期区域内,覆盖了存储其他数据的区域
-
缓冲区溢出定义
- 当计算机缓冲区内填充数据超过了缓冲区本身的容量,溢出的数据覆盖到了合法数据上。
一些概念
- 内存
- 代码区
- 这个区域存储着被装入执行的二级制机器代码,处理器会被执行到这个区域取指并执行
- 数据区
- 用于存储全局变量
- 堆区
- 进程可以在堆区动态地请求一定大小地内存,并在用完之后归还给堆区。动态分配和回收是堆区地特点。
- 栈区
- 用于动态地存储函数之间地调用关系,以保证被调用函数在返回时恢复到父函数中继续执行。
- 代码区
- 非安全函数
- 内有内嵌边界保护支持,必须要使用额外的代码进行边界检查
- 安全函数
- 可以限制所操作的数据长度,正确使用则不会导缓冲区问题的函数
- 边界检查 Boundary Check
- 在向缓冲区存储数据时,确定数据长度会不会超出缓冲区边界
- 栈不可执行
- 某些CPU支持堆内存是否可执行的标志位。
- 操作系统可以利用该特性在进程初始化时将堆栈设置为不可执行。
缓冲区溢出的分类
- 栈缓冲区溢出 stack overflow
- 溢出发生在栈区
- 覆盖堆栈结构
- 堆缓冲区溢出 heap overflow
- 溢出发生在堆区中
- 覆盖指定的四字节指针
- 类似缓冲区溢出的问题
- 格式串问题
- 覆盖指定的若干指针
- 其他问题
- 格式串问题
系统栈用到的三个寄存器
- ESP 指向当前栈帧的栈顶
- EBP 指向栈底
- EIP 存放下一条等待执行的指令的地址。
- 如果控制了EIP寄存器的内容,就可以劫持进程来执行我们想要执行的命令。
堆和栈的区别
- 堆内存
- 典型用例
- 动态增长的链表等数据结构
- 申请方式
- 需要函数动态申请,通过返回的指针使用
- 释放方式
- 需要专门的函数,比如free
- 管理方式
- 由程序员负责申请与释放,系统自动合并
- 所在位置
- 变化范围很大
- 增长方向
- 从内存低地址向高地址排列
- 典型用例
- 栈内存
- 典型用例
- 函数局部数组
- 申请方式
- 程序内直接申明即可
- 释放方式
- 系统自动回收
- 管理方式
- 由系统完成
- 所在位置
- 一般是 0x0010xxxx
- 增长方向
- 内存高地址向低地址增加
- 典型用例
堆块
- 空闲态
- 堆块被 链入空闲表中,由系统管理
- 占有态
- 堆块会返回一个由程序员定义的句柄,由程序员管理。
整数型溢出
- 不同大小类型的整数不要互相尝试存储
- 对整数的操作要格外注意
- 加和乘的结构不一定使得整数变大
- 减和除不一定使得整数变小。
- 切记:安全函数如memcpy、strncpy的长度参数都是无符号整数
单字节溢出
格式串漏洞
- 可以用%s, %x等查看堆栈中的数据
- %n能把显示的内容的长度写入一个内存地址
- 可以出现多次写内存的机会
覆盖C++虚函数指针
sQL注入
4.3 Windows系统安全机制及漏洞防护技术
-
safe c library
-
standard annotation languages (SAL)
-
栈溢出检查 GS
-
数据执行保护 DEP Data Executaion Prevention
-
ASLR Address space layout randomization 地址空间分布随机化
-
safeseh
-
EMIT enhanced mitigation experience toolkit