本书分为4篇17章,系统全面地介绍了Windows平台缓冲区溢出漏洞的分析、检测与防护。第一篇为常用工具和基础知识的介绍;第二篇从攻击者的视角出发,揭秘了攻击者利用漏洞的常用伎俩,了解这些知识对进行计算机应急响应和提高软件产品安全性至关重要;第三篇在第二篇的基础上,从安全专家的角度介绍了漏洞分析和计算机应急响应方面的知识;第四篇则站在软件工程师的角度讲述如何在开发、测试等软件生命周期的各个环节中加入安全因素,以增强软件产品的安全性。
第1篇 基础知识
第1章 漏洞概述 2
1.1 bug与漏洞 2
1.2 几个令人困惑的安全问题 2
1.3 漏洞挖掘、漏洞分析、漏洞利用 3
1.4 漏洞的公布与0 day响应 5
第2章 二进制文件概述 6
2.1 PE文件格式 6
2.2 虚拟内存 6
2.3 PE文件与虚拟内存之间的映射 8
第3章 必备工具 13
3.1 OllyDbg简介 13
3.2 SoftICE简介 14
3.3 WinDbg 简介 19
3.4 IDA Pro简介 22
3.5 二进制编辑器 24
3.6 虚拟机简介 26
3.7 Crack二进制文件 27
第2篇 漏洞利用
第4章 栈溢出利用 38
4.1 系统栈的工作原理 38
4.1.1 内存的不同用途 38
4.1.2 栈与系统栈 40
4.1.3 函数调用时发生了什么 41
4.1.4 寄存器与函数栈帧 44
4.1.5 函数调用约定与相关指令 45
4.2 修改邻接变量 49
4.2.1 修改邻接变量的原理 49
4.2.2 突破密码验证程序 51
4.3 修改函数返回地址 57
4.3.1 返回地址与程序流程 57
4.3.2 控制程序的执行流程 60
4.4 代码植入 66
4.4.1 代码植入的原理 66
4.4.2 向进程中植入代码 67
第5章 开发shellcode的艺术 78
5.1 shellcode概述 78
5.1.1 shellcode与exploit 78
5.1.2 shellcode需要解决的问题 80
5.2 定位shellcode 81
5.2.1 栈帧移位与jmp esp 81
5.2.2 获取“跳板”的地址 84
5.2.3 使用“跳板”定位的exploit 86
5.3 缓冲区的组织 91
5.3.1 缓冲区的组成 91
5.3.2 抬高栈顶保护shellcode 92
5.3.3 使用其他跳转指令 94
5.3.4 不使用跳转指令 94
5.3.5 函数返回地址移位 95
5.4 开发通用的shellcode 97
5.4.1 定位API的原理 97
5.4.2 shellcode的加载与调试 100
5.4.3 动态定位API地址的shellcode 101
5.5 shellcode编码技术 112
5.5.1 为什么要对shellcode编码 112
5.5.2 会“变形”的shellcode 114
5.6 为shellcode“减肥” 118
5.6.1 shellcode瘦身大法 118
5.6.2 选择恰当的hash算法 121
5.6.3 191个字节的bindshell 124
第6章 堆溢出利用 139
6.1 堆的工作原理 139
6.1.1 Windows堆的历史 139
6.1.2 堆与栈的区别 140
6.1.3 堆的数据结构与管理策略 141
6.2 在堆中漫游 147
6.2.1 堆分配函数之间的调用关系 147
6.2.2 堆的调试方法 148
6.2.3 识别堆表 152
6.2.4 堆块的分配 156
6.2.5 堆块的释放 157
6.2.6 堆块的合并 158
6.3 堆溢出利用(上)
——DWORD SHOOT 159
6.3.1 链表“拆卸”中的问题 159
6.3.2 在调试中体会
“DWORD SHOOT” 162
6.4 堆溢出利用(下)
——代码植入 166
6.4.1 DWORD SHOOT的利用方法 166
6.4.2 狙击P.E.B中RtlEnterCritical-
Section()的函数指针 167
6.4.3 堆溢出利用的注意事项 174
第7章 Windows异常处理机制深入浅出 177
7.1 S.E.H概述 177
7.2 在栈溢出中利用S.E.H 179
7.3 在堆溢出中利用S.E.H 184
7.4 挖掘Windows异常处理 188
7.4.1 不同级别的S.E.H 188
7.4.2 线程的异常处理 189
7.4.3 进程的异常处理 192
7.4.4 系统默认的异常处理U.E.F 192
7.4.5 异常处理流程的总结 194
7.5 V.E.H简介 194
第8章 高级内存攻击技术 196
8.1 狙击异常处理机制 196
8.1.1 攻击V.E.H链表的头节点 196
8.1.2 攻击TEB中的S.E.H头节点 197
8.1.3 攻击U.E.F 198
8.1.4 攻击PEB中的函数指针 200
8.2 “off by one”的利用 200
8.3 攻击C++的虚函数 202
8.4 Heap Spray:堆与栈的协同攻击 206
第9章 揭秘Windows安全机制 210
9.1 Service Pack 2简介 210
9.2 百密一疏的S.E.H验证 212
9.3 栈中的较量 212
9.3.1 .net中的GS安全编译选项 212
9.3.2 GS机制面临的挑战 214
9.4 重重保护下的堆 215
9.5 硬件方面的安全措施 217
第10章 用MetaSploit开发Exploit 219
10.1 漏洞测试平台MSF 简介 219
10.2 入侵Windows系统 221
10.2.1 漏洞简介 221
10.2.2 图形界面的漏洞测试 222
10.2.3 console界面的漏洞测试 226
10.3 利用MSF制作shellcode 227
10.4 用MSF扫描“跳板” 229
10.5 Ruby语言简介 230
10.6 “傻瓜式”Exploit开发 236
10.7 用MSF发布POC 245
第11章 其他漏洞利用技术 248
11.1 格式化串漏洞 248
11.1.1 printf中的缺陷 248
11.1.2 用printf读取内存数据 250
11.1.3 用printf向内存写数据 251
11.1.4 格式化串漏洞的检测与防范 252
11.2 SQL注入攻击 253
11.2.1 SQL注入原理 253
11.2.2 攻击PHP+MySQL网站 254
11.2.3 攻击ASP+SQL Server网站 257
11.2.4 注入攻击的检测与防范 258
11.3 XSS攻击 259
11.3.1 脚本能够“跨站”的原因 259
11.3.2 XSS Reflection攻击场景 261
11.3.3 Stored XSS攻击场景 262
11.3.4 攻击案例回顾:XSS蠕虫 263
11.3.5 XSS的检测与防范 263
第3篇 漏洞分析
第12章 漏洞分析技术概述 268
12.1 漏洞分析的方法 268
12.2 用“白眉”在PE中漫步 269
12.2.1 指令追踪技术与Paimei 269
12.2.2 Paimei的安装 270
12.2.3 使用PE Stalker 271
12.2.4 迅速定位特定功能对应的
代码 274
12.3 补丁比较 276
第13章 MS06-040分析:系统入侵与
蠕虫 280
13.1 MS06-040简介 280
13.2 漏洞分析 281
13.2.1 动态调试 281
13.2.2 静态分析 290
13.3 远程Exploit 295
13.3.1 RPC编程简介 295
13.3.2 实现远程exploit 296
13.3.3 改进exploit 303
13.3.4 MS06-040与蠕虫 305
第14章 MS06-055分析:揭秘“网马” 307
14.1 MS06-055简介 307
14.1.1 矢量标记语言(VML)简介 307
14.1.2 0 day安全响应纪实 308
14.2 漏洞分析 309
14.3 漏洞利用 312
14.3.1 实践Heap Spray技术 312
14.3.2 网页木马攻击 316
第15章 MS07-060分析:Word文档中的
阴谋 318
15.1 MS07-060简介 318
15.2 POC分析 319
第4篇 漏洞挖掘与软件安全性测试
第16章 漏洞挖掘技术浅谈 326
16.1 漏洞挖掘概述 326
16.2 Fuzz文件格式 327
16.2.1 File Fuzz简介 327
16.2.2 用Paimei实践File Fuzz 328
16.3 Fuzz网络协议 330
16.3.1 协议测试简介 330
16.3.2 SPIKE的Fuzz原理 332
16.3.3 SPIKE的Hello World 333
16.3.4 定义Block 334
16.3.5 生成Fuzz用例 336
16.4 Fuzz ActiveX 340
16.5 静态代码审计 343
第17章 安全的软件生命周期 346
17.1 Threat Modeling 346
17.2 编写安全的代码 347
17.3 产品安全性测试 349
17.4 漏洞管理与应急响应 351
参考文献 354
关于“zero day attack”
0 day是网络安全技术中的一个术语,特指被攻击者掌握却未被软件厂商修复的系统漏洞。
0 day漏洞是攻击者入侵系统的终极武器,资深的黑客手里总会掌握几个功能强大的0 day漏洞。
0 day漏洞是木马、病毒、间谍软件入侵系统的最有效途径。
由于没有官方发布的安全补丁,攻击者可以利用0 day对目标主机为所欲为,甚至在Internet上散布蠕虫。因此,0 day漏洞的技术资料通常非常敏感,往往被视为商业机密。
对于软件厂商和用户来说,0 day攻击是危害最大的一类攻击。
针对0 day漏洞的缓冲区溢出攻击是对技术性要求最高的攻击方式。
世界安全技术峰会Black Hat上每年最热门的议题之一就是“zero day attack/defense”。微软等世界著名的软件公司为了在其产品中防范“zero day attack”,投入了大量的人力、物力。
全世界有无数的信息安全科研机构在不遗余力地研究与0 day安全相关的课题。
全世界也有无数技术精湛的攻击者在不遗余力地挖掘软件中的0 day漏洞。
自 序
不请长缨,系取天骄种,剑吼西风
——《六州歌头》北宋,贺铸
虽然事隔多年,我仍然清晰记得自己被“冲击波”愚弄的场景——2003年夏的那个晚上,自己像往常一样打开实验室的计算机,一边嘲笑着旁边同学因为不装防火墙而被提示系统将在一分钟内关机,一边非常讽刺地在自己的计算机上发现了同样的提示对话框。正是这个闻名世界的“框框”坚定了我投身网络安全研究的信念,而漏洞分析与利用正是这个领域的灵魂所在。
漏洞分析与利用的过程是充满艺术感的。想象一下,剥掉Windows中那些经过层层封装的神秘的对话框“外衣”,面对着浩如烟海的二进制机器码,跋涉于内存中不知所云的海量数据,在没有任何技术文档可以参考的情况下,进行反汇编并调试,把握函数调用和参数传递的细节,猜测程序的设计思路,设置巧妙的断点并精确定位到几行有逻辑缺陷的代码,分析研究怎么去触发这个逻辑漏洞,最后编写出天才的渗透代码,从而得到系统的控制权……这些分析过程的每一个环节无不散发着充满智慧的艺术美感!这种技术不同于其他计算机技术,它的进入门槛很高,需要拥有丰富的计算机底层知识、精湛的软件调试技术、非凡的逻辑分析能力,还要加上一点点创造性的思维和可遇而不可求的运气。
在无数个钻研这些技术的夜里,我深深地感觉到国内的漏洞分析资料和文献是多么匮乏。为了真正搞清楚蠕虫病毒是怎样利用Windows漏洞精确淹没EIP寄存器并获得进程控制权,我仍然记得自己不得不游走于各种论坛收集高手们零散手稿时的情形。那时的我多么希望能有一本教材式的书籍,让我读了之后比较全面、系统地了解这个领域。
我想,在同样漆黑的夜里,肯定还有无数朋友和我从前一样,满腔热情地想学习这门技术而又困惑于无从下手。正是这种“请缨无处,剑吼西风”的感觉,激励着我把自己钻研的心血凝结成一本教程,希望这样一本教程可以帮助喜欢网络安全的朋友们在学习时绕开我曾走过的弯路。
failwest
2008年3月1日
关于安全技术人才
国内外对网络安全技术人才的需求量很大,精通缓冲区溢出攻击的安全专家可以在大型软件公司轻易地获得高薪的安全咨询职位。
信息安全技术是一个对技术性要求极高的领域,除了扎实的计算机理论基础外,更重要的是优秀的动手实践能力。在我看来,不懂二进制数据就无从谈起安全技术。
国内近年来对网络安全的重视程度正在逐渐增加,许多高校相继成立了“信息安全学院”或者设立“网络安全专业”。科班出身的学生往往具有扎实的理论基础,他们通晓密码学知识、知道PKI体系架构,但要谈到如何真刀实枪地分析病毒样本、如何拿掉PE上复杂的保护壳、如何在二进制文件中定位漏洞、如何对软件实施有效的攻击测试……能够做到的人并不多。
虽然每年有大量的网络安全技术人才从高校涌入人力市场,真正能够满足用人单位需求的却寥寥无几。捧着书本去做应急响应和风险评估是滥竽充数的作法,社会需要的是能够为客户切实解决安全风险的技术精英,而不是满腹教条的阔论者。
我所认识的很多资深安全专家都并非科班出身,他们有的学医、有的学文、有的根本没有学历和文凭,但他们却技术精湛,充满自信。
这个行业属于有兴趣、够执著的人,属于为了梦想能够不懈努力的意志坚定者。
关于“Impossible”与“I’m possible”
从拼写上看,“Impossible”与“I’m possible”仅仅相差一个用于缩写的撇号(apostrophe)。学完本书之后,您会发现将“不可能(Impossible)”变为“可能(I’m possible)”的“关键(key point)”往往就是那么简单的几个字节,本书将要讨论的就是在什么位置画上这一撇!
从语法上看,“Impossible”是一个单词,属于数据的范畴;“I’m possible”是一个句子,含有动词(算符),可以看成是代码的范畴。学完本书之后,您会明白现代攻击技术的精髓就是混淆数据和代码的界限,让系统错误地把数据当作代码去执行。
从意义上看,To be the apostrophe which changed “Impossible” into “I’m possible” 代表着人类挑战自我的精神,代表着对理想执著的追求,代表着对事业全情的投入,代表着敢于直面惨淡人生的豪情……而这一切正好是黑客精神的完美诠释——还记得在电影《Sword Fish(剑鱼行动)》中,Stan在那台酷毙的计算机前坚定地说:“Nothing is impossible”,然后开始在使用Vernam加密算法和512位密钥加密的网络上,挑战蠕虫的经典镜头吗?
于是我在以前所发表过的所有文章和代码中都加入了这个句子,甚至用它作为自己的签名档。
尽管我的英语老师和不少外国朋友提醒我,说这个句子带有强烈的“Chinglish”味道,甚至会引起Native Speaker的误解,然而我最终还是决定把它写进书里。
虽然我不是莎士比亚那样的文豪,可以创造语言,发明修辞,用文字撞击人们的心灵,但这句“Chinglish”的确能把我所要表达的含义精确地传递给中国人,这已足够。
关于本书
通常情况下,利用缓冲区溢出漏洞需要深入了解计算机系统,精通汇编语言乃至二进制的机器代码,这足以使大多数技术爱好者望而却步。
随着时间的推移,缓冲区溢出攻击在漏洞的挖掘、分析、调试、利用等环节上已经形成了一套完整的体系。伴随着调试技术和逆向工程的发展,Windows平台下涌现出的众多功能强大的debug工具和反汇编分析软件逐渐让二进制世界和操作系统变得不再神秘,这有力地推动了Windows平台下缓冲区溢出的研究。除此以外,近年来甚至出现了基于架构(Frame Work)的漏洞利用程序开发平台,让这项技术的进入门槛大大降低,使得原本高不可攀的黑客技术变得不再遥不可及。
遗憾的是,与国外飞速发展的高级黑客技术相比,目前国内还没有系统介绍Windows平台下缓冲区溢出漏洞利用技术的专业书籍,而且相关的中文文献资料也非常匮乏。
本书将系统全面地介绍Windows平台软件缓冲区溢出漏洞的发现、检测、分析和利用等方面的知识。
为了保证这些技术能够被读者轻松理解并掌握,本书在叙述中尽量避免枯燥乏味的大段理论阐述和代码粘贴。概念只有在实践中运用后才能真正被掌握,这是我多年来求学生涯的深刻体会。书中所有概念和方法都会在紧随其后的调试实验中被再次解释,实验和案例是本书的精髓所在。从为了阐述概念而精心自制的漏洞程序调试实验到现实中已经造成很大影响的著名漏洞分析,每一个调试实验都有着不同的技术侧重点,每一个漏洞利用都有自己的独到之处。
我将带领您一步一步地完成调试的每一步,并在这个过程中逐步解释漏洞分析思路。不管您是网络安全从业人员、黑客技术发烧友、网络安全专业的研究生或本科生,如果您能够完成这些分析实验,相信您的软件调试技术、对操作系统底层的理解等计算机能力一定会得到一次质的飞跃,并能够对安全技术有一个比较深入的认识。
本书内容导读
本书分为4篇,共17章。
第1篇 基础知识
第1章 漏洞概述
简介漏洞研究中的一些基础概念和原理
第2章 二进制文件概述
不管是漏洞挖掘,漏洞分析还是漏洞利用,我们所面对的都是二进制、机器码、内存地址。第2章将简单介绍Windows平台下可执行文件的结构和内存方面的一些基础知识。PE文件和虚拟内存的细节枯燥乏味,长篇累牍地介绍很容易让人失去学习的兴趣和激情。但在进行静态反汇编和动态调试的过程中,如果没有PE和虚拟内存方面的基础知识,您甚至无法把反汇编的内容和正在执行的指令对应起来。根据漏洞分析的特点,这章给出了调试漏洞所必须的二进制基础知识。
第3章 必备工具
第3章介绍了一批漏洞分析中经常使用的软件工具。包括调试工具、反汇编工具、二进制编辑工具等。您会在后面的调试实验中反复见到这些工具的身影。在这章的最后一节,我设计了一个非常简单的破解小实验,用于实践工具的应用,消除您对二进制的恐惧感,希望能够给您带来一些乐趣。
第2篇 漏洞利用
第4章 栈溢出利用
基于栈的溢出是最基础的漏洞利用方法。第4章首先用大量的示意图,深入浅出地讲述了操作系统中函数调用、系统栈操作等概念和原理;随后通过三个调试实验逐步讲解如何通过栈溢出,一步一步地劫持进程并植入可执行的机器代码。即使您没有任何汇编语言基础,从未进行过二进制级别的调试,在本章详细的实验指导下也能轻松完成实验,体会到exploit的乐趣。
第5章 开发shellcode的艺术
第5章紧接第4章的讨论,比较系统地介绍了溢出发生后,如何布置缓冲区、如何定位shellcode、如何编写和调试shellcode等实际的问题。第5章的最后两小节还给出了一些编写shellcode的高级技术,供有一定汇编基础的朋友参考。
第6章 堆溢出利用
在很长一段时间内,Windows下的堆溢出被认为是不可利用的,然而事实并非如此。第6章将用精辟的论述点破堆溢出利用的原理,让您轻松领会堆溢出的精髓。此外,这章的一系列调试实验将加深您对概念和原理的理解。用通俗易懂的方式论述复杂的技术是本书始终坚持的原则。
第7章 Windows异常处理机制深入浅出
对异常处理的利用是Windows平台下缓冲区溢出漏洞利用的一大特点。第7章除了介绍如何在溢出发生时利用S.E.H外,还对Windows异常处理机制做了较深入的剖析,供有一定基础的读者参考。
第8章 高级内存攻击技术
集中介绍了一些曾发表于Black Hat上的著名论文中所提出的高级利用技术。对于安全专家,了解这些技巧和手法不至于在分析漏洞时错把可以利用的漏洞误判为低风险类型;对于黑客技术爱好者,这些知识很可能成为激发技术灵感的火花。
第9章 揭秘Windows安全机制
微软在Windows XP SP2和Windows 2003之后,向操作系统中加入了许多安全机制。本章将集中讨论这些安全机制对漏洞利用的影响。
第10章 用MetaSploit开发Exploit
MetaSploit是软件工程中的Frame Work(架构)在安全技术中的完美实现,它把模块化、继承性、封装等面向对象的特点在漏洞利用程序的开发中发挥得淋漓尽致。使用这个架构开发Exploit要比直接使用C语言写出的Exploit简单得多。第10章将集中介绍如何使用这个架构进行Exploit开发,这也将是第一次在中文书籍中集中介绍MetaSploit通用漏洞测试平台。
第11章 其他漏洞利用技术
格式化串漏洞在Windows平台上非常罕见,所以我把这种漏洞利用单独放在本章介绍。除此以外,由于脚本注入漏洞与缓冲区溢出漏洞的攻防在技术上差异较大,故也被安排在这章。鉴于基于Web的漏洞利用种目繁杂,且自成体系,本书目前只做了简单的介绍。如有机会,我将单独著书述之。
第3篇 漏洞分析
第12章 漏洞分析技术概述
第12章纵览了漏洞分析与调试的思路,并介绍了一些辅助漏洞调试分析的高级逆向工具。
第13章 MS06-040分析:系统入侵与蠕虫
通过对真实案例的分析,彻底揭秘攻击者入侵操作系统的全过程。在您获得操作系统控制权限的那一刻,相信伴随着强烈的成就感,您也将切身体会0day的真正危害和安全补丁的重要性。
第14章 MS06-055分析:揭秘“网马”
通过网页“挂马”是近年来攻击者惯用的手法。本章通过分析微软IE浏览器中真实的缓冲区溢出漏洞,告诉您为什么不能随便点击来历不明的URL链接。
第15章 MS07-060分析:Word文档中的阴谋
稍懂计算机知识的人都不会随便点击可执行文件,但是谁会想到打
无封面