软件安全与逆向分析
本文最后更新于 2025年6月20日 晚上
软件安全与逆向分析期末复习总结
第一章 软件安全与逆向分析概述
1.1 软件与逆向分析
软件的定义:根据国家标准GB/T 11457—2006《信息技术 软件工程术语》和美国电气和电子工程师协会(IEEE)1990发布的《软件工程术语标准词汇表》,软件被定义为计算机程序、规则和可能相关的文档。简化来说,软件 = 程序 + 数据 + 文档资料。
- 程序:完成特定功能和满足性能要求的指令序列。
- 数据:程序运行的基础和操作的对象。
- 文档:与程序开发、维护和使用有关的图文资料。
软件的分类:
按功能:
- 系统软件:计算机运行必不可少的部分,与硬件紧密配合,控制和协调计算机系统各部件、相关软件和数据高效工作。
- 支撑软件:协助用户开发软件的工具性软件,包括辅助程序员开发产品和辅助管理人员控制开发进程的工具。
- 应用软件:在特定应用领域内开发,为特定目的服务的软件。
按用户所接触使用的应用软件:Web软件、本地应用程序等。
按规模:微型、小型、中型、大型、甚大型、极大型。
按服务对象的范围:面向客户的项目软件、面向市场的产品软件。
软件逆向工程(Reverse Engineering, R.E.):
定义:指从可运行的程序系统出发,运用反汇编、系统分析、程序理解等多种计算机技术,对软件的结构、流程、算法、代码等进行逆向拆解和分析,推导出软件产品的源代码、设计原理、结构、算法、处理过程、运行方法及相关文档等。
基本思想:从产品到原理(再到产品),与正向工程(从原理到产品)相对。
主要应用:
- 病毒(恶意软件)分析:逆向病毒以获取传播方法、隐藏手段、功能目的,从而遏制传播、根除病毒、溯源定位攻击者。
- 漏洞挖掘、漏洞分析:分析漏洞原理,设计补丁或编写漏洞利用程序。
- 软件破解:破解软件版权保护措施,实现无限制免费使用软件的全部功能。
- 闭源软件的互操作性分析:通过逆向工程技术界定软件行为和接口,开发互操作软件或插件,或进行软件移植。
- 检查编译器的安全性:衡量编译器的正确性和安全性,验证是否符合规范,寻找优化方法,检查是否插入后门。
合法性:软件逆向工程并非总是合法。美国和欧盟有相关法律法规。我国《计算机保护条例》(1991)未直接涉及,但2007年《最高人民法院关于审理不正当竞争民事案件应用法律若干问题的解释》规定通过反向工程获得的商业秘密不认定为侵犯商业秘密行为。合法性限制通常包括:逆向工程人员为合法用户;以互操作为目的,仅对实现互操作必要的部分进行;所需信息不能通过其他途径取得;不能用于开发类似或侵权程序;不得损害权利人正当利益或妨碍程序正常使用。
例题与解析:
题目1:目前对软件通俗的解释为()。
- A、软件=程序+数据+文档资料
- B、软件=程序+方法+规则
- C、软件=程序+数据+方法
- D、软件=程序+数据+规则
- 答案:A。
- 解析:软件的标准定义即为程序、规则和可能相关的文档,或简述为程序、数据和文档资料。
题目2:软件逆向的应用有()(多选)。
- A.软件破解
- B.恶意代码分析
- C.漏洞分析与利用
- D.检查编译器的安全性
- 答案:A、B、C、D。
- 解析:这四个选项都是软件逆向工程的主要应用领域。
题目3:软件逆向工程是根据对软件需求的分析恢复其设计和软件代码的过程。()(判断对错)
- 答案:错。
- 解析:逆向工程是从现有产品到原理,而不是根据需求分析来恢复,那是正向开发过程。
1.2 软件安全的由来
信息化社会中软件的普遍性与价值:软件无处不在,渗透到社会各个角落,承载了越来越大的社会价值,已成为国家和社会关键基础设施的重要组成部分(如铁路、电网、航空、化工)。
信息安全的困境:尽管企业在安全上投入巨资,信息安全问题却日益增多。
软件安全问题成为信息安全焦点的Why?:
软件应用“越来越广泛”:软件相比硬件技术门槛低、研发周期短、可扩展性强。硬件平台趋向通用性,复杂功能更多依赖软件实现(如手机终端、工业控制系统、芯片技术)。
软件自身的原因:
- 互联性(Connectivity):多数计算机和软件系统互联互联网,终端设备的互联使得攻击者无需物理访问即可利用系统弱点。
- 扩展性(Extensibility):软件通过更新或扩展件升级,支持脚本、控件、组件、applet等形式,操作系统和浏览器也支持动态加载。优点是方便扩展新功能,问题在于扩展的功能不可控,带来未知安全风险。
- 复杂性(Complexity):软件系统代码量惊人(如Vista 5000万行代码),系统越复杂,Bug越难避免,质量越难保证,安全风险越多。
黑客攻击方式的进化:黑客可直接利用软件弱点攻击系统。
传统技术的不足:
- 传统安全模式(被动式):侧重保护“边界”,如防火墙隔离、过分依赖加密技术。
- 传统技术无法分辨与正常应用数据混杂在一起的攻击(如XSS、SQL注入、未校验参数)。往往在产品发布后才修复,以补丁方式处理。
- 安全边界已扩展到系统源代码。
传统安全教育的不足:开发人员、测试人员、设计人员逃避安全设计和测试。
新的安全模式:构建安全的系统,设计安全的软件,软件开发和设计人员对安全负责,变被动为主动式。
安全误区:
- “没人会做那样的事”:网络上攻击脚本众多,不应存侥幸心理。
- “为什么有人做那样的事”:为破坏而破坏,网络中存在无数潜在攻击者。
- “我们还没有受到过攻击”:过去不代表未来,应事前预防而非事后修补。
- “我们是安全的,因为使用了密码”:用户易获得错误安全感,安全感与密码强度无关。
- “我们是安全的,因为使用ACL”:坏的ACL导致错误保护。
- “我们是安全的,我们使用了防火墙”:防火墙能控制端口,但不能控制允许端口传输的内容(如HTTP 80端口攻击)。
- “我们检查了代码,没有安全bug”:检查代码的人必须了解攻击者如何攻击软件,安全软件如何构成,以及人们犯了哪些编码错误导致安全漏洞。
- “默认情况下功能是启动状态,但管理员能关闭”:管理员可能不知道如何关闭、关闭影响、没时间或认为系统坚固。
- “如果我们不以管理员身份运行,有些东西不能运行”:应支持最小特权运行。
- “我们需要更好的开发工具”:工具只是辅助,好的编码能力没有替代物。
例题与解析:
题目1:软件自身带来了软件安全问题,其自身的哪些特性导致了软件安全问题?(多选)
- A、扩展性
- B、互联性
- C、复杂性
- D、多样性
- 答案:A、B、C。
- 解析:互联性、扩展性、复杂性是软件自身导致安全问题的主要特性。
1.3 软件安全的概念
软件安全的两个层面:
- 自身的安全:防破解,保护公司利益。
- 用户使用中的安全:保护客户利益。
安全的目的:
- 数据的安全。
- 业务的可持续性。
信息为什么存在安全问题:
- 信息是有价值的。
- 信息是流动的(信源 → 信道 → 信宿)。
软件安全的定义:
- 业界常见定义:软件在敌对攻击(恶意攻击)的情况下仍能继续正常工作(正确运行)及确保软件被在授权范围内合法使用。
- 根本方法:改善建造软件的方式,以建造健壮的软件,使其在遭受恶意攻击时依然能够安全可靠和正确运行。
- 核心思想:采用系统化、规范化、和数量化的方法来指导构建安全的软件。
- Gary McGraw的定义:使软件在受到恶意攻击的情形下依然能够继续正确运行的工程化软件思想。
McGraw博士提出的软件安全工程化的三个支柱(BSI模型):
- 风险管理:一种贯穿软件开发生命周期的战略性方法,关注风险识别和应对措施。
- 软件安全切入点:在软件开发生命周期中保障软件安全的一套最佳实际操作方法,包括代码审核、体系结构风险分析、渗透测试、基于风险的安全测试、安全需求和安全操作。
- 安全知识:强调专业安全知识和经验的汇总,对开发人员进行培训,并融入项目开发。
McGraw博士认为软件安全的知识体系可以分为三大类:
- 描述性知识:包括原则、方针和规则。提供建议,说明在构建安全软件时应该做什么和避免什么。
- 诊断性知识:攻击模式、攻击程序和弱点。帮助操作人员识别和处理导致安全攻击的常见问题。
- 历史知识:包括历史风险,在有些情形下也包括弱点的历史数据库。
软件安全开发模型:
- 核心思想:将安全活动融入到软件开发生命周期中。
- 代表性模型:
- 微软的安全开发生命周期模型(SDL)。
- McGraw的内建安全模型(BSI)。
- 美国国家标准与技术研究院(NIST)的安全开发生命周期模型。
- OWASP提出的综合的轻量级应用安全过程(CLASP) 及 软件保障成熟度模型(SAMM)。
软件安全三大基本属性:
- 保密性:保护软件中敏感信息不被非法获取。
- 完整性:确保软件在传输或存储过程中不被篡改或破坏。
- 可用性:保证软件在正常使用条件下能够完整、及时、准确地提供所需服务。
类似概念:软件可靠性:软件产品在规定的条件下和规定的时间区间完成规定功能的能力。可靠的软件不一定是安全的软件。
例题与解析:
题目1:以下关于软件安全叙述正确的是()(多选)。
- A、采用系统化、规范化、和数量化的方法来指导构建安全的软件。
- B、采取工程的方法使得软件在敌对攻击(恶意攻击)的情况下仍能够继续正常工作(正确运行)
- C、软件安全即是软件可靠性
- D、可靠的软件一定是安全的软件
- 答案:A、B。
- 解析:A和B是软件安全的核心定义。C和D是错误的,软件安全和可靠性是相关但不同的概念,可靠的软件不一定安全。
题目2:软件安全的目的包括()(多选)。
- A、数据的安全
- B、业务的可持续性
- 答案:A、B。
- 解析:保护数据安全和保障业务可持续性是软件安全的两个主要目的。
题目3:在你看来,信息系统存在的安全问题的本质原因是:
- A、信息系统存在漏洞
- B、恶意软件数量急剧增加
- C、信息资产具有价值
- D、信息系统缺乏充分安全测试
- 答案:C。
- 解析:信息之所以存在安全问题,根本原因在于信息本身具有价值。
题目4:Gary McGraw认为软件安全的知识体系可以分为三大类,以下哪个不属于这三大类()。
- A、描述性知识
- B、诊断性知识
- C、历史知识
- D、调试性知识
- 答案:D。
- 解析:McGraw提出的三大类是描述性、诊断性和历史知识。
题目5:描述性知识包括()。
- A、实例、检测和架构
- B、实例、说明和架构
- C、需求描述、安全操作和安全原则
- D、原则、方针和规则
- 答案:D。
- 解析:描述性知识包括原则、方针和规则。
题目6:诊断性知识包括() (多选)。
- A、攻击模式
- B、攻击程序
- C、弱点
- D、原则
- 答案:A、B、C。
- 解析:诊断性知识包括攻击模式、攻击程序和弱点。
1.4 软件安全威胁与来源
信息系统面临的四大典型软件安全威胁:
软件缺陷与漏洞(正常软件):
- 软件缺陷(Defect/Bug):计算机软件或程序中存在的某种破坏正常运行能力的问题、错误,或隐藏的功能缺陷。缺陷的存在会导致软件产品在某种程度上不能满足用户需求。IEEE定义为产品内部的错误或外部功能的失效/远背。
- 漏洞(Vulnerability):软件或硬件设计生产过程中出现的bug,该bug在一定条件下可以被触发,引起信息安全相关的问题。RFC2828定义为系统设计、实现和操作管理中存在的缺陷和弱点,能被利用而违背安全策略。
- Exploit(漏洞利用):指通过程序/系统中的漏洞执行未授权操作的过程。
- Shellcode:传统上是执行shell的代码,现在通常定义一个成功exploit所执行的代码。
- POC(Proof of Concept,概念验证):用于验证特定技术、方法或漏洞可行性的最小化实现方案或演示。核心目的是证明理论、漏洞或设计缺陷在真实环境中确实存在并能被触发/利用。关键特征包括验证性、简化性、非恶意性、形式多样。
- 0 day(零日漏洞):意味着一个漏洞在被公开发布前或当其时,关于它的exploit已经被发布或使用。
- 漏洞的危害:软件正常功能被破坏,系统被非法控制和破坏,信息泄漏等。
恶意软件(Malicious Code/Malware):
- 定义:指那些设计目的是为了实施特定恶意功能的一类软件程序。
- 典型种类:计算机病毒、蠕虫、特洛伊木马、后门、僵尸、间谍软件等。
- 威胁:修改或破坏已有软件功能,窃取目标系统中的重要数据(如数据库、文档、口令),监控目标系统中的用户行为(屏幕、视频、语音),控制目标系统(Shell、屏幕控制、跳板)。
- 案例:Stuxnet(超级工厂病毒)破坏伊朗核电站铀浓缩装置。Flame(火焰)窃取伊朗石油部门商业情报。国家背景的攻击行为日益突出。
非法破解,知识产权被侵害(正常软件):
- 定义:通过对软件自身程序进行逆向分析,剖析软件的注册机制,对软件的各类限制实施破解,从而使得非法使用者可以正常使用软件。是对软件版权和安全的一个重大挑战。
软件后门(正常软件):
- 定义:指软件开发人员有意设计,刻意对用户隐瞒的一些功能,往往这些功能用于软件产品应用之后的一些特殊目的。
- 一些开发者将软件后门设计为软件漏洞的形式。
- 漏洞形式的后门优势:难发现、易利用、难取证。
- 案例:OpenBSD被植入后门(FBI),RSA被要求使用安全强度低的加密算法(NSA)。
例题与解析:
题目1:软件漏洞是指()。
- A、软件缺陷
- B、软件安全性逻辑缺陷
- C、软件功能性逻辑缺陷
- D、可引起信息安全相关问题的软件 bug
- 答案:B、D。
- 解析:漏洞是软件缺陷的一个子集,特指可被利用并导致信息安全问题的bug。
题目2:以下属于信息系统面临的安全威胁的是()(多选)。
- A、软件缺陷与漏洞
- B、恶意软件
- C、非法破解
- D、蠕虫和木马
- E、软件后门
- 答案:A、B、C、D、E。
- 解析:软件缺陷与漏洞、恶意软件、非法破解、软件后门是信息系统面临的四大典型软件安全威胁。
题目3:如果一个正常程序存在可以被人恶意利用的漏洞,则其属于恶意软件。()(判断对错)
- 答案:错。
- 解析:一个正常程序即使有漏洞,其本身也并非恶意软件。恶意软件的设计目的是为了实施恶意功能。
1.5 软件安全防护手段
典型防护手段:
安全设计:强化软件工程思想,将安全问题融入到软件的开发管理流程中,在开发阶段减少缺陷和漏洞数量。
- 微软:信息技术安全开发生命周期流程(Secure Development Lifecycle for Information Technology, SDL-IT)。
- SDL模型:由瀑布模型发展而来,在各阶段增加安全活动和业务目标。
- 敏捷SDL:为快速开发项目(如Web项目)调整,使其能快速利用敏捷开发流程实现安全需求。
保障运行环境:加强系统自身数据完整性校验。
- 软件完整性校验:安装时对系统重要文件进行完整性校验并保存校验值(如卡巴斯基)。
- 系统完整性校验:硬件层面保障系统完整性,如可信计算。
加强软件自身行为认证:软件动态可信认证,确保软件行为总是以预期方式运行。
恶意软件检测与查杀:反病毒软件主要检测外来恶意软件。
- 常用方法:病毒特征值检测、虚拟机、启发式扫描、主动防御、云查杀等。
黑客攻击防护:
- 防火墙:网络、主机防火墙。
- 入侵检测系统(IDS)。
- 入侵防护系统(IPS):基于网络、基于主机(HIPS)。
- 基于主机的漏洞攻击阻断技术:如EMET(Microsoft’s Enhanced Mitigation Experience Toolkit)。
系统还原:将关键系统文件或指定磁盘分区还原为之前的备份状态,清除恶意程序。
- 例如:Windows自带“系统还原”、Ghost、还原卡、影子系统。
虚拟隔离:
- 虚拟机:隔离风险,通过在不同虚拟机中进行活动(上网、游戏、网银等)来隔离危险行为。
沙箱(Sandbox):隔离风险,通常用于运行疑似危险样本或恶意软件分析。
例题与解析:
题目1:微软强化软件工程思想,将安全问题融入到软件的开发管理流程中,在软件开发阶段尽量减少软件缺陷和漏洞的数量,提出了信息技术安全开发生命周期流程,即()。
- A、SDL-IT
- B、可信计算
- C、软件安全
- D、Sandbox
- 答案:A。
- 解析:SDL-IT是微软提出的安全开发生命周期流程。
题目2:以下叙述正确的是()(多选)。
- A、典型的exploit是一个程序,通过使用该程序可以触发一个软件漏洞并被攻击者所利用完成恶意操作。
- B、传统上shellcode是执行shell的代码。现在,shellcode有了更广泛的含义,通常定义一个成功exploit所执行的代码。
- C、不是所有的软件缺陷都是漏洞。
- D、0 day漏洞意味着一个漏洞在被公开发布前或当其时,关于它的exploit已经被发布或使用。
- 答案:A、B、C、D。
- 解析:这四个选项都符合PPT中对exploit、shellcode、软件缺陷和0 day漏洞的定义。
1.6 软件安全与逆向分析工具简介
反编译器&反汇编器:
IDA Pro
(Interactive Disassembler):功能强大的交互式反汇编器。
- 支持数十种CPU指令集(Intel x86, x64, MIPS, PowerPC, ARM等)。
- 支持不同格式的可执行文件(PE, ELF, Mac可执行文件, ARM可执行文件等)。
- 可生成C-like伪代码辅助逆向工程(F5快捷键)。
Hopper。
Jad, uncompyle2 (解释型语言)。
调试器(Debugger):让软件开发人员在程序运行的同时观察程序的运行过程和状态,基本功能是设置断点和代码跟踪。
- 分为用户模式和内核模式调试器。
- OllyDbg:用户模式调试器,内置强大反汇编器,有强大的代码分析能力(识别循环、switch等)。
- x64dbg:支持32位和64位程序调试。
- WinDbg:Microsoft提供的免费调试器,反汇编能力有限,但操作系统集成性强,可提供大量内部系统数据结构信息。支持内核模块调试,对大文件调试支持较好。
- SoftICE:内核模式调试器。建议在虚拟机上使用内核模式调试器。
- Hiew。
- Immunity Debugger:与OllyDbg相似,提供Python扩展。
系统监测工具:显示操作系统收集到的有关应用程序及其环境的信息,可监控网络活动、文件访问、注册表访问等。
Windows Sysinternals Suite:一套针对Windows系统的监控、分析工具。
- 包含ProcessMonitor(监控文件和注册表活动)。
ProcessExplorer(显示进程、DLLs、对象句柄、网络连接、CPU/内存使用)。
- Autoruns(显示开机启动项、系统服务、驱动等)。
- FileMon(监控文件系统级通信)。
- RegMon(监控注册表活动)。
- TCPView(监控进程的所有活动TCP和UDP网络连接)。
- Portmon(物理端口监听器,监控并行和串行I/O通信)。
Wireshark:网络数据包分析工具。
修补和转储工具/文件原始数据分析:
- 修补工具:修改二进制可执行代码以改变其行为,常与软件破解相关。
- Hex Workshop:十六进制修补和转储工具。
- UltraEdit。
- WinHex。
- 010Editor。
- PEview:免费的可执行程序转储工具,图形化界面。
- Stud PE。
例题与解析:
题目1:以下哪个软件可以用于动态调试()(多选)?
- A、PEView
- B、X64dbg
- C、Ollydbg
- D、UltraEdit
- 答案:B、C。
- 解析:X64dbg和Ollydbg是常用的动态调试器。PEView是转储工具,UltraEdit是文件原始数据分析工具。
第二章 软件安全与逆向分析基础
2.1 基础知识
微型计算机的系统组成:包括CPU、主存储器、I/O接口、系统总线、寄存器、控制器、运算器、辅助存储器、输入设备、输出设备。
CPU:
- Intel 80x86系列微处理器发展历程:16位80x86处理器(8086/8088/80186/80188/80286)、IA-32处理器(80386/80486/Pentium系列)、Intel 64处理器(酷睿多核系列)。
- 8086工作方式:实方式。80286引入保护方式。80386引入32位指令集ISA,提供虚拟8086工作方式。
- Intel 64引入64位指令集结构,兼容32位,新增64位工作方式,丰富多媒体指令,集成多核技术。
存储器:
- CPU的核心,指令和数据在存储器中存放。
- 磁盘上的数据或程序必须读到内存中才能被CPU使用。
- 指令和数据:在内存或磁盘上,指令和数据没有任何区别,都是二进制信息。安全问题:用户输入的数据当作指令执行。
数据在机器内的表示:
数制:
- 二进制数:由0和1组成,基数为2。
- 十六进制数:基数16,0-9及A-F组成,常用于表达二进制数。
- 十进制与其他进制转换:整数部分用除法,小数部分用乘法。
数据表示:所有计算机数据(整数、浮点数、字符、图像、音频)最终都以二进制形式存储和处理。
字符:ASCII,Unicode。
图像和视频:二进制表示像素颜色、亮度。
浮点数:IEEE 754标准表示(符号位、指数位、尾数位)。
整数:
- 无符号数:只能表示非负数(纯二进制)。
- 带符号整数(正负数):用原码、反码、补码表示。补码是现代计算机中广泛使用的表示负数的方式,因为它支持高效的加法和减法运算。在计算机中,有符号整数都以补码的形式存储。
数据信息的表达单位:
- 二进制位(Bit):存储一位二进制数(0或1)。
- 字节(Byte):8个二进制位(D7~D0)。
- 字(Word):16位,2个字节(D15~D0)。
- 双字(DWord):32位,4个字节(D31~D0)。
- 四字(QWORD):64位,8个字节(D63~D0)。
- 最低有效位(LSB):D0位。最高有效位(MSB):D7/D15/D31/D63位。
存储单元:
存储器被划分为若干个存储单元,每个单元存放一个字节量的数据。
每个存储单元有唯一的编号(地址),从0开始顺序编号。
容量单位:1KB=1024B,1MB=1024KB,1GB=1024MB,1TB=1024GB。
多字节数据存放方式:
- 多字节数据在存储器中占连续的多个存储单元。
- 大端方式(Big Endian):高字节存入低地址。
- 小端方式(Little Endian):低字节存入低地址,高字节存入高地址。80x86处理器采用“低对低、高对高”的小端方式。
- 用低地址表示多字节数据占据的地址空间。
CPU对存储器的读写:
CPU与外部器件交互三类信息:存储单元的地址(地址信息)、器件的选择和读写命令(控制信息)、读写数据(数据信息)。
通过总线传送电信号:
- 地址总线:决定CPU的寻址能力。
- 数据总线:决定CPU与其它器件进行数据传送时的一次数据传送量。
- 控制总线:决定CPU对外部器件的控制能力。
内存地址空间:CPU可以寻到的内存单元构成其内存地址空间。
- 所有物理存储器被看作一个由若干存储单元组成的逻辑存储器。
- 对CPU来讲,系统中所有存储器中的存储单元都处于一个统一的逻辑存储器中,容量受CPU寻址能力限制。
主板:PC机核心,器件通过总线相连。
接口卡:CPU通过接口卡控制外部设备。
各类存储器芯片:RAM(随机存储器)、ROM(只读存储器,装有BIOS)。
- BIOS(Basic Input/Output System):由主板和接口卡厂商提供,用于最基本的输入输出。
2.2 系统引导与控制权
系统引导与恶意软件关系:恶意软件植入系统后,会在计算机系统引导阶段、操作系统启动阶段或应用程序执行阶段获得控制权。
- Bootkit:在计算机系统引导阶段获得控制权(如BIOS木马、MBR木马、早期DOS引导区病毒等)。
- 操作系统启动阶段:最常见的恶意软件启动方法,多见于独立的恶意软件程序。
- 应用程序执行阶段:最常见的文件感染型病毒启动方法。
BIOS引导模式:
- 传统BIOS模式:开发效率低,性能差,扩展性差。
- UEFI(Unified Extensible Firmware Interface):统一可扩展固件接口,类似于低阶操作系统,支持GPT分区,速度快,Win8后普遍采用。
计算机引导过程(传统BIOS引导模式):
BIOS自检与初始化工作:检测关键设备,初始化,显示启动画面,检测CPU/内存/硬件,根据启动顺序,若从硬盘启动则将控制权交给硬盘主引导程序。
硬盘主引导程序:位于MBR(Master Boot Record),即硬盘第一个扇区。主要功能是定位活动分区,装载活动分区的引导程序,并移交控制权。
活动分区引导程序:位于DBR(DOS Boot Record),或称OBR/PBR,即分区的第一个扇区。功能是加载操作系统引导程序(如Windows XP的NTLDR,Windows Vista及以后的BOOTMGR)。
操作系统引导(以Windows NTLDR为例):
将处理器从16位内存模式拓展为32位(64位)。
启动小型文件系统驱动,识别FAT32和NTFS。
读取boot.ini,进行多操作系统选择。
检测和配置硬件(NTDETECT.COM)。
系统内核加载:NTLDR加载内核程序NTOSKRNL.EXE及HAL.dll,读取HKEY_LOCAL_MACHINE,并将控制权传递给NTOSKRNL.EXE,引导过程结束。
Windows系统装载:创建系统环境变量,启动win32.sys(内核模式)、csrss.exe(用户模式)、winlogon.exe等。
Windows登陆阶段:启动自启动Windows服务,启动本地安全认证Lsass.exe,显示登录界面。
Windows登陆之后:系统启动当前用户环境下的自启动项程序(注册表特定键值、特定目录),用户触发和执行各类应用程序。
例题与解析:
题目1:以下哪一类恶意软件是在应用程序执行阶段获得控制权?
- A 文件感染型病毒
- B BIOS木马
- C MBR木马
- D DOS引导区病毒
- 答案:A。
- 解析:文件感染型病毒通常在宿主程序运行时获得控制权。B、C、D都属于在系统引导阶段获得控制权。
题目2:以下关于计算机Windows系统引导过程的顺序,正确的是?
- A、MBR ->BIOS ->DBR ->NTLDR(BOOTMGR)
- B、MBR->DBR->NTLDR(BOOTMGR)->BIOS
- C、BIOS -> MBR ->DBR ->NTLDR(BOOTMGR)
- D、BIOS ->NTLDR(BOOTMGR)->DBR->MBR
- 答案:C。
- 解析:正确的引导顺序是BIOS自检,然后是硬盘的MBR,MBR找到活动分区的DBR,DBR再加载操作系统的引导程序(NTLDR/BOOTMGR)。
题目3:电脑被感染计算机病毒之后,通过更换硬盘可以彻底防止任何病毒再生。()(判断对错)
- A.正确
- B.错误
- 答案:B。
- 解析:虽然更换硬盘可以清除大部分病毒,但有些病毒(如BIOS木马)可能存在于主板BIOS芯片中,更换硬盘无法彻底清除。
2.3 磁盘物理与逻辑结构
硬盘:控制代码的静态存储仓库,系统引导代码、各类程序与数据、恶意软件进行控制权争夺的中心。
硬盘的物理结构:接口(电源+数据)、硬盘控制电路、固定面板、盘片、磁头、盘片主轴、控制电机、磁头控制器、数据转换器等。
硬盘的逻辑结构:
寻址方式:
CHS(Cylinder/Head/Sector)参数寻址:柱面(Cylinders)、磁头(Headers)、扇区(Sector)。
- 取值范围:磁头数0-255(8位),柱面数0-1023(10位),扇区数1-63(6位),通常每个扇区512字节。最大容量为8.4GB。
老式硬盘:每个磁道的扇区数相等。
线性逻辑块寻址(LBA,Logical Block Address):当前硬盘采用“等密度结构”,以扇区为单位进行线性寻址。
总体结构:
MBR分区:
主引导扇区:位于整个硬盘的0柱面0磁头1扇区(硬盘的第一个扇区)。
- MBR引导程序:占前446个字节。
DPT(硬盘分区表)。
结束标志:最后的两个字节“55AA”。
DPT(硬盘分区表):描述各分区的基本信息,如分区开始位置、总扇区数、分区类型等。分区类型码:07-NTFS、0B-FAT32、EE-GPT分区等。
扩展分区:一个物理盘只有一个扩展分区,扩展分区可以包含多个逻辑驱动器。扩展分区表有四个分区项,但通常只会使用到前面两项。
GPT分区(GUID Partition Table):
- 为什么使用GPT分区:解决MBR分区限制,如超过四个主分区,或单分区容量大于2TB(MBR最大2TB)。
LBA0-Protective MBR、LBA1-GPT头、LBA2-GPT分区表项。
Windows常见分区类型:FAT32、NTFS。
例题与解析:
题目1:以下哪个扇区不包含可执行代码?
- A、磁盘主引导扇区(MBR)
- B、硬盘主分区表所在扇区
- C、扩展分区表所在扇区(EBR)
- D、操作系统引导扇区(DBR)
- 答案:C。
题目2:扩展分区表有四个分区项,但通常只会使用到前面两项。()(判断对错)
- A、对
- B、错
- 答案:A。
解析:PPT原文如此描述。
题目3:在MBR分区格式下,一个分区大小不能超过______TB。
- A.1
- B.2
- C.4
- D.8
- 答案:B。
解析:CHS寻址最大容量约8.4GB。MBR分区的逻辑块寻址(LBA)使用32位扇区地址,每个扇区通常512字节,因此最大容量为 2^32 * 512 Bytes = 2TB。
题目4:硬盘主引导扇区最后两个字节必须以“55AA”作为结束。()(判断对错)
- A、对
- B、错
- 答案:A。
解析:这是MBR的结束标志。
题目5:硬盘中线性逻辑寻址方式(LBA)的寻址单位是?
- A、扇区
- B、磁道
- C、柱面
- D、磁头
- 答案:A。
- 解析:LBA寻址以扇区为单位。
2.4 FAT32文件系统
概念1:簇(Cluster):
- 文件系统将磁盘空间以一定数目(2^n,n为整数)的扇区为单位进行划分,这样的单位称为簇。
- 每扇区大小为512字节。
- 簇的大小一般是512B、1KB、2KB、4KB、8KB、16KB、32KB、64KB等。
- 簇是进行文件空间分配的最小单位。
概念2:FAT表(File Allocation Table,文件分配表):
- Microsoft在FAT文件系统中用于磁盘数据(文件)索引和定位的一种单向链式结构。
- FAT区用每一个FAT项来记录每一个簇的占用情况。
- FAT表中表项的个数=簇的个数。
- FAT表按顺序依次记录了该盘各簇的使用情况。
- 如果为0,则表示对应簇空闲,可存储数据。
- FAT32系统的FAT表项占用32位(4字节),可表达的最大簇号空间为4G。
- FFFFFF0F表示最后一簇的结束标识。
概念3:簇链:一个文件所占用簇的序号形成的单向链表。
文件的存储:文件内容存储在数据区。
目录项:存储文件信息(如文件名、大小、首簇号等)。
文件删除:
- 目录项:文件名首字节被修改为E5,首簇高位被清零。
- FAT表簇链:被全部清空。
- 文件内容:无变化。
被删除文件的恢复机理:确定高位并还原(参考相邻目录项或试探),修复FAT表簇链(通过文件大小计算簇数,按照连续存储假设修补)。重要提示:重要文件被删除后,不得对分区继续进行写操作,否则可能造成被删除文件被覆盖导致无法恢复。
例题与解析:
题目1:如果某个簇对应的FAT表项中的值为0,则说明:
- A、该簇为坏簇
- B、该簇为空闲簇
- C、该簇为结束簇
- D、该簇为已被占用簇
- 答案:B。
- 解析:FAT表项值为0表示簇空闲。
题目2:数据存储区中每一个簇是否被占用的标志存储在什么位置?
- A、引导扇区部分
- B、FAT区
- C、数据存储区的目录项
- D、数据存储区的文件区
- 答案:B。
- 解析:FAT表记录每个簇的占用情况。
题目3:FAT32文件系统进行文件空间分配的最小单位是簇,一个簇通常包含多个扇区。()(判断对错)
- A、错
- B、对
- 答案:B。
- 解析:簇是最小分配单位,由一定数目扇区组成。
题目4:当文件被误删除之后,不应继续往该文件所在的分区继续写入数据,否则可能造成被删除的文件被覆盖导致无法恢复。()(判断对错)
- A、对
- B、错
- 答案:A。
- 解析:写入新数据会覆盖被删除文件的内容,导致无法恢复。
题目5:在FAT32分区下,当文件通过Shift+Del的方式删除之后,以下哪个部分将发生变化?
- A.目录项中的文件名首字节,首簇高位,文件对应的FAT表项,以及文件内容
- B.目录项中的文件名首字节,首簇高位,以及文件对应的FAT表项
- C.仅目录项中的文件名首字节和文件对应的FAT表项
- D.仅首簇高位和文件对应的FAT表项
- 答案:B。
- 解析:Shift+Del删除文件时,文件内容不变,但目录项和FAT表会被修改。
题目6:在FAT32分区下,当文件被放入回收站之后,该文件目录项中的以下哪部分数据将发生变化?
- A:首簇高位
- B:文件名的第一个字节
- C:首簇低位
- D:文件大小
- 答案:B。
- 解析:放入回收站时,文件名的第一个字节会被修改,表示其被移动到回收站,以便恢复时知道原文件名(通常会变成一个特殊字符,如
_
或$
),而不是直接清空或修改簇信息。
题目7:FAT32文件系统的引导扇区是整个磁盘的第一个扇区。()(判断对错)
- A、错
- B、对
- 答案:A。
- 解析:整个磁盘的第一个扇区是MBR。FAT32文件系统的引导扇区是该分区的第一个扇区 (DBR)。
2.5 汇编与反汇编
汇编语言概览:
汇编语言的组成:
- 汇编指令(硬指令):机器码的助记符,有对应的机器码。
- 伪指令:由汇编程序执行,没有对应的机器码,不产生CPU动作,在程序执行前由汇编程序处理的说明性语句(如数据说明、变量定义等)。与处理器类型无关,但与汇编程序版本有关。
- 其他符号:由汇编程序识别,没有对应的机器码。
汇编语言的核心是汇编指令,它决定了汇编语言的特性。
可执行文件:包含程序(机器码)和数据,以及相关的描述信息(如程序大小、内存空间需求等)。
指令的组成:由操作码和操作数两部分组成。
- 操作码:说明计算机要执行哪种操作,不可缺少,对应机器指令的二进制编码。
- 操作数:指令执行的参与者(操作对象),可以是数值、寄存器或存储数据。
寄存器(Register):
定义:CPU内部用于暂时存放数据、指令、地址等信息的存储单元。
分类:
- 通用寄存器:用于存放一般性数据。
- 专用寄存器:段寄存器、指令指针寄存器、标志寄存器等。
寄存器的大小:通常与CPU的位数相关。32位x86架构中一般为32位(4字节),64位x86-64架构中一般为64位(8字节)。
8086 CPU寄存器(16位):共14个。
通用寄存器:AX、BX、CX、DX。每个16位寄存器可存储一个16位数据。可分为两个独立的8位寄存器(如AX可分为AH和AL)。
段寄存器:CS、SS、DS、ES。
- CS(Code Segment):代码段寄存器,存储指令的基址。
- DS(Data Segment):数据段寄存器,存储数据段的基址。
- SS(Stack Segment):堆栈段寄存器,存储堆栈的基址。
- ES(Extra Segment):附加段寄存器,用于字符串操作,通常也存放数据。
SI、DI、SP、BP、IP、FLAG。
32位x86 (IA-32)处理器寄存器:
通用寄存器:EAX(累加,结果/返回值)、EBX(基址)、ECX(计数,循环/移位,stdcall/fastcall参数,this指针)、EDX(数据,乘除结果/I/O)、ESI(源索引)、EDI(目的索引)、EBP(基指针,栈帧基址)、ESP(堆栈指针,栈顶)。
EIP(Extended Instruction Pointer):指令指针寄存器,指向CPU正在执行的下一条指令的内存地址。EIP只存在于CPU中,没有汇编指令能够直接修改它。在64位架构中为RIP。
EFLAGS:标志寄存器,存储状态标志(CF, PF, AF, ZF, SF, OF, DF, IF, TF)。
FS和GS:扩展段寄存器,用于操作系统和多任务管理。
在Windows操作系统中,FS寄存器用于指向线程的线程环境块(TEB)。
- TEB(Thread Environment
Block):为每个线程分配的数据结构,存储线程相关信息(局部存储、异常处理、TLS、栈指针等)。每个线程通过
fs:
获取指向其TEB的指针。
- TEB(Thread Environment
Block):为每个线程分配的数据结构,存储线程相关信息(局部存储、异常处理、TLS、栈指针等)。每个线程通过
PEB(Process Environment Block):存储与进程相关的信息(启动参数、模块信息、内存布局等),可通过FS寄存器访问。
SEH(Structured Exception Handling):结构化异常处理,存储在TEB中,FS寄存器可访问。
64位x86-64架构通用寄存器:RAX, RBX, RCX, RDX, RSI, RDI, RBP, RSP(64位扩展版本),新增R8到R15.
物理地址和逻辑地址:
物理地址:每个物理存储单元有一个唯一的20位编号(8086CPU寻址能力1M,00000H~FFFFFH)。
逻辑地址:用户编程时采用的地址,由段地址:段内偏移地址组成。
8086 CPU给出物理地址的方法:采用内部用两个16位地址合成一个20位物理地址的方法。物理地址 = 段地址 × 16 + 偏移地址。
段的概念:内存并没有分段,段的划分来自于CPU寻址方式,可以根据需要将若干地址连续的内存单元看作一个段。
- 段地址×16必然是16的倍数,所以段起始地址是16的倍数。
- 偏移地址为16位,寻址能力64K,所以一个段长度最大为64K。
- CPU可以用不同的段地址和偏移地址形成同一个物理地址。
CS和IP:CS和IP是8086CPU中最关键的寄存器,它们指示了CPU当前要读取指令的地址。
- 8086PC启动时,CS=FFFFH,IP=0000H,从FFFF0H单元读取指令。
CPU将CS:IP指向的内存单元中的内容看作指令。
- 8086PC工作过程:从CS:IP读取指令 -> IP=IP+指令长度 -> 执行指令。
修改CS、IP的指令:
jmp 段地址:偏移地址
(同时修改CS和IP),jmp 寄存器
(只修改IP)。mov
指令不能直接修改CS、IP。
栈:
- 数据结构:遵循先进后出(LIFO)原则。
- 基本操作:入栈(PUSH,将新元素放到栈顶),出栈(POP,从栈顶取元素)。
- SS和SP:SS存放栈顶的段地址,SP存放栈顶的偏移地址。任意时刻,SS:SP指向栈顶元素。
- PUSH指令执行过程:1) SP=SP-2(字)/SP-4(双字);2) 将源操作数送入SS:SP指向的内存单元。
- POP指令执行过程:1) 将SS:SP指向的数据送入目的操作数;2) SP=SP+2(字)/SP+4(双字)。
- 栈顶超界:当栈满时再入栈,或栈空时再出栈,会发生超界。8086CPU不保证栈操作不超界,程序员需自己管理栈空间大小。
- 栈段:将一段内存定义为栈来使用。如何使栈操作指令访问栈段:将SS:SP指向栈段。一个栈段最大容量为64KB。
DS和[address]:DS寄存器通常存放要访问的数据的段地址。
- 段前缀:
ds:
,cs:
,ss:
,es:
等用于显式指明内存单元的段地址。 - 默认段和段超越:绝大部分数据访问在DS段,访问堆栈数据在SS段,读取指令在CS段。
- 段前缀:
指令要处理的数据有多长?:
- 通过寄存器名指明:如AX(字操作),AL(字节操作)。
- 通过操作符X
ptr指明:在没有寄存器名存在的情况下,用
word ptr
(字)、byte ptr
(字节)、dword ptr
(双字)显性指明内存单元长度。
段的综述:内存中的一段区域可以是代码段、数据段、栈段,甚至三者重叠。关键在于CPU中寄存器(CS, IP, SS, SP, DS)的设置。
Windows内存结构与管理:
Windows的内存可以被分为两个层面:物理内存和虚拟内存。
物理内存:需要进入Windows内核级别Ring 0才能看到。
虚拟内存:通常在用户模式下调试器看到的内存是虚拟内存。
- 应用程序不会直接访问物理地址,由虚拟内存管理器控制所有的物理地址访问。
- 每个应用程序都有独立的4GB寻址空间(32位系统),彼此隔离。
- DLL程序没有“私有”空间,被映射到其他应用程序地址空间。
CPU特权级与内存访问:Windows将处理器存取模式划分为用户模式(Ring 3)和内核模式(Ring 0)。
- 用户应用程序运行在用户模式,访问空间局限于用户区。
操作系统内核代码运行在内核模式,可以访问所有内存空间和硬件。
提权漏洞:把权限从用户态提升到内核态的漏洞。
内存页面权限管理:通过页表项(PTE, PDE)中的U/S位(User/Supervisor)控制用户/内核空间代码和数据权限。
CR3寄存器:指向页目录基地址的物理地址,也称页目录基地址寄存器(PDBR)。
PAE(Physical Address Extension):为了提高处理器寻址能力,将物理地址扩展至36位(64GB),引入三级分页机制。
80x86处理器的工作模式:
实模式(Real Mode):
- 80x86处理器在复位或加电时以实模式启动。
- 寻址方式:20位寻址,1M空间(0x00000到0xFFFFF)。
- 逻辑地址直接计算为物理地址,不存在虚拟地址概念。
- 不能对内存进行分页管理,不支持优先级,所有指令相当于工作在特权级0。
- 用途:早期DOS、BIOS初始化阶段、Bootloader的初始代码。
保护模式(Protected Mode):
- 80x86处理器的常态工作模式。
- 32位处理器支持32位寻址,物理寻址空间达4G(实际PAE扩展至64GB)。
- 支持内存分页机制,提供了对虚拟内存的良好支持。
- 支持优先级机制,运行环境隔离。
- 分段机制:逻辑地址(段选择符+32位偏移)→线性地址。段选择符指向GDT/LDT中的段描述符,获取段基址、限长和权限。
- 平坦模型(Flat Model):现代操作系统(如Linux、Windows)在保护模式下通常将段基址设为0,段限长为最大值(0xFFFFFFFF),禁用分段的内存保护,完全依赖分页机制实现隔离。
- 若禁用分页,线性地址=物理地址。
虚拟8086模式(Virtual 8086 Mode):
- 为了在保护模式下兼容8086程序而设置。
- 以任务形式在保护模式上执行,支持多个真正的80x86任务和虚拟8086模式任务。
- 支持任务切换和内存分页。
X86-64处理器的工作模式:新增长模式(Long Mode),分为64位模式和兼容模式。
- 64位模式:寄存器扩展为64位,支持64位地址空间。段式管理简化(段基址通常为0),依赖分页机制。四级分页(PML4→PDPT→PD→PT→页内偏移)。
- 兼容模式:在64位操作系统下直接运行32/16位程序,程序仍受32位地址空间约束。
汇编语言源程序格式:
简化段定义格式:使用
.model small
,.stack
,.data
,.code
等伪指令。完整段定义格式:使用
SEGMENT
和ENDS
定义逻辑段的开始和结束,ASSUME
通知汇编器段寄存器与逻辑段的缺省关系,END
指示汇编过程结束。常量:
- 常数:直接给出数值(十、十六、二进制),十六进制数以字母开头需加前导0(如
0AH
)。
- 常数:直接给出数值(十、十六、二进制),十六进制数以字母开头需加前导0(如
字符和字符串:单引号或双引号括起,数值是对应的ASCII码值。
- 符号常量:用
=
或EQU
定义,使用标识符表达数值。 - 数值表达式:用运算符连接各种常量构成的算式。
- 符号常量:用
变量定义:
变量名:用户标识符,表示变量的首元素逻辑地址。
伪指令:
BYTE
(db):定义字节量(8位)数据,分配一个或多个字节单元。WORD
(dw):定义字量(16位)数据,分配一个或多个字单元。DWORD
(dd):定义双字量(32位)数据,分配一个或多个双字单元。初值表:用逗号分隔的一个或多个参数。
?
:表示变量无初值,只保留存储空间。DUP()
:复制操作符,定义多个相同数据。
变量属性:
地址属性:首个变量所在存储单元的逻辑地址。
- 地址操作符:
[]
(括起的表达式作为存储器地址指针),$
(返回当前偏移地址),OFFSET 变量名
(返回变量名所在段的偏移地址),SEG 变量名
(返回段基地址)。
- 地址操作符:
类型属性:变量定义的数据单位。
- 类型操作符:
TYPE 变量名
(返回变量类型值:字节1/字2/双字4),LENGTHOF 变量名
(返回整个变量的数据项数),SIZEOF 变量名
(返回整个变量占用的字节数),类型名 PTR 变量名
(将变量名按照指定的类型使用)。
- 类型操作符:
数据寻址:
寻址方式:寻找有效地址的方法,即操作数在哪里。
数据寻址:指令执行过程中,访问所需操作数据。
分类:
立即数寻址:操作数紧跟操作码,是机器代码的一部分。操作数从指令代码中得到(即立即数)。只用于源操作数。
寄存器寻址:操作数存放在处理器的内部寄存器中。用寄存器名表示其内容。简单快捷,最常使用。
存储器寻址:操作数在主存中,通过存储器地址指示。指令代码表达形式地址,结合规则计算得到有效地址(EA)。处理器将EA转换为物理地址访问存储单元。
- 有效地址EA = 基址寄存器 + 变址寄存器 × 比例 + 位移量。
直接寻址:有效地址只有位移量部分,直接包含在指令代码中。用变量名(或加中括号)表示偏移地址。
寄存器间接寻址:有效地址通过寄存器提供。方便对数组元素或字符串字符操作。操作数本身没有类型,由另一操作数类型决定。
寄存器相对寻址:有效地址是寄存器内容与位移量之和。方便对数组元素或字符串字符操作。位移量是数字常量,操作数没有类型。
指令:
数据传送类指令:将数据从一个位置传送到另一个位置,计算机中最基本操作。
MOV
:传送指令,不影响状态标志。PUSH
:进栈指令。先将ESP减小(ESP=ESP-2/4),后将源操作数传送到当前栈顶。POP
:出栈指令。先将栈顶数据传送到目的操作数,后ESP增加(ESP=ESP+2/4)作为当前栈顶。LEA
(Load Effective Address):地址传送指令,功能是把存储器操作数的有效地址传送到目的位置。在指令执行时计算出偏移地址,可进行加和移位操作。与OFFSET操作符作用类似但不同。
状态标志(Flag):
- EFLAGS寄存器:存储状态标志。
- 进位标志CF(Carry Flag):当加减运算结果最高有效位有进位(加法)或借位(减法)时置1,否则置0。针对无符号整数。
- 溢出标志OF(Overflow Flag):有符号数加减结果有溢出时置1,否则置0。针对有符号整数。
- 零标志ZF(Zero Flag):运算结果为0时置1,否则置0。
- 符号标志SF(Sign Flag):运算结果最高位(符号位)为1时置1(负数),否则置0(正数)。
- 奇偶标志PF(Parity Flag):运算结果最低字节中“1”的个数为零或偶数时置1,否则置0。
- 影响状态标志的指令:加减运算、逻辑运算、移位指令、比较指令
CMP
、测试指令TEST
。
算术运算类指令:
INC
(increment):对操作数加1,不影响进位CF标志。DEC
(decrement):对操作数减1,不影响进位CF标志。
位操作类指令:
- 逻辑运算指令:
AND
、OR
、NOT
、XOR
、TEST
。除NOT
外,其他逻辑指令使OF=CF=0,并根据结果影响ZF、SF、PF。 - 移位指令:
SHL
(逻辑左移)、SHR
(逻辑右移)、SAL
(算术左移)、SAR
(算术右移)。 - 循环移位指令:
ROL
、ROR
、RCL
、RCR
。
- 逻辑运算指令:
转移指令(控制转移指令):
无条件转移指令(
JMP
):程序转向指定地址。条件转移指令(
Jcc
):根据指定条件确定程序是否发生转移。条件满足则转移,否则顺序执行。用于实现分支、循环结构。- 基于单个标志状态:
JZ
/JE
(ZF=1)、JNZ
/JNE
(ZF=0);JC
(CF=1)、JNC
(CF=0);JO
(OF=1)、JNO
(OF=0);JS
(SF=1)、JNS
(SF=0);JP
/JPE
(PF=1)、JNP
/JPO
(PF=0)。 - 基于两数大小关系(无符号):
JB
/JNAE
(CF=1)、JNB
/JAE
(CF=0);JBE
/JNA
(CF=1或ZF=1)、JNBE
/JA
(CF=0且ZF=0)。 - 基于两数大小关系(有符号):
JL
/JNGE
(SF≠OF)、JNL
/JGE
(SF=OF);JLE
/JNG
(SF≠OF或ZF=1)、JNLE
/JG
(SF=OF且ZF=0)。
- 基于单个标志状态:
产生条件的指令:
CMP
(compare):比较指令,进行减法运算,但不回送差值,只根据结果影响状态标志。用于判断两数据大小、是否相等。
TEST
:测试指令,按位进行逻辑与运算,不返回逻辑与结果,只设置状态标志。常用于检测条件是否满足。
字符串操作指令:
MOVS
:一组字符串操作指令通称,表示“移动字符串数据”。包括movsb
(字节)、movsw
(字)、movsd
(双字)、movsq
(四字,64位)。采用隐含寻址,目标操作数用DI(默认ES),源操作数用SI(默认DS)。REP
前缀:重复指令前缀。rep
:重复执行后续字符串操作指令直到ECX(或CX)减为0。repe
/repz
:当ZF=1且ECX不为0时重复。repne
/repnz
:当ZF=0且ECX不为0时重复。
SCAS
:扫描字符串中的特定字符。STOS
:向目标地址填充数据。LODS
:从源地址加载数据。
函数与栈结构:
函数/子程序调用指令
CALL
:- 功能1:将下一条指令的地址(返回地址)压入堆栈(栈顶)。
- 功能2:转移到目标地址。
子程序返回指令
RET
:- 功能1:从当前堆栈顶部弹出内容作为返回地址。
- 功能2:转移到返回地址。
RET i16
:弹出返回地址后,ESP再增加i16,用于清理栈参数。
函数调用约定:函数调用者和被调用函数体之间关于参数传递、返回值传递、堆栈清除、寄存器使用的一种约定。
- 两个重要问题:参数压栈顺序(多于一个参数时)和函数调用后由谁来清理堆栈。
系统栈:
- 操作系统在每个进程的虚拟内存空间中为每个线程划分的一片存储空间。
遵守先进后出的栈操作原则。
- 由系统自动维护,用于实现高级语言中函数的调用。
栈的生长方向是从高地址向低地址增长的。
- 栈帧空间(过程活动记录):操作系统为进程中每个函数调用划分的独立栈结构。系统栈是这些函数调用栈帧的集合。
- ESP(栈指针寄存器):其内指针永远指向系统栈最上面一个栈帧的栈顶。
- EBP(基址指针寄存器):其内指针永远指向系统栈最上面一个栈帧的底部。
函数参数传递方式:栈方式、寄存器方式、通过全局变量隐含参数传递。
利用栈传递参数:调用者将返回地址、参数入栈。函数使用“ebp指针+偏移量”寻址参数。函数返回时CPU将eip置为栈中保存的地址。
- 堆栈平衡:程序运行状态的一种稳态现象,重点关注ESP的回归(不管函数内部执行多少函数,ESP都要回归到最初始状态)。
enter
和leave
指令可帮助栈维护。
利用寄存器传递参数:没有标准,但大多遵循Fastcall规范。
- Fastcall:Microsoft Visual C++编译器采用时,左边的2个不大于4字节的参数分别放在eax和edx寄存器中,其余参数从右向左压栈。
- Thiscall:C++中非静态类成员函数的默认调用约定,仅通过ecx寄存器传送this指针。
函数返回值:
- 通常放在eax寄存器中返回。
若结果大小超过eax容量,高32位放到edx寄存器中。
- 也可通过参数按引用方式返回值。
数据结构——局部变量:
分配空间时通常使用栈和寄存器。
- 利用栈存放局部变量:通过
[ebp-xxxx]
寻址调用。局部变量的起始值是随机的垃圾数据,需要初始化。 - 利用寄存器存放局部变量:编译器会利用通用寄存器尽可能存放局部变量,提高效率。
- 利用栈存放局部变量:通过
数据结构——全局变量:
- 放在全局变量的内存区,在程序整个执行过程中占用内存单元。
通常位于数据节
.data
的一个固定地址处。- 访问时一般用一个固定的硬编码地址直接对内存地址寻址。
例题与解析:
题目1:内存内核中的所有数据是所有进程共享的,用户模式代码可以直接访问。()(判断对错)
- A、对
- B、错
- 答案:B。
- 解析:内存内核区数据所有进程共享,但为了系统稳定性,用户模式代码无法直接访问和操作内核区内存。
题目2:hello25.exe程序从系统的user32.dll模块中引入了MessageBoxA函数以实现弹框功能。当hello25.exe程序被执行时,user32.dll被装载之后位于进程内存空间的内核区。()(判断对错)
- A:正确
- B:错误
- 答案:B。
解析:DLL(如user32.dll)会被映射到进程的虚拟地址空间中,作为应用程序的一部分运行,属于用户区内存,而非内核区。
题目3:80X86处理器的常态工作处理模式是?
- A.虚实模式、保护模以及虚拟8086模式
- B.虚拟8086模式
- C.实模式
- D.保护模式
- 答案:D。
解析:保护模式是80x86处理器的常态工作模式。
2.6 PE文件格式
PE文件及其表现形式:
- 可移植的可执行文件(PE,Portable Executable File):Win32平台可执行文件使用的一种格式。
- 标准的几种可执行文件格式:DOS操作系统(COM格式),System V UNIX早期版本(COFF格式),Windows(PE格式,COFF的变种),Linux等类UNIX(ELF格式,COFF的变种)。
- PE文件不光包含机器代码,还自带字符串、菜单、图标、位图、字体等其他信息。
PE文件格式与恶意软件的关系:
- 文件感染:使目标PE文件具备或启动病毒功能,但不破坏其原有功能和外在形态(如图标)。
- 病毒代码如何与目标PE文件融为一体:代码植入、控制权获取及图标更改等。
- PE文件执行时的病毒运行方式:用户点击HOST程序 -> 装载HOST到内存 -> 通过AddressOfEntryPoint和ImageBase之和定位第一条语句 -> 执行(病毒代码可能此时或运行中获得控制权) -> 病毒体执行完毕,将控制权交换给HOST -> HOST程序体继续执行。
PE文件格式总体结构:
(1) MS-DOS MZ文件头(0x40):用于定位PE文件头开始位置,也可用于PE文件合法性检测。DOS下运行会提示“This Program cannot be run in DOS mode!”。
(2) DOS Stub:承接MZ文件头。
- PE Header:由“PE\0\0”字串(Signature)、映像文件头(File_Header)、可选文件头(Optional_Header)三部分组成。
字串“PE\0\0”(Signature):值为50h, 45h, 00h, 00h,用于识别有效PE文件。
映像文件头(File_Header):包含PE文件物理分布信息(节数目、可选文件头大小、机器类型等)。
可选文件头(Optional_Header):定义PE文件很多关键信息。
- ImageBase:PE文件在内存中的优先装载地址。
- RVA(Relative Virtual Address):相对虚拟地址,是相对于内存中ImageBase的偏移地址。
- VA(Virtual Address,虚拟内存地址):PE文件指令被装入内存后的地址。VA = ImageBase + RVA。
- 文件偏移地址(File Offset):数据在PE文件中的地址,即文件在磁盘上存放时相对于文件开头的偏移。
- 对齐粒度:文件对齐粒度(FileAlignment)和内存中节对齐粒度(SectionAlignment)。决定PE文件中很多“00”字节(填充)。
- AddressOfEntryPoint:程序入口点,代码从此处开始执行。可修改此字段改变PE程序代码执行流程。
(4) 节表:紧挨着PE Header的一个结构数组,每个节对应一个节表项,包含节名、节在文件和内存中的开始地址、长度、节属性(Characteristics)。
- 节(Section):可执行文件的核心部分。
- 常见的节:代码节、数据节、引入函数节、资源节、引出函数节(DLL常见)、重定位节(DLL常见)。
节名只是为了方便记忆和使用,可自定义。
- 加壳(Software Protection Shells):软件编写后作者加上,保护软件不被轻易修改(版权保护、防破解),病毒加壳可绕过杀毒软件扫描。分类:压缩壳(UPX)、加密壳(ASProtect)、虚拟机保护软件(VMProtect)。
代码节(.text或CODE):含有程序的可执行代码。
已初始化的数据节(.data或DATA):存放编译时刻就已确定的数据。
未初始化的数据节(.bss):存放未初始化的全局变量和静态变量。
引入函数节(.rdata):
定义:被程序调用但其执行代码不在程序中的函数,这些函数位于一个或多个DLL中。在调用者程序中只保留函数信息(函数名及其驻留的DLL名)。
IMPORT Directory Table(IDT,引入目录表):由一系列
IMAGE_IMPORT_DESCRIPTOR
结构组成,每个结构对应一个DLL文件,以全0的结构作为结束。OriginalFirstThunk
和FirstThunk
:都指向一个包含一系列IMAGE_THUNK_DATA
结构的数组,定义导入函数信息。IMAGE_THUNK_DATA
:一个双字,在不同时刻有不同含义。IMPORT Name Table:存储函数名偏移。
IAT(IMPORT Address Table,引入地址表):
- 在文件中,其内容与Import Name Table完全一样。
在内存中,每个双字中存放着对应引入函数的实际加载地址(VA)。
导入表注入(Import Table Injection):常见恶意软件攻击技术,将恶意代码以DLL载体形式注入合法进程,绕过安全防护。
引出函数节(.edata):
- 定义:本文件向其他程序提供调用函数的列表、函数所在地址及具体代码实现。
- 病毒在感染其他文件时,不能直接调用API函数,需自己获取API函数地址,可利用引出函数节中的数据。
- 关键结构:引出目录表(Export Directory Table/导出表/输出表)。
Image_EXPORT_DIRECTORY
:存储导出地址表、函数名地址表、函数序号表的偏移。- 导出地址表(EXPORT ADDRESS Table):存储导出函数的偏移。
- 导出名字表(EXPORT Name Table):存储函数名的偏移。
- 导出序号表(EXPORT Oridinal Table):将导出名字表中的数组索引映射到相应的输出地址表条目。
- 通过函数名定位函数导出地址的步骤。
资源节(.rsrc):
- 定义:存放如图标、对话框等程序要用到的资源(光标、位图、图标、菜单、对话框、字符串、字体等)。
- 病毒感染过程中,若涉及图标替换,需处理资源节相关数据。
- 资源树结构:树形结构,通常有3层目录(资源类型、资源标识符、资源语言ID),第4层是具体资源数据。
- 恶意代码应用:攻击载荷存储与释放(如StuxNet),目标程序图标替换(如熊猫烧香),图标伪装。
重定位节(.reloc):
定义:存放一个重定位表。
为什么需要重定位?:PE文件中部分数据以VA地址存储,当PE文件无法加载到预期ImageBase时,这些地址需要修正。
重定位表记录那些“写死”的地址,当加载进内存时,可能需要修正。
IMAGE_BASE_RELOCATION
结构:包含VirtualAddress
(4KB页面边界)和SizeBlock
。页面的定位项包含类型和页面偏移量。常见的重定位类型:
IMAGE_REL_BASED_ABSOLUTE
(0):没有具体含义,仅用于4字节对齐填充。IMAGE_REL_BASED_HIGHLOW
(3):重定位指向的整个32位地址都需要修正,x86可执行文件首选类型。IMAGE_REL_BASED_DIR64
(10):出现在64位PE文件中,修正指向的整个地址。
PE文件的数字签名与验证机制:
作用:
- 防篡改:通过数字签名验证,保证文件未被非法篡改。
- 降低误报:安全软件通过验证文件是否有正规厂商数字签名降低误报。
签名过程:软件发布者计算PE文件散列值 -> 用私钥签名得到签名数据 -> 将公钥和签名数据等以证书形式附加到PE文件。
签名位置:Certificate Table,PE文件可选文件头DataDirecotry第5项记录其文件偏移及大小。
验证机制:系统从PE文件证书提取公钥、算法、签名数据 -> 用公钥还原原始散列值 -> 对现有PE文件计算散列值 -> 对比两个散列值是否一致。
PE文件执行时的内存布局:
- 当PE文件加载到内存后,内存版本称为模块(Module)。
- 加载过程:PE装载器分配虚拟地址空间(通常0x400000),映射磁盘文件到虚拟内存 -> 在内核创建进程对象和主线程对象 -> 搜索Import Table,装载动态链接库 -> 执行PE文件首部指定地址处的代码(主线程开始)。
例题与解析:
题目1:熟练掌握PE文件结构,对于理解PE文件病毒感染机理具有重要意义。()(判断对错)
- A、对
- B、错
- 答案:A。
- 解析:了解PE结构是理解文件感染型病毒如何植入和运行的基础。
题目2:通过修改PE程序的________字段,可以改变PE程序的代码执行流程。
- A、MZ头部的Initial Instruction Pointer IP
- B、BaseOfCode
- C、AddressOfEntryPoint
- D、AddressOfCode
- 答案:C。
- 解析:AddressOfEntryPoint是程序入口点,修改它可改变程序起始执行位置。
题目3:硬盘中PE文件各节之间的空隙(00填充部分)大小,与以下哪个参数的大小息息相关?
- A、SizeofImage
- B、SizeofHeaders
- C、FileAlignment
- D、SectionAlignment
- 答案:C。
- 解析:FileAlignment(文件对齐粒度)决定了文件中节的起始偏移和大小,从而影响填充字节。
题目4:通过直接修改或增加目标程序的代码节中的代码,可以使得目标程序具备原本更多的功能,譬如继续寻找和感染更多的其他目标程序。()(判断对错)
- A、对
- B、错
- 答案:A。
- 解析:这是文件感染型病毒的基本原理之一,通过修改代码节实现病毒功能。
题目5:当一个PE可执行文件装载到内存之后,引入地址表(IAT表)指向的数据将被对应函数在内存中的VA地址所代替。()(判断对错)
- A、对
- B、错
- 答案:A。
- 解析:IAT在文件时存储函数名信息,加载到内存后被填充为实际的函数VA。
题目6:DLL被引出函数的函数名字符串的RVA存储在引出函数节下的哪个字段指向的表中?
- A、AddressOfNameOrdinals
- B、AddressOfNames
- C、Name
- D、AddressOfFunctions
- 答案:B。
- 解析:AddressOfNames指向导出名字表,其中存储了函数名字符串的RVA。
题目7:一个具有图标和菜单的可执行文件通常都具有资源节。()(判断对错)
- A、对
- B、错
- 答案:A。
- 解析:图标、菜单等都属于程序资源,存储在资源节中。
题目8:熊猫烧香病毒采用了“Virus+Host”的感染方式,其缺陷是被感染程序的图标会发生变化。如需让被感染程序的图标保持不变,则需要对目标程序的以下哪个区域进行修改?
- A、图标节
- B、资源节
- C、资源重定位节
- D、数据节
- 答案:B。
- 解析:图标是资源节的一部分,要保持图标不变,需要对资源节进行特殊处理。
题目9:可执行程序的图标数据存储在PE文件的哪个节?
- A、数据节
- B、引入函数节
- C、引出函数节
- D、资源节
- 答案:D。
- 解析:图标数据存储在资源节。
题目10:PE程序运行时,若装载器不是把程序装到程序编译时默认的基地址时,需要PE文件的哪部分进行处理()?
- A、代码节
- B、重定位节
- C、引入函数节
- D、引出函数节
- 答案:B。
- 解析:当PE文件未加载到预期ImageBase时,重定位节用于修正内部的VA地址。
第三章 恶意软件的原理与防护
3.1 恶意代码及其分类
恶意代码(Malicious Code,MalCode),也称恶意软件(MalWare):
- 定义:设计目的是用来实现恶意功能的代码或程序。
- 特点:可能通过软件漏洞、电子邮件、存储媒介或其他方式植入目标计算机,并随目标计算机启动而自动运行。
- 主要存在形态:内存代码、可执行程序和动态链接库。
攻击目的:恶作剧、炫耀、经济利益、商业竞争、政治目的、军事目的等。
黑色产业链:由病毒作者、木马作者、漏洞挖掘者、木马销售者、垃圾邮件制造者、广告主、僵尸网络控制者、肉鸡提供者、数据贩卖者、盗号者等组成,形成完整运转模式。
APT(Advanced Persistent Threat,高级持续性威胁):指利用先进攻击手段对特定目标进行长期持续性网络攻击的形式。
- 特点:高级性在于攻击前精确收集对象业务流程和目标系统信息,主动挖掘漏洞,利用这些漏洞组建攻击网络,并利用0day漏洞进行攻击。
案例:RSA公司攻击事件(2011年)。
攻击目标:
设备类型:个人计算机、服务器、移动智能终端(手机、平板)、智能设备(特斯拉、智能家居)、通信设备(路由器、交换机)、安全设备(防火墙、IDS、IPS)。
攻击范围:
- 定点攻击:针对特定邮件、IP、域名、QQ、服务器列表、特定人员名单等。
- 群体性杀伤:挂马攻击、钓鱼攻击、病毒、蠕虫自动扩散。
恶意代码的功能:
获取数据:
- 静态数据:文件、数据库。
- 动态数据:口令、内存、网络流量、通信网络数据、可移动存储介质、隔离电脑等。
破坏系统:
- 数据:删除、修改数据。
- 系统服务:通用Web服务系统、数据库系统、特定行业服务系统(如工控)。
- 支撑设备:网络设备、线路等。
动态控制与渗透拓展攻击路径:中间系统。
恶意代码的分类:
恶意代码(广义上的计算机病毒)可分为:
计算机病毒:一组能够进行自我传播、需要用户干预来触发执行的破坏性程序或代码。
- 如CIH、爱虫、美丽莎、新欢乐时光、求职信、熊猫烧香、Flame等。
蠕虫(Worm):一组能够进行自我传播、不需要用户干预即可触发执行的破坏性程序或代码。
- 特点:通过不断搜索和侵入具有漏洞的主机来自动传播。
- 如莫里斯蠕虫、红色代码(CodeRed)、SQL蠕虫王(Slammer)、冲击波(MsBlaster)、震荡波(Sasser)、震网(Stuxnet)、飞客(Conficker)等。
特洛伊木马(Trojan Horse):
定义:通过欺骗或诱骗方式安装,并在用户计算机中隐藏以实现控制用户计算机的目的。具有远程控制、信息窃取、破坏等功能的恶意代码。
特点:欺骗性、隐藏性、非授权性、交互性。
分类(行为视角或功能视角):
- 远程控制型木马(Backdoor):实现非授权远程控制功能。交互性:双向(攻击者 <-> 被控制端)。典型案例:冰河、网络神偷、广外女生、网络公牛、黑洞、上兴、彩虹桥、PCShare、灰鸽子。
- 信息获取型木马:功能为信息获取(键盘输入、内存、文件数据等)。交互性:单向(攻击者 <- 被控制端)。发送至第三方空间(文件服务器、指定邮箱)或开启FTP服务。典型案例:Trojan-Bank、Trojan-GameThief、Trojan-IM、Trojan-Spy、Trojan-PSW、Trojan-Mailfinder。
- 破坏型木马:对本地或远程主机系统进行数据破坏、资源消耗等。交互性:单向(攻击者 -> 被控制端)或无交互。典型案例:Trojan-DDoS、Trojan-Ransom、Trojan-ArcBomb、Trojan-Downloader、Trojan-Dropper。
后门(Backdoor):使得攻击者可以进行非授权访问的一类程序。一些软件开发者将其设计为漏洞形式。如BITS、WinEggDrop、Tini等。
Rootkit:修改操作系统软件,使攻击者获得访问权并隐藏在计算机中的程序。
勒索软件(Ransomware):对用户文件进行加密,或修改系统配置,然后要求用户支付赎金以恢复。
其他类型:挖矿软件、流氓软件、间谍软件、广告软件、Exploit、黑客工具等。
恶意代码与网络犯罪:
- 相关法律条款及司法解释:中华人民共和国刑法285、286条,《刑法修正案(七)》,最高人民法院、最高人民检察院关于办理危害计算机信息系统安全刑事案件应用法律若干问题的解释。
- 案例:熊猫烧香(作者被判刑),XX神器(19岁大一学生暑期爱好)。
- 思考:计算机病毒和网络蠕虫的本质区别?
- 计算机病毒:需要用户干预触发,通过感染其他程序或文件进行传播。
- 网络蠕虫:不需要用户干预即可自动传播,通过漏洞或弱点在网络中扩散。
- 思考:特洛伊木马和后门的功能类似,本质区别?
- 特洛伊木马:通常通过欺骗或诱骗的方式安装,看起来具有正常功能但隐藏恶意意图,是一个程序。
- 后门:指有意设计的、隐蔽的功能,通常是软件开发人员为特殊目的预留的访问通道,可以是一个程序,也可以是程序中的一个功能或漏洞。
例题与解析:
题目1:APT的全称是Advanced Persistent Threat,这种威胁通常具有组织或政府背景,具有很强的可持续性和隐蔽性,并且通常具有较强的政治或军事目的,其与以获取经济利益为主要目的的传统威胁存在本质差别。()(判断对错)
- A、对
- B、错
- 答案:A。
- 解析:这完全符合APT的定义和特征。
题目2:漏洞利用型蠕虫比传统计算机病毒传播速度更快,是因为其利用了目标系统漏洞自动进行传播,其传播过程无须用户干预触发。()(判断对错)
- A、对
- B、错
- 答案:A。
- 解析:蠕虫的传播不需要用户干预,这是其与病毒的主要区别和传播速度快的原因。
题目3:StuxNet蠕虫通过利用MS10-046(lnk)漏洞,使得其可以通过可移动存储设备渗透到目标内部网络。()(判断对错)
- A、对
- B、错
- 答案:A。
- 解析:Stuxnet(震网)蠕虫确实利用了MS10-046漏洞,并通过U盘等可移动存储设备传播。
题目4:在以下恶意代码中,不同类的是?
- A、冲击波
- B、Slammer
- C、CodeRed
- D、CIH
- 答案:D。
- 解析:冲击波、Slammer、CodeRed都是网络蠕虫,而CIH是计算机病毒(需要用户干预触发)。
3.2 Windows PE病毒
PE病毒的基本概念:
- 什么是PE病毒:以Windows PE程序为载体,能寄生于PE文件或Windows系统的病毒程序。
- 什么叫感染:在尽量不影响目标程序(系统)正常功能的前提下,使其具有病毒自己的功能。
- 病毒自己的功能:感染模块(被感染程序具备感染能力)、触发模块(特定条件下实施病毒功能)、破坏模块等。
PE病毒的分类:
- 文件感染型:将代码寄生在PE文件。
捆绑释放型:将宿主程序作为数据存储在病毒体内,运行时还原并执行宿主。
传统感染型:修改PE文件,将病毒代码插入其中。
- 系统感染型:将代码或程序寄生在Windows操作系统。
- 文件感染型:将代码寄生在PE文件。
传统文件感染型病毒:
感染思路:寻找未感染的PE文件,将病毒代码插入其中,并修改原文件入口点指向病毒代码,使病毒先于原程序执行。
关键技术:
重定位:为什么需要重定位?程序编译后,某些VA地址(如变量地址)就已经以二进制代码形式固定。病毒代码植入宿主文件后,其加载位置可能与编译时的预期位置不同,导致硬编码的地址不再正确。
本质:修正实际地址与预期地址的差异。
解决方案:病毒代码运行过程中进行自我重定位。一种常见方法是call delta(利用call指令的相对寻址特性)。
API函数自获取:病毒代码自身没有引入函数节,需要动态获取所需API函数的地址。
- 如何获取API函数地址?:利用DLL文件的引出函数节,特别是
kernel32.dll
中的GetProcAddress
和LoadLibraryA
。- 获取
kernel32.dll
模块基地址的典型方法:- 定位
kernel32
模块中任意一个地址,然后按照模块首地址特征(对齐于10000H,PE文件开始标识MZ)向低地址遍历定位PE文件头。
- 定位
- 在NT内核系统中,FS寄存器始终指向TEB结构;
TEB+0x30
处指向PEB结构;PEB+0x0C
处指向PEB_LDR_DATA结构;PEB_LDR_DATA+0x1C
处存放LIST_ENTRY InitializationOrderLinks
结构体,该结构体指向LDR_DATA_TABLE_ENTRY
结构,此结构中按顺序记录了进程初始化时加载的模块(ntdll.dll,紧接着kernel32.dll)。通过查找链表第二项,便可找到kernel32.dll
的基地址。
- 获取
- 然后,通过
kernel32.dll
的引出目录表结构定位具体函数的函数地址。
- 如何获取API函数地址?:利用DLL文件的引出函数节,特别是
目标程序遍历搜索:通常以PE文件格式的文件(EXE、SCR、DLL等)作为感染目标。
API函数:
FindFirstFile
和FindNextFile
。遍历算法:递归或非递归。
FindFile Proc
算法流程。
4.病毒代码插入位置选择与写入:
添加新节:增加一个专门存放病毒代码的节(需检查节表空间)。
碎片式感染:将代码分解,插入到节之间的填充部分。
插入式感染:将病毒代码插入到HOST文件的代码节中间或前后,会增加代码节大小,可能修改HOST程序参数位置。
感染的关键:病毒代码能得到运行(选择合适位置,控制权交给病毒代码),程序正常功能不能被破坏(记录原始“程序控制点位置”,病毒执行完毕后返回控制权),避免重复感染(感染标记)。
添加新节的感染方式基本步骤。
捆绑释放型病毒:
- 将HOST作为数据存储在病毒体内。
- 当执行病毒程序时,还原并执行HOST文件。
- 典型案例:熊猫烧香病毒。
- 优点:编写简单、效率高,可感染自校验程序。
- 缺点:被感染后程序主体是病毒,易被发现,程序图标可能发生变化。
系统感染型病毒:
通常为独立个体,不感染系统内的其他文件。
两个关键问题:如何再次获得控制权(自启动)和如何传播。
控制权再次获取——常见的自启动方式:
- 启动环节:BIOS -> MBR -> DBR -> 系统内部。
- 系统内部:注册表中的键值(
Run
、RunOnce
等)、系统中的特定位置(如system32
)、配置文件、特定路径的特定文件(如Explorer.exe
)。 - 其他启动方式:利用系统自动播放机制(
Autorun.inf
),在其他可执行文件嵌入少量触发代码(修改引入函数节启动DLL病毒文件、在特定PE文件代码段插入触发代码),DLL劫持(替换已有DLL文件)。
病毒的传播方式:一切可以对外交互的渠道。
- 各类存储设备(U盘、移动硬盘、光盘)。
- 各类网络通信方式(QQ、MSN、Email、淘宝旺旺、微信、微博)。
- 各类网络连接方式(有线、wifi、蓝牙)。
- 各类网络应用(迅雷、BT)。
- 邮件附件(
.exe
,.rar
,.pdf
,.doc
等)。 - 通过可移动存储设备传播的非感染式病毒:
Autorun.inf
,伪装文件夹。 - 摆渡(Air-gapped network traversal)。
典型案例——熊猫烧香病毒:
自启动方式:自身拷贝至系统目录并修改注册表自启动;拷贝自身到所有驱动器根目录,命名为
Setup.exe
,并生成autorun.inf
文件,设置为隐藏、只读、系统。感染与传播方式:
- 感染可执行文件:搜索并感染特定目录外的
.EXE/.SCR/.PIF/.COM
等文件,自身捆绑在被感染文件前端,尾部添加标记信息。 - 感染网页:查找
.html
和.asp
文件,插入恶意iframe。 - 通过弱口令传播:访问局域网共享文件夹,拷贝病毒文件并改名
GameSetup.exe
。
- 感染可执行文件:搜索并感染特定目录外的
自我隐藏:
- 禁用安全软件:尝试关闭安全软件窗口、进程,删除注册表启动项,禁用服务。
- 自动恢复“显示所有文件和文件夹”选项隐藏功能。
- 删除系统的隐藏共享。
破坏功能:连接某网站下载DDoS程序发动恶意攻击;删除扩展名为
gho
的文件。
例题与解析:
题目1:传统文件感染型病毒中的重定位技术,实际上是在目标HOST程序中增加新的重定位节,以此来完成病毒运行时的病毒代码中相关地址的自动修正。()(判断对错)
- A、对
- B、错
- 答案:B。
- 解析:传统文件感染型病毒通常利用
call delta
等方法自身进行重定位,而不是增加新的重定位节。
题目2:无论是对于传统文件感染型PE病毒,还是PE程序自身来说,重定位的本质都是为了修正目标的实际内存地址与预期地址的差异。()(判断对错)
- A、对
- B、错
- 答案:A。
解析:重定位的核心目的就是解决加载地址与预期地址不一致的问题。
题目3:传统文件感染型病毒在进行API函数自搜索时,主要是基于kernel32模块的何种机制进行的?
- A、重定位机制
- B、函数引入机制
- C、函数引出机制
- D、资源定位机制
- 答案:C。
解析:病毒通过解析kernel32.dll的引出函数节来查找和获取API函数地址。
题目4:传统文件感染型病毒由于需要修改目标PE文件,其可能导致具有自校验功能的被感染程序无法正常运行。()(判断对错)
- A、对
- B、错
- 答案:A。
解析:修改PE文件会改变其校验和,导致自校验程序失败。
3.3 宏病毒和脚本病毒
宏的基本概念与使用:
- 什么是宏?:能组织到一起作为独立的命令使用的一系列Word命令,可以实现任务执行的自动化,简化日常工作。
- Microsoft Office使用Visual Basic for Applications (VBA)进行宏的编写。
宏病毒的传播方法:
什么是宏病毒?:存在于数据文件或模板中(字处理文档、数据表格、数据库、演示文档等),使用宏语言编写,利用宏语言的功能将自己寄生到其他数据文档。
如何获得控制权?:利用自动执行宏(如
AutoOpen
、AutoExec
等),将病毒代码写在这些宏中,宏会自动执行,从而获取控制权。宏的分类:
- 内建宏:位于文档中,对该文档有效(如
AutoOpen
、AutoClose
、Document_Open
等)。 - 全局宏:位于Office模板中,为所有文档所共用(如
AutoExec
)。 - Word自动宏:
AutoOpen
、AutoClose
、AutoExec
、AutoExit
、AutoNew
。 - Excel自动宏:
Auto_Open
、Auto_Close
、Auto_Activate
、Auto_Deactivate
。 - Office97/2000:
Document_Open
、Document_Close
、Document_New
。
- 内建宏:位于文档中,对该文档有效(如
宏病毒的传播路线:
- 单机:单个Office文档 -> Office文档模板 -> 多个Office文档。
- 网络:电子邮件居多。
感染机理:让宏在数据文档和文档模板之间互相感染。
宏病毒的自我保护:
(1) 禁止提示信息:通过VBA代码关闭各种警告窗口、状态栏显示、病毒保护功能、保存提示等,以隐蔽运行。
- 屏蔽命令菜单:
- 通过定义特定宏(如
Sub ViewVBCode()
、ViewCode
、ToolsMacro
、FileTemplates
)来覆盖正常菜单功能,显示错误信息或不执行。 - 使用
CommandBars
对象来禁用或删除特定菜单项(如“工具-宏”菜单)。
- 隐藏真实代码:
- 在“自动宏”中不包括感染/破坏代码,而包含创建、执行和删除新宏(实际感染/破坏宏)的代码。
将宏代码字体颜色设置成与背景一样的白色等。
VBS脚本的概念及使用:
- 什么是VBS?:Visual Basic Script的简称,微软环境下的轻量级解释型语言。
- 特点:使用COM组件、WMI、WSH、ADSI访问系统元素进行管理。是ASP(Active Server Page)默认脚本语言,也可在客户端作为独立程序(.vbs, .vbe)运行。
- VBS功能强大:高效管理远程/本地计算机,读写环境变量,管理注册表/文件系统/服务/进程/系统账户,管理活动目录,进行网络交互(文件上传下载、邮件发送)等。
VBS脚本病毒的传播方法:
- 定义:用VBScript编写,能够进行自我传播的破坏性程序,其需要人工干预触发执行。
- 感染文件:通过自我复制感染文件,病毒中的绝大部分代码可以直接附加在其他同类程序中。
- 搜索目标:利用文件系统对象遍历目录和文件。
- 通过Email传播:如爱虫病毒(Melissa病毒),自动向Outlook邮件用户地址簿中的联系人发送病毒副本。
- 其他传播方式:感染网页、通过IRC传播等。
- VBS病毒生产机:脚本语言特点(解释执行、不需编译、无需校验、语句分隔清晰、模块执行位置不敏感)使其容易模块化,用户可配置功能组合生成病毒。
- 爱虫病毒(I Love You Virus):菲律宾学生编写,一周内传遍全球,造成数十亿美元经济损失。包含主模块、注册表修改、HTML生成、邮件传播、本地磁盘感染等功能。
VBS脚本病毒的自我保护:
- (1) 自变换与加密:代码实际是自变换。
- (2)
巧妙运用Execute函数:将可能触发安全软件报警的对象声明代码转化为字符串,然后通过
Execute(String)
函数执行,躲避检测。 - (3)
改变某些对象的声明方法:通过拼接字符串等方式声明对象,如
createobject("script"+"ing.filesyste"+ "mobject”)
,躲避签名检测。 - (4) 尝试关闭反病毒软件:利用VBS脚本功能查看和关闭/删除安全软件进程或服务。
例题与解析:
题目1:宏病毒一种非常古老的恶意代码威胁,当前已经不可能存在这类威胁。()(判断对错)
- A、对
- B、错
- 答案:B。
- 解析:宏病毒虽然古老,但仍是存在的威胁,并且在APT攻击中仍有应用。
题目2:宏病毒通常通过修改自动宏的代码来获取控制权,以下不属于Word自动宏的选项是:
- A、Auto_Close
- B、AutoExec
- C、AutoExit
- D、AutoNew
- 答案:A。
- 解析:Word的自动宏包括AutoOpen、AutoClose、AutoExec、AutoNew、AutoExit。
题目3:由于脚本功能非常有限,其对系统产生的破坏作用不如传统的PE病毒巨大。()(判断对错)
- A、对
- B、错
- 答案:B。
- 解析:VBS脚本功能强大,可以进行各种系统管理和网络交互,其破坏作用不容小觑。
3.4 网络蠕虫
网络蠕虫的定义:
John F. Shoch(Xerox PARC,1982年)最早引入,给出两个基本特征:可以从一台计算机移动到另一台计算机,可以自我复制。
最初目的:分布式计算的模型试验。
Spafford对蠕虫和计算机病毒的重新定义(1988年):
- 计算机蠕虫:可以独立运行,并能把自身的一个包含所有功能的版本传播到另外的计算机上。
计算机病毒:一段代码,能把自身加到其他程序包括操作系统上;它不能独立运行,需要由它的宿主程序运行来激活它。
网络蠕虫与计算机病毒的本质区别:
- 蠕虫传播不需要用户干预即可自动传播,通过不断搜索和侵入具有漏洞的主机来扩散。
病毒传播需要用户干预触发,通过感染其他程序或文件进行传播。
典型案例:
- 莫里斯蠕虫(Morris Worm,1988):第一个进入互联网的蠕虫,导致约6000台机器瘫痪,利用Rsh/rexec、Sendmail debug模式、Fingerd缓冲区溢出漏洞。
- 红色代码(CodeRed,2001):主要针对Windows
NT和2000系统的IIS服务缓冲区溢出漏洞,修改主页,对白宫网站发起DDoS攻击。
- 蠕虫王(Slammer,2003):376字节,仅存在于内存之中,不产生任何文件,针对Microsoft SQL Server 2000的蠕虫,利用其Resolution服务远程栈缓冲区溢出漏洞(UDP/1434)。
- 飞客(Conficker,2008):感染上千万台电脑,利用MS08-067漏洞,通过局域网、U盘传播,通过随机域名、P2P网络接收控制命令。
- 震网(Stuxnet,2010):全球首个“超级工厂病毒”,针对工业控制系统编写的破坏性病毒,通过利用MS08-067漏洞(或MS10-046(lnk)漏洞,PPT测试题提到)通过可移动存储设备渗透内网。
网络蠕虫的分类:
- 漏洞利用类蠕虫(Exploit Worm):通过利用系统、网络应用程序漏洞自动传播。如Slammer、MsBlaster、Sasser、StuxNet、Zotob、MocBot、Saodangbo等。
- 口令破解类蠕虫(PassWorm)。
- 邮件传输类蠕虫(MailWorm)。
- 即时通信类(IMWorm)。
- P2PWorm、IRCWorm、USBWorm等。
网络蠕虫的功能模块:
信息收集:对本地或目标网络进行信息收集,为发现易感染目标提供支持。
扫描探测:完成特定目标的脆弱性检测,发现易感染主机。
- 影响传播速度因素:漏洞主机发现速度、漏洞主机总数、蠕虫感染速度。
扫描策略:随机扫描、选择性扫描、顺序扫描、基于目标列表的扫描、分治扫描、基于路由的扫描、基于DNS的扫描。
攻击渗透:利用安全漏洞建立获取目标系统的控制权(Exploit,shellcode推送)。
- 利用漏洞类型:系统或网络应用程序漏洞、主机之间信任关系漏洞、默认用户和弱口令漏洞、客户端程序配置漏洞。
自我推进(自我复制):完成蠕虫副本在本地与目标主机之间传递。
- 方式:文件直接传输、搭建Web/FTP/TFTP服务器、P2P等。
扩展功能模块(取决于攻击者目的):实体隐藏(隐藏、加密、变形)、宿主破坏(摧毁被感染主机,留下后门)、信息通信(蠕虫间、蠕虫与黑客通信)、远程控制、自动升级。
网络蠕虫的检测与防治:
蠕虫传播阶段:慢启动期、快速传播期、慢结束期、被清理期。
漏洞利用型蠕虫的行为特征:利用系统/网络应用服务漏洞,主动攻击,无需人为干预,速度迅猛。危害:网络拥塞、系统性能降低、安全隐患、反复性、破坏型。
防范措施:
- 个人用户:及时修补漏洞补丁,使用防火墙软件阻断,安全防护软件及时更新。
- 网络管理者:网关阻断,补丁下发。
- 安全厂商:网络流量特征分析与提取,网络安全设备快速阻断,快速利用客户端安全软件清除蠕虫个体并修补。
- 网络应用厂商:应用流量过滤与阻断,补丁自动分发与修补。
例题与解析:
题目1:在蠕虫防范方面,网络运营商和网络管理部门的防护措施更为重要和关键。()(判断对错)
- A、对
- B、错
- 答案:A。
- 解析:网络蠕虫主要通过网络传播,网络运营商和管理部门能从源头进行流量阻断、补丁下发,因此其防护措施更为重要。
题目2:终端反病毒软件对于网络蠕虫防护起不到任何作用。()(判断对错)
- A、错
- B、对
- 答案:A。
- 解析:终端反病毒软件仍能清除蠕虫个体并协助修补漏洞,并非完全无用。
题目3:以下哪种措施,不是有效的蠕虫防护措施?
- A、以毒攻毒,制作另外一个蠕虫来进行传播对抗
- B、补丁修补
- C、流量阻断
- D、部署终端反病毒软件进行查杀
- 答案:A。
- 解析:“以毒攻毒”制作新蠕虫传播对抗本身就是制造新的恶意代码,不属于有效防护措施。
题目4:通常情况下,以下哪类恶意软件的传播速度是最快的?
- A、脚本病毒
- B、电子邮件蠕虫
- C、漏洞利用型蠕虫
- D、捆绑释放型病毒
- 答案:C。
- 解析:漏洞利用型蠕虫通过自动攻击漏洞传播,无需用户干预,速度极其迅猛。
3.5 网络木马
木马的基本概念:
- 全称为特洛伊木马,来源于古希腊神话。
- 定义:通过欺骗或诱骗的方式安装,并在用户的计算机中隐藏以实现控制用户计算机的目的。具有远程控制、信息窃取、破坏等功能的恶意代码。
- 特点:欺骗性、隐藏性、非授权性、交互性。
木马的分类:不同视角有不同分类,如行为视角、功能视角。
远程控制型木马:
- 功能:实现非授权远程控制。
- 交互性:双向(攻击者 <-> 被控制端)。
- 典型案例:卡巴斯基分类标准下的Backdoor,冰河、网络神偷、广外女生、网络公牛、黑洞、上兴、彩虹桥、PCShare、灰鸽子等jan-IM、Trojan-Spy、Trojan-PSW、Trojan-Mailfinder等。
破坏型木马:
- 功能:对本地或远程主机系统进行数据破坏、资源消耗等。
- 交互性:单向(攻击者 -> 被控制端)或无交互。
- 典型案例:卡巴斯基分类标准下的Trojan-DDoS、Trojan-Ransom(勒索病毒)、Trojan-ArcBomb、Trojan-Downloader、Trojan-Dropper等。
木马的植入方式:
- 网页挂马植入:自动下载安装(利用漏洞如MS06014,MS10002)。
- 电子邮件植入:附件形式,或电子邮件与恶意网页结合(HTML格式发送)。
- 伪装欺骗植入:更改后缀名(Unicode翻转字符)、图标伪装。
- 捆绑植入:EXE捆绑、文档、多媒体文件、电子书植入。
- 其他:特定U盘植入(故意丢弃)、社会工程。
木马的通信方式:
传输通道构建信息:IP地址、端口、第三方网站地址。
建立通信连接的方式:
正向连接:控制端主动连接被控端。
优点:攻击者无需外部IP地址,木马样本不会泄露攻击者IP地址。
缺点:可能被防火墙阻挡,被攻击者必须具备外部IP地址,定位被攻击者相对困难。
反向连接:被控制端主动连接控制端。
- 优点:通过防火墙相对容易,攻击目标随时上线、随时控制,可以控制局域网内的 344]。
通信协议:
- TCP协议:稳定,易被发现(可伪装HTTP协议)。
- UDP协议:负载比TCP少,可靠性低。
- ICMP+TCP/UDP:监听ICMP报文感知木马数据。ICMP报文由系统内核或进程直接处理,不通过端口,一般不会被防火墙过滤。
- 难以觉察的后门——BITS:进程管理器中看不到,平时没有端口,只在系统中充当卧底,提供正向和反向连接功能,适用于Windows2000/XP/2003。
远控木马的常见功能:
木马结构:完整的木马一般由木马配置程序、控制端程序(客户端)和被控制端程序(服务端程序)三部分组成。
典型功能:
- 文件管理:获取目标文件系统信息,包括浏览磁盘文件、上传下载文件、执行文件、删除文件、修改文件信息。
- 进程管理:查看、结束或暂停目标系统进程。用于查看目标系统环境、停止反病毒程序等。
- 服务管理:查看并管理目标系统的服务(创建、启动/停止、删除)。
- 注册表管理:远程管理目标系统的注册表。
- 屏幕监控、屏幕或第三方程序。
木马的关键:功能适当(精简灵活)、适用性强(功能、权限)、高效/稳定/隐蔽(传输)、可穿透性、自更新/自销毁、防追踪/反制对抗、持续免杀性能等。
木马的检测思路:
- 如何对木马进行检测?:静态文件特征、网络流量特征、系统行为特征、功能行为特征、攻击意图等。
例题与解析:
题目1:远程控制型木马与远程管理软件之间的最大区别在于
- A、是否进行版本更新
- B、是否获得被控制端授权
- C、是否可以传播
- D、是否为独立的程序
- 答案:B。
- 解析:远程管理软件是合法工具,需获得授权;木马则是在未授权情况下进行控制。
题目2:在以下恶意代码中,不属于远程控制型木马的是:
- A、上兴
- B、PCShare
- C、灰鸽子
- D、Trojan-Ransom
- 答案:D。
- 解析:上兴、PCShare、灰鸽子是远程控制型木马的典型案例。Trojan-Ransom是破坏型木马(勒索病毒)。
题目3:卡巴斯基分类标准下的Trojan-Ransom属于哪种类型的木马()?
- A、远程控制型
- B、破坏型
- C、信息获取型
- D、以上都不属于
- 答案:B。
- 解析:Trojan-Ransom(勒索病毒)属于破坏型木马。
题目4:网页挂马攻击属于典型针对特定个人的定向攻击行为。()(判断对错)
- A、正确
- B、解析**:正向连接是攻击者主动连接被控端,因此被控端需要开启监听端口。
题目6:以下关于远程控制型木马的论述中,错误的评论项是?
- A、相对于正向连接木马而言,使用反向连接木马有利于攻击者第一时间控制被控主机
- B、相对反向连接而言,采用正向连接的木马更难被定位到攻击者所在位置
- C、采用反向连接方式的木马在检测对象与恶意代码特征(检测标准)进行对比分析,定位病毒程序或代码,或检测恶意行为。
检测对象:
- 引导扇区:硬盘主引导扇区、硬盘操作系统引导扇区、可移动硬盘引导扇区。
- 文件系统中可能带毒的文件:可执行程序(.exe, .dll, .com)、数据文件(.doc, .xls, .pdf)、脚本文件(.js, .vbs, .php)、网页文件(.html, .asp)。
- 内存空间:恶意代码在传染或执行时会占用内存,部分恶意代码仅存在于内存中(无文件存在或已自行删除,或被外部动态注入)。
- 主板BIOS等。
- 网络流量,系统行为等。
病毒的检测策略:
- 专用检查技术:针对某个或某些特定已知恶意代码(如文件特征值检测技术)。反病毒软件需频繁更新病毒库。
- 通用检测技术:针对已知和未知恶意代码(如启发式扫描技术、主动防御技术)。
- 特征值检测技术:
- 病毒特征值:反病毒软件鉴别特定计算机病毒的一种标志,通常是从病毒样本中提取的一段或多段字符串或二进制串 [264, 3:只能检测已知恶意代码,容易被免杀绕过。
恶意软件对抗:手工修改自身特征,自动修改自身特征(加密、多态、变形)。
校验和检测技术(预期符合性):
定义:在文件使用/系统启动过程中,检查检测对象的实际校验和与预期是否一致,从而发现文件/引导区是否感染。
预期:正常文件内容和正常引导扇区数据。
使用方式:系统自动监测(校验和检查程序常驻内存)、专用检测工具(MD5Checker)、自我检测(应用程序内部自检查)。
检测对象:文件头部、文件属性、文件内容(CRC校验、MD5)、系统数据(硬盘引导扇区、分区引导扇区、内存中断向量表、SSDT、设备驱动程序处理例程)。
代码指令序列:格式化磁盘、搜索可执行程序、驻留内存、非常用/未公开系统功能调用、子程序调用只执行入栈操作、远距离跳转指令等。
步骤:定义通用可疑特征 -> 对功能操作排序赋权值 -> 鉴别特征,若权值总和超过阈值则判定为病毒。
优缺点:
- 优点:能够发现未知病毒。
- 缺点:误报率高。
- 解决方案:启发式扫描技术 + 传统扫描技术(特征值扫描),可提高检测率,降低误报率。
针对启发式扫描技术,恶意软件对抗:直接对抗(禁用启发式机制、禁用反病毒软件),绕行(了解启发式检测特征项,寻找替代实现方式)。
虚拟机检测技术:
为什么需要?:应对加密、多态、变形病毒的出现(真实代码被压缩或加密,但最终需在内存中还原)。
定义:在反病毒系统中设置的一种程序机制,它能在内存中模拟一个小的封闭程序执行环境,所有待查文件都以解释方式在其中被虚拟执行。通常虚拟执行一小部分代码即可。
优缺点:
- 优点:有效处理加密类病毒,虚拟机技术+特征值扫描准确率更高,虚拟机技术+启发式扫描有利于检测未知变形病毒。
主动防御技术:
- 定义:有时也称行为监控技术。动态监视所运行程序调用各种应用编程接口(API)的动作,自动分析程序动作之间的逻辑关系,自动判定程序行为的合法性。监控应用程序敏感行为,并向用户提示。
- 常见可疑行为:对可执行文件写操作、写磁盘引导区、病毒程序与宿主程序AV-Comparative。评测成绩等级:Advanced+,Advanced,Standard,Tested。
例题与解析:
题目1:电脑被感染计算机病毒之后,通过更换硬盘可以彻底防止任何病毒再生。()(判断对错)
- A、正确
- B、错误
- 答案:B。
- 解析:同2.2的题目3,部分病毒可能驻留在BIOS中,更换硬盘无法清除。
题目2:以下哪类反病毒技术被设计用来对抗恶意代码的自加密、多态和变形技术。
- A、主动防御技术
- B、特征值检测技术
- C、校验和技术
- D、虚拟机检测技术
- 答案:D。
- 解析:虚拟机技术通过在模拟环境中执行代码来对抗加密、多态和变形病毒。
题目3:软件程序员在开发正常的应用程序时,可能遇到刚编译出来的正常程序未运行即被防病毒软件检测为病毒的情况,通常情况下,这是防病毒软件的哪一种检测机制所引发的?
- A、特征值检测技术
- B、校验和技术
- C、启发式扫描技术
- D、主动防御技术
- 答案:C。
- 解析:启发式扫描根据可疑代码行为和特征进行判定,可能导致对正常程序的误报。
3.7 恶意软件样本捕获与分析
恶意软件样本捕获方法:
蜜罐(Honeypot):
- 定义:未采取安全防范措施、并模拟程序漏洞主动暴露在网络中的计算机。引诱恶意软件样本攻击这类设备。
- 特点:内部运行多种特殊用途的“自我暴露程序”和行为记录程序;引诱恶意软件在蜜罐内充分运行并记录其行为。
- 被动型蜜罐:模拟部分服务,捕获主动传播类型恶意软件(如蠕虫)。
- 主动型蜜罐:也称客户端蜜罐、沙箱。针对客户端软件恶意软件,仿真模拟真实运行环境、更多行为交互。
用户上报:由个人用户发现恶意样本后主动上报给安全研究人员或机构。特点是样本通常较新,有代表性 [272和存在形式。
文件感染型病毒:被修改的文件和引导数据(如增加字节长度,修改引导数据)是病毒的存储载体。可能藏匿于主板BIOS存储区。
蠕虫、木马类恶意软件:通常不感染可执行文件,而是和正常软件一样“安装”到系统中,安装过程隐蔽,多通过漏洞利用直接进入目标主机。通过分析系统启动项、新启动进程/线程定位。
宏病毒:可疑文档或Word/Excel/PowerPoint的模板文件是主要载体。
通过电子邮件传播的恶意软件:电子邮件的正文,特别是附件(如exe, com, scr, vb, bat等)。
脚本类恶意代码:通过脚本触发漏洞(JavaScript, VBScript, Flash ActionScript)或直接在网页中插入恶意脚本代码。
应用程序重打包(Android App):以流行App为载体,插入恶意代码后重打包。完整性校验可定位。
恶意软件样本分析方法:
- 目的:理解其工作机理和行为特征,实现或完善相应的安全监测机制,实现对已有和未知恶意软件的防御、监测。
- 基本分析问题:破坏功能及实现,监控分析:关注文件、注册表、进程、网络、内存等操作。
- 网络交互环境仿真:DNS构造、IP地址分析和模拟、服务器模拟和数据响应模拟。
- 一般思路:获取文件基本信息 -> 在线分析和检测平台获取基本行为信息 -> 对关键模块进行静态分析 -> 对关键模块进行动态调试 -> 总结、完成报告。
恶意软件样本分析工具:
- 虚拟机环境(VMWare, Virtual PC, Virtual Box):提供隔离的样本运行环境。虚拟机中的系统与物理主机系统相互隔离,虚拟机之间也相互隔离,有助于防止对物理主机的感染。
- 系统监控(Windows Sysinternals Suite:Process Explorer, ProcessMonitor, Autoruns):Windows Sysinternals Suite是一套针对Windows系统的监控和分析工具。它包含了ProcessMonitor、ProcessExplorer、Autoruns等实用工具,用于监控样本运行期间的行为和对系统的改变。
- HIPS类软件(Comodo, Malware Defender):通过HIPS软件的提示或日志,可以获取软件的安全相关行为。
- 文件类型检测(PEiD, Linux File命令):在静态分析中,这类工具用于了解程序的编写语言、编译器信息或加壳信息。PEiD能有效识别加壳类型和编译器,而Linux下的File命令可识别文件类型。
- 反编译与调试器:
- 静态反编译工具:IDA Pro是一款功能强大的反汇编器,支持数十种CPU指令集(包括Intel x86, x64, MIPS, PowerPC, ARM等)和不同格式的可执行文件(如PE、ELF)。它是最强大的通用分析工具之一,支持多种架构和CPU的二进制程序分析,并具备将汇编代码还原成C语言风格伪代码的能力(通过F5快捷键)。IDA Pro还支持二次开发、插件和Python扩展。
- 动态调试工具:动态调试允许安全研究人员对目标程序进行运行时的单步跟踪,以深入了解目标代码运行的细节和程序机理。
- OllyDbg和Immunity Debugger适用于文件规模不大的Windows用户态程序,并具有丰富的插件支持。Immunity Debugger与OllyDbg极为相似,并提供Python扩展。
- WinDBG是微软官方提供的调试软件,功能十分强大,提供了丰富的功能命令,并支持内核模块调试,对大型文件调试支持较好。
- 网络通信数据分析(WireShark, Webscrab, Fiddler):对于涉及网络通信的恶意软件样本,可分析其网络通信数据以获取特征信息。WireShark是网络数据包分析工具,Webscrab和Fiddler是HTTP协议数据分析工具。
- 文件原始数据(RawData)分析(010Editor, UltraEdit, WinHex):这类工具用于查看特定文件格式的字段数值,例如Flash (SWF)、PDF或MP3文件的特定字段。Hex Workshop也是这类工具之一。
- 恶意软件分析报告:分析报告通常包含样本的基本信息和样本行为信息。
- 题目1:以下叙述中,正确的评论项是( )
A. 任何一个网络蠕虫都会在硬盘中生成独立的文件,且其可以独立运行。
B. Slammer是一个非常典型的网络蠕虫,其运行时仅存在于内存之中,并不在硬盘生成文件。
C. 如果一个正常程序存在可以被人恶意利用的漏洞,则其属于恶意软件。
D. 按照恶意代码分类标准,灰鸽子应属于网络蠕虫。
答案:B。
解析:
A选项错误:并非所有网络蠕虫都会在硬盘中生成独立文件。例如,Slammer蠕虫就只存在于内存中,不在硬盘生成文件。网络蠕虫可以独立运行,并能把自身包含所有功能的版本传播到另外的计算机上。
B选项正确:Slammer蠕虫是一种非常典型的网络蠕虫,它仅存在于内存中,并且不在硬盘上生成任何文件。
C选项错误:一个正常程序即使存在可以被人恶意利用的漏洞,它也并非恶意软件。恶意软件是指那些设计目的就是为了实施特定恶意功能的程序。正常软件出现安全问题,绝大多数情况下并非作者有意为之。
D选项错误:灰鸽子属于远程控制型木马,而非网络蠕虫。网络蠕虫是能够自我传播且无需用户干预即可触发执行的破坏性程序或代码,而灰鸽子是通过欺骗或诱骗方式安装的木马,具有远程控制等功能。
第四章 软件的漏洞与防护
本章主要探讨软件的缺陷与漏洞机理、典型软件漏洞的分析以及Windows系统安全机制和漏洞防护技术。
4.1 软件缺陷与漏洞机理概述
4.1.1 什么是漏洞? 漏洞是程序设计或程序运行环境中的缺陷和疏忽。程序的执行流程只能严格按照编程要求进行,但不幸的是,所编写的程序并不总是与程序员预计让程序完成的事情一致。黑客入侵利用的正是对规则的更深入了解,并以难以预料的方式使用这些规则。
漏洞的本质是代码流程的变化,即任何安全漏洞都导致程序走到非设计流程上。漏洞是软件bug的一个子集,软件bug不可能被绝对消除,但漏洞可以尽可能地消除。
漏洞的存在具有必然性和偶然性:
- 必然性:是政治、军事、经济矛盾的产物,也是复杂性超过可验证性的结果。
- 偶然性:源于设计、实现、配置的失误,或故意埋设。
安全漏洞能够吞噬软件的价值。因此,在软件开发中应充分考虑安全问题,软件的安全程度与投入和重视程度密切相关。
例题:
- 下面关于软件漏洞的描述,正确的是( )。
- A、软件漏洞的本质是代码执行流程的改变
- B、软件漏洞可以完全消除
- C、软件漏洞不具有时空特性
- D、具有漏洞的软件就是恶意软件
- 答案:A [我的思考:此题答案是根据源文档中“漏洞的本质:代码流程的变化” 得出,A符合原文陈述。]
- 软件漏洞的本质是( )?
- A、代码流程的变化
- B、代码的逻辑错误
- C、错误的配置
- D、人类的不小心
- 答案:A [我的思考:此题答案同样根据源文档中“漏洞的本质:代码流程的变化” 得出,A符合原文陈述。]
4.1.2 漏洞在何处潜伏? 漏洞可能潜伏在系统设计和代码实现中。例如,边界网关协议(BGP)的漏洞和OSPF攻击就是设计层面漏洞的体现。
4.1.3 漏洞对系统的威胁 网络攻击之所以容易,是因为其具有静态性、确定性和相似性。漏洞对系统造成的威胁包括:
- 非法获取访问权限:攻击者通过利用漏洞,绕过访问控制规则,获取本不应有的访问权限。
- 权限提升:攻击者利用有缺陷的系统程序,将较低的账户权限提升到更高级别,通常以获得管理员权限为目标。
- 恶意软件植入:恶意软件利用系统缺陷或漏洞将攻击代码植入目标,可以是主动植入(无需用户干预)或被动植入(借助用户操作,常与社会工程学结合)。
- 拒绝服务:攻击导致计算机软件或系统无法正常工作,无法提供正常服务,如IIS处理畸形HTTP/FTP请求导致的崩溃。
- 数据丢失或泄露。
4.1.4 漏洞的分类 漏洞可以从不同视角进行分类:
从导致代码执行的方式:内存破坏导致的代码执行,如栈缓冲区溢出、堆缓冲区溢出、格式串问题等。
从其他安全问题:逻辑错误、设计错误等。
从用户群体:大众类软件漏洞(如Windows、QQ、IE)和专用软件类漏洞(如AIX、DB2、Oracle)。
从作用范围:远程漏洞和本地漏洞。
从触发条件:可主动发起攻击的漏洞和只能被动等待触发的漏洞。
从数据角度:
- 能够读取按理不能读的数据,包括内存、文件、网络、数据库或用户输入的数据。
- 能够将指定内容写入指定位置。
- 输入的数据可以被执行,例如作为机器码、SQL命令、Shell命令或程序代码。
从时序:已发现很久的漏洞、刚发现的漏洞,以及“0 day”漏洞。0 day漏洞是指在被公开发布前或当时,其利用程序(exploit)已被发布或使用。
4.1.5 典型的安全漏洞 典型的安全漏洞包括缓冲区溢出、SQL注入、跨站脚本、命令执行和释放重引用等。非典安全漏洞则包括文件操作类、数据库类、代码执行类、口令认证类和数据泄漏类。
4.1.6 漏洞利用 漏洞利用是黑客针对现有漏洞,根据其类型和特点采取相应的技术方案进行的攻击,其共同点是通过触发漏洞隐蔽地执行恶意代码。触发漏洞完成恶意操作的程序通常被称为exploit。漏洞和漏洞利用是紧密联系在一起的。
漏洞利用的流程包括:漏洞挖掘(通过符号执行、模糊测试、机器学习等方法),漏洞分析,概念验证(POC),以及最终的攻击程序(Exploit)和Shellcode。市面上也有集成化的漏洞利用工具,如Core Impact、Canvas和Metasploit。
从不同视角看漏洞利用:
- 数据操作视角:核心目的是操作原本不能操作的数据(读或写),导致泄密或数据修改。
- 权限视角:主要涉及权限绕过和权限提升,以获得期望的数据操作能力。
- 代码执行角度:程序将输入内容作为代码执行,从而实现绕过认证、权限提升等。
漏洞等级可以分为低、中、高:
- 低等级:能读取非敏感信息,能有限写入数据到非重要位置。
- 中等级:能远程读取比较敏感的信息,能远程不受限制写入数据到非重要位置,能发起本地拒绝服务攻击。
- 高等级:能执行用户代码,能泄露机密数据,能写入数据到重要位置,能进行权限提升。
例题:
- 一个防火墙隔离(只允许运维部的人访问)的网络里运行一台Windows服务器,配置如下:
- 操作系统中只有administration和iis_user低权限用户。
- 系统中运行了IIS服务(iis_user权限)、Oracle服务、Symantec病毒防火墙。
- 一个攻击者的目的是修改Oracle数据库中的账单表中的数据。
- 已知:
- IIS在接收用户页面GET请求时user字段大于64字节时会发生栈溢出。
- Symantec软件的驱动程序检测新建文件时,文件名超过128字节时存在栈溢出。
- Administrator用户以sysdba角色(oracle中的最高权限)登录数据库不需要口令。
- 问题:给出可能的攻击步骤,说明各步骤漏洞和手法属于哪些分类。
- 可能的攻击步骤为:
- 接入运维部的网络,获得一个运维部的IP地址从而能通过防火墙访问被保护的服务器。
- 利用IIS服务的远程缓冲区溢出漏洞,直接获得一个低权限iis_user身份的cmd命令行窗口。
- 利用Symantec杀毒软件溢出漏洞获得administrator权限cmd窗口。
- 利用oracle的sysdba角色登录进入数据库(本地administrator用户登录不需要密码)。
- 修改目标表的数据。
- 各步骤漏洞和手法分类:
- 第1步:认证绕过
- 第2步:远程漏洞、代码执行(机器码)、认证绕过
- 第3步:权限提升、认证绕过
- 第4步:认证绕过、oracle设计上一个问题
- 第5步:数据写
4.1.7 总结 软件安全的目标是保护软件使用者的数据安全和业务可持续性,实现安全漏洞较少的软件。安全问题的技术根源在于可利用的软件BUG。这些漏洞存在于设计和实现中,表现为典型的溢出、SQL注入、跨站等。漏洞的属性可从本地、远程、被动、主动、高、中、低等维度进行评估,并根据时序分为老漏洞、新漏洞和0 day。
用户直接或间接输入的数据是导致安全漏洞及漏洞利用的根源。安全漏洞的利用直接导致数据安全受到威胁,或通过权限提升、认证绕过等间接威胁数据安全。这包括敏感数据泄密和重要数据被修改。
“重要数据严防范,外来数据详检查!安全是个细心事,切莫疏忽招漏洞!”。
4.2 典型软件漏洞机理分析
本节将深入分析几种典型的软件漏洞机理,包括缓冲区溢出、整型溢出、单字节溢出、格式化串漏洞以及覆盖C++虚函数指针。这些漏洞可能发生在与操作系统、运行环境相关的本地应用程序,或基于Web的应用程序中。
4.2.1 缓冲区溢出 缓冲区溢出是一个众所周知的安全问题,早在70年代初就被认为是C语言数据完整性模型的一个可能后果,因为C语言在初始化、拷贝或移动数据时,不自动支持内在的数组边界检查。尽管这提高了执行效率,但后果深远。
历史:1988年Morris蠕虫利用了
fingerd
的缓冲区溢出攻击。1996年Aleph One发表文章,给出了编写Shellcode的Exploit方法,Shellcode这一术语沿用至今。现状:目前缓冲区溢出攻击技术已相当成熟,是网络攻击的主要形式,占所有系统攻击总数的80%以上。
典型问题程序示例:
1
2
3
4
5
6
7
8
9void vulfunc(char *str){
char buffer;
strcpy(buffer,str); // 这是一个不安全的操作,可能导致缓冲区溢出
}
int main(int argc,char **argv){
if(argc>1)
vulfunc(argv);
return 0;
}相关术语:
- 缓冲区(buffer):内存空间中用于存储程序运行时临时数据的一片大小有限且连续的内存区域。
- 溢出(overflow):数据过长导致无法存储在预期区域内,覆盖了存储其他数据的区域。
- 缓冲区溢出:当计算机向缓冲区内填充数据时超过了缓冲区本身的容量,溢出的数据覆盖到了合法数据上。
进程内存分区:根据操作系统和计算机架构的不同,进程使用的内存大致分为代码区、数据区、堆区和栈区。
缓冲区溢出的分类:
- 栈缓冲区溢出(stack overflow):发生在栈区,覆盖堆栈结构。
- 堆缓冲区溢出(heap overflow):发生在堆区,覆盖指定的四字节指针。
- 类似问题:格式串问题(覆盖指定指针)。
函数类型:
- 非安全函数:没有内嵌边界保护支持,必须使用额外代码进行边界检查,如
strcat()
,strcpy()
,sprintf()
,gets()
等。strcpy()
不安全是因为它不检查操作数据的长度,仅凭\0
结束操作。 - 安全函数:可以限制所操作的数据长度,正确使用则不会导致缓冲区问题,如
strncpy()
,memcpy()
,snprintf()
等。
- 非安全函数:没有内嵌边界保护支持,必须使用额外代码进行边界检查,如
边界检查:在向缓冲区中存储数据时,确定数据长度是否会超出缓冲区边界。
栈不可执行:某些CPU支持对内存是否可执行的标志位,操作系统可以利用该特性在进程初始化时将堆栈设置为不可执行,以阻止shellcode在栈上执行。
缓冲区溢出漏洞存在的原因:
- 没有使用安全函数,也没有进行边界检查。
- 没有正确地使用安全函数。
- 设计和计算失误。
缓冲区溢出的后果:
- 攻击者使远程服务程序或本地程序崩溃。
- 攻击者以被攻击程序的运行时身份执行任意代码。
- 攻击者控制远程系统。
导致缓冲区溢出的几种方式:
- 错误的双字节字符串长度比较。
- 用源字符串长度做拷贝限制。
strncpy
等字符串截断拷贝函数的陷阱:如果源字符串长度大于限定长度参数,strncpy
会按限定长度拷贝到目标,但不会在最后加上字符串结束符\0
,这可能导致不易察觉的缓冲区溢出。- 整型变量处理不当(整型溢出)。
例题:
- 解决缓冲区溢出的方法,以下不正确的一项是
- A、边界检查
- B、栈不可执行
- C、正确使用安全函数
- D、尽量不要使用缓冲区
- 答案:D [我的思考:D项“尽量不要使用缓冲区”不实际也不准确,因为缓冲区是程序运行中不可或缺的内存区域,而A、B、C都是有效的防护措施。]
栈溢出——系统栈和函数调用 操作系统为进程中的每个函数调用都划分了一个栈帧空间(过程活动记录),系统栈是这些函数调用栈帧的集合。栈的生长方向是从高地址向低地址增长的。
函数调用过程:
- 参数入栈:将被调用函数的实际参数从右到左依次压入主调函数的栈帧。
- 返回地址(RET)入栈:将当前指令的下一条指令地址压入主调函数的栈帧。
- 代码区跳转:CPU从当前代码区跳转到被调用函数的入口。
- 栈帧调整:主调函数的EBP入栈;将主调函数ESP赋给EBP;为新栈帧分配空间(ESP减去适当值)。
函数返回过程:
- 保存返回值:通常在EAX寄存器中。
- 弹出当前栈帧:降低栈顶,恢复主调函数栈帧(弹出EBP,弹出返回地址RET到EIP)。
栈溢出的利用 栈溢出的利用根据被覆盖的数据位置和目的不同,一般分为以下几种:
修改函数返回地址:
- 如果返回地址被改写,函数返回时,流程会转入到被改写的地址。
- 攻击者用精心构造的shellcode地址覆盖返回地址。
- 实际利用中,由于Windows进程函数栈帧的动态变化(DLL装载/卸载),直接赋地址值的方式可能导致跳转异常。
- 此外,shellcode起始位置常有0x00字节,可能在字符串操作时被截断。
- 解决方案:在覆盖返回地址时,使用系统动态链接库(如
kernel32.dll
或user32.dll
)中某个处于高地址且位置固定的跳转指令地址(如jmp esp
)进行覆盖。 - Shellcode的编写需要考虑限制(如NULL字节、可见字符要求)和IDS拦截,因此常进行编码,并在执行时通过解码指令还原。
修改邻接变量。
修改S.E.H(结构化异常处理)结构覆盖:
- Windows异常处理机制:OS或应用程序运行时,为防止崩溃,提供异常处理机制。S.E.H是一个重要的数据结构,位于系统栈中,包含链表指针和异常处理函数句柄。
- S.E.H链:当栈中存在多个S.E.H时,它们通过链表指针在栈内由栈顶向栈底串成单向链表,最顶端的S.E.H由TEB的0字节偏移处指针标识。
- 异常发生时:OS中断程序,从TEB取出最近的S.E.H,调用其处理函数;若失败则遍历链表尝试其他处理函数。
- 利用原理:利用缓冲区溢出覆盖S.E.H结构,将异常处理函数的入口地址更改为shellcode的起始地址或可跳转到shellcode的跳转指令地址。当程序发生异常时,Windows异常处理机制就会转而执行已覆盖的shellcode。
例题:
- 以下哪个漏洞的攻击不可以写内存( )。
- A、栈缓冲区溢出
- B、使用%n的格式串漏洞攻击
- C、堆缓冲区溢出
- D、使用%x的格式串漏洞攻击
- 答案:D [我的思考:A、B、C项攻击都可能导致内存写入,而D项“使用%x的格式串漏洞攻击”主要是用于查看内存中的数据,不直接进行写入。]
堆溢出 基于堆的攻击比基于栈的攻击更困难,但防范难度也更大,因此这类攻击仍在持续增长。
堆的特性:在程序运行时动态分配内存;需程序员使用专用函数申请和释放;通常用堆指针使用申请得到的内存。
堆与栈的区别:
- 典型用例:堆用于动态增长的数据结构(如链表),栈用于函数局部数组。
- 申请方式:堆需函数动态申请,通过返回指针使用;栈在程序中直接声明。
- 释放方式:堆需专门函数释放;栈由系统自动回收。
- 管理方式:堆由程序员负责申请与释放;栈由系统完成。
- 所处位置:堆变化范围很大;栈一般是0x0010xxxx。
- 增长方向:堆从内存低地址向高地址排列;栈由内存高地址向低地址增加。
Windows堆区分类:
- 进程默认堆:每个进程启动时系统创建的堆,如
LocalAlloc
或GlobalAlloc
从中分配内存。 - CRT库堆:C++编程中
malloc
和new
申请的内存。VS2015后CRT库通常使用进程默认堆。 - 自建堆:程序通过
HeapCreate
创建的堆。
- 进程默认堆:每个进程启动时系统创建的堆,如
堆块结构:堆块分为空闲态(链入空链表,由系统管理)和占有态(返回句柄,由程序员管理)。
堆表:包括空表(
FreeList
,双向链表)和快表(Lookaside
,单向链表)。堆块分配:包括快表分配、普通空表分配和零号空表(
free
)分配。分配时有“找零钱”现象,即当没有完全匹配的空闲块时,会从稍大的块中精确切割。堆块释放与合并:释放时将堆块状态改为空闲并链入堆表末尾。为有效利用内存,堆管理系统会合并彼此相邻的空闲堆块。
堆溢出利用的精髓:用精心构造的数据溢出并覆盖下一个堆块的块首,改写其
prior
和next
指针。在分配、释放、合并等操作发生时,伺机获得一次向内存任意地址写入任意数据的机会(Arbitrary Dword Reset, 又称Dword Shoot),从而劫持进程,运行shellcode。
4.2.2 整型溢出
定义:当整数运算的结果超出其数据类型所能表示的范围时发生溢出,例如
int i = 0xFFFFFFFF; i + 1
。可能导致的问题:
- 数字错误引发逻辑问题。
- 长度参数错误引发缓冲区溢出。
重要性:整型溢出相对更容易发生,未来可能导致更大比例的缓冲区溢出。
防范:
- 不同大小类型的整数不要互相尝试存储。
- 对整数操作要格外注意,加和乘的结构不一定使整数变大,减和除不一定使整数变小。
- 安全函数(如
memcpy
、strncpy
)的长度参数都是无符号整数。
例题:
- 以下哪个不会造成整型溢出漏洞( )。
- A、整数的符号问题
- B、整数相乘与相加的溢出
- C、短整型与长整型的相互赋值运算
- D、用printf打印出整数
- 答案:D [我的思考:A、B、C都可能导致整数超出其表示范围而溢出,而D项“用printf打印出整数”是输出操作,不改变整数值本身,因此不会造成溢出漏洞。]
4.2.3 单字节溢出
- 原因:由于人们习惯从1开始计数,而C语言数组下标从0开始,导致以大小为数值下标进行操作时,可能会超出缓冲区一个字节。
- 危害:可能导致保存在栈中的
ebp
被修改,使上一层函数返回时获得控制;可能覆盖相邻指针。新的GCC编译器由于16字节对齐,以及Big-Endian机器,受影响的危害会小一点。
4.2.4 格式串漏洞
原因:
printf
系列函数的问题在于它们不能确定数据参数结束位置和个数,只会根据format
中的打印格式数目依次打印堆栈中参数format
后面地址的内容。- 有问题写法:
printf(buffer);
(当buffer
内容包含格式化字符时)。 - 正确写法:
printf("%s",buffer);
。
- 有问题写法:
攻击原理:如果格式化参数个数大于实际提供的参数个数,
printf()
会从栈的当前指针开始,依次向下打印栈中的数据。利用方式:
- 可以使用
%s
、%x
等格式化符查看堆栈中的数据。
- 可以使用
%n
格式化符可以将已显示内容的长度写入一个内存地址,从而可以实现多次写入内存的机会。
例题:
- 以下哪种漏洞的攻击方式是查看内存中的数据( )。
- A、栈缓冲区溢出
- B、SQL注入
- C、跨站脚本
- D、使用%x的格式串漏洞攻击
- 答案:D [我的思考:A、B、C都不是直接查看内存数据的方式,而D项“使用%x的格式串漏洞攻击”是利用printf的格式化字符串漏洞来读取内存中的数据。]
4.2.5 覆盖C++虚函数指针
虚函数的本质:为了实现动态绑定,C++编译器会为每一个“内含虚函数的类”生成一个虚函数表(
vtable
),表中每个元素指向一个虚函数的地址。同时,编译器会为类添加一个成员变量,即一个指向该虚函数表的指针(vptr
)。运行时的多态性条件:
- 类之间应满足赋值兼容规则(子类型)。
- 要声明虚函数。
- 要由成员函数或通过指针、引用来访问虚函数。
赋值兼容规则(子类型):指在需要基类对象的任何地方都可以使用公有派生类的对象来替代。这包括派生类对象可以赋值给基类对象、初始化基类引用,以及派生类地址可以赋给指向基类的指针。
利用原理:通过内存溢出等方式覆盖对象的
vptr
,使其指向一个攻击者构造的伪造vtable
,这个伪造的vtable
中包含指向恶意代码(shellcode)的地址。当程序通过虚函数调用尝试间接访问函数时,就会跳转到恶意代码执行。
例题:
- 以下不属于与操作系统、运行环境相关的本地应用程序漏洞的是( )?
- A、缓冲区溢出
- B、单字节溢出
- C、跨站脚本
- D、整型溢出
- 答案:C [我的思考:缓冲区溢出、单字节溢出、整型溢出都是典型的本地应用程序内存管理或计算错误导致的漏洞。跨站脚本(XSS)则是一种典型的Web应用漏洞,通常发生在客户端浏览器端,不直接涉及操作系统或本地程序的内存问题。]
4.3 Windows系统安全机制及漏洞防护技术
本节主要介绍Windows系统为缓解漏洞攻击而引入的安全机制和防护技术。
4.3.1 Safe C library
Safe C library
是一组更安全的字符串处理函数。通过#include <strsafe.h>
引入使用。
4.3.2 Standard Annotation Languages (SAL)
SAL是一种标准注释语言,旨在为编码添加注释,以帮助工具发现那些不易被察觉的bug。它始于Visual
Studio
2005,通过#include<sal.h>
和一些关键字来使用。
4.3.3 栈溢出检查——GS (StackCookie)
StackCookie机制由Crispen Cowan最早提出。
原理:在函数返回地址之前压入一个随机生成的
StackCookie
(4字节无符号整数)。函数返回前,先检查StackCookie
是否被修改,如果发现被破坏则终止程序运行。应用:该机制始于Visual Studio 2003,
/GS
选项默认启用。程序启动时会计算出一个伪随机数cookie
并保存在加载模块的.data
节中。当函数调用时,cookie
会被拷贝到栈中,位于返回地址和EBP
之后,局部变量之前。优化:为减少性能影响,VS会评估哪些函数需要保护。例如,函数包含字符串缓冲区或使用
_alloca
函数在栈上分配空间时,缓冲区少于5字节则不保存cookie
。变量重新排序:
/GS
保护机制还包括对栈中变量进行重新排序,将字符串缓冲区分配在栈帧的最高地址,以防止溢出覆盖局部变量。同时,函数参数可能被复制到寄存器以防止溢出。不足:
- 在有多个缓冲区的函数中,它们相继放在栈中,仍可能从一个缓冲区溢出到另一个。
- 结构成员的互操作性问题不能重新排序,导致缓冲区溢出后其后字段仍可能被控制。
绕过机制:
- 利用异常处理器绕过:
GS
不保护异常处理器,攻击者可溢出覆盖异常处理器地址,在检查cookie
前触发异常。
- 利用异常处理器绕过:
通过同时替换栈中和
.data
节中的cookie
来绕过。
4.3.4 数据执行保护——DEP (Data Execution Prevention)
DEP
是微软随Windows XP SP2和Windows 2003
SP1发布而引入的一种数据执行保护机制。它主要针对基于栈的缓冲区溢出攻击中,将shellcode放置在栈中并跳转执行的利用方式。
技术名称:Intel称之为
XD-bit
(execute disable),AMD称之为NX
(No eXecute),VIA称之为W^X
。历史:最早由Sun公司的Solaris操作系统提供不可执行栈的选项。Windows NT 3.1系统虽然有
VirtualProtect
函数来控制内存页是否可执行,但因缺乏硬件支持,早期并未发挥作用。硬件支持:
DEP
需要CPU的硬件支持,如AMD的Athlon 64(2003年9月起)和Intel的Pentium M(起)。Windows
DEP
实现模式:- 硬件实现:CPU支持内存页
NX
属性。 - 软件实现:CPU不支持时,软件
DEP
不能直接阻止数据页上执行代码,但可防止其他形式的漏洞利用,如SEH覆盖。
- 硬件实现:CPU支持内存页
配置:Windows服务器操作系统默认对所有进程开启
DEP
保护(排除列表除外),客户端操作系统可选择启用。编译器支持:Visual Studio编译器提供一个链接标志(
/NXCOMPAT
),可以在生成目标应用程序时启用DEP
保护。对抗
DEP
:ret2libc
(Return-to-libc):一种无shellcode的漏洞利用技术,不直接跳转到shellcode,而是去执行库中的代码(被视为恶意代码)。WPM
(WriteProcessMemory)与ROP
(Return-Oriented Programming)技术:将shellcode写入不受DEP
保护的可执行内存中,或关闭进程的DEP
(通过修改内核结构_KPROCESS
中的DEP
开启标志)。
例题:
- 以下哪类反病毒技术被设计用来对抗恶意代码的自加密、多态和变形技术。
- A、主动防御技术
- B、特征值检测技术
- C、校验和技术
- D、虚拟机检测技术
- 答案:D [我的思考:自加密、多态和变形旨在改变恶意代码的静态特征,使特征值检测失效。虚拟机检测技术通过在隔离环境中模拟执行待查文件,观察其行为,从而有效处理加密和变形病毒。]
4.3.5 地址空间分布随机化——ASLR (Address Space Layout Randomization)
ASLR
机制始于Windows Vista。
原理:通过对堆、栈、共享库映射等线性区域布局的随机化,增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置,从而阻止漏洞利用。
实现:
- 编译器选项:Visual Studio 2005
SP1及更高版本中,
/DYNAMICBASE
选项编译的程序在每次运行时,其内部的栈等结构的地址都会被随机化。 - 映像加载基址随机化:从Vista开始,对使用了
/DYNAMICBASE
选项编译的可执行程序和进程中的可执行模块的映像加载基址进行了随机化。
- 编译器选项:Visual Studio 2005
SP1及更高版本中,
随机化熵值:Vista系统从256个基址中随机选择一个加载映像,并随机化调整每个线程中的堆基址和栈基址。后续的Windows 8和64位操作系统中,随机化的熵值有所提高。
缺陷和绕过方法:
- 由于许多系统DLL总是由多个进程加载,导致只有在操作系统重启时才能再次随机化。
- 部分返回地址覆盖法:动画光标漏洞(MS Advisory
935423,2007年3月)是第一个在Vista上成功绕过
ASLR
及其他保护机制的案例。 - 利用程序中没有启用
ASLR
的模块中的相关指令作为跳板。
4.3.6 SafeSEH
SafeSEH
是用来保护和检测堆栈中的SEH函数指针被覆盖的技术。微软在编译器中加入/SafeSEH
连接选项,并从VS2003及后续版本中默认启用。
- 原理:编译器在链接生成二进制
IMAGE
时,将所有合法的异常处理函数的地址解析出来,制成一张安全的SEH表,保存在程序的IMAGE
数据块中。当程序调用异常处理函数时,会将函数地址与安全SHE
表中的地址进行匹配检查。 - 安全性:当进程中存在一个不支持
SafeSEH
的image
时,整个SafeSEH
机制就很有可能失效。
4.3.7 EMET (Enhanced Mitigation Experience Toolkit)
EMET
是微软推出的一套用来缓解漏洞攻击、提高应用软件安全性的增强型体验工具。它不随Windows系统发布或预装,用户可自行选择安装和配置。
EMET4的特性:
- 增强型
DEP
:在指定应用中强制调用setProcessPolicy
来打开DEP
。 SafeSEH
的升级版——SEHOP
:动态检验SEH链的完整性,在较新的操作系统中已内建支持。- 强制型
ASLR
:对于未使用/DYNAMICBASE
选项的模块进行加载基址的强制随机化。 HeapSpray
防护:强制内存分配,占用常用攻击地址的方式迫使HeapSpray
攻击中的内存分配失效。
- 增强型