第1篇 基础知识 2
第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篇 漏洞利用 38
第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 突破密码验证程序 52
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
53.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“减肥” 119
5.6.1 shellcode瘦身大法 119
5.6.2 选择恰当的hash算法 121
5.6.3 191个字节的bindshell 124
第6章 堆溢出利用 141
6.1 堆的工作原理 141
6.1.1 Windows堆的历史 141
6.1.2 堆与栈的区别 142
6.1.3 堆的数据结构与管理策略 143
6.2 在堆中漫游 149
6.2.1 堆分配函数之间的调用关系 149
6.2.2 堆的调试方法 150
6.2.3 识别堆表 154
6.2.4 堆块的分配 158
6.2.5 堆块的释放 159
6.2.6 堆块的合并 160
6.3 堆溢出利用(上)——DWORD SHOOT 161
6.3.1 链表“拆卸”中的问题 161
6.3.2 在调试中体会“DWORD SHOOT” 164
6.4 堆溢出利用(下)——代码植入 168
6.4.1 DWORD SHOOT的利用方法 168
6.4.2 狙击P.E.B中RtlEnterCritical-Section()的函数指针 169
6.4.3 堆溢出利用的注意事项 176
第7章 Windows异常处理机制深入浅出 179
7.1 S.E.H概述 179
7.2 在栈溢出中利用S.E.H 181
7.3 在堆溢出中利用S.E.H 187
7.4 挖掘Windows异常处理 190
7.4.1 不同级别的S.E.H 190
7.4.2 线程的异常处理 191
7.4.3 进程的异常处理 194
7.4.4 系统默认的异常处理U.E.F 195
7.4.5 异常处理流程的总结 196
7.5 V.E.H简介 197
第8章 高级内存攻击技术 199
8.1 狙击异常处理机制 199
8.1.1 攻击V.E.H链表的头节点 199
8.1.2 攻击TEB中的S.E.H头节点 200
8.1.3 攻击U.E.F 201
8.1.4 攻击PEB中的函数指针 203
8.2 “offby one”的利用 203
8.3 攻击C++的虚函数 205
8.4 Heap Spray:堆与栈的协同攻击 209
第9章 揭秘Windows安全机制 213
9.1 Service Pack 2简介 213
9.2 百密一疏的S.E.H验证 215
9.3 栈中的较量 215
9.3.1 .net中的GS安全编译选项 215
9.3.2 GS机制面临的挑战 217
9.4 重重保护下的堆 218
9.5 硬件方面的安全措施 220
第10章 用MetaSploit开发Exploit 222
10.1 漏洞测试平台MSF简介 222
10.2 入侵Windows系统 224
10.2.1 漏洞简介 224
10.2.2 图形界面的漏洞测试 225
10.2.3 console界面的漏洞测试 229
10.3 利用MSF制作shellcode 230
10.4 用MSF扫描“跳板” 232
10.5 Ruby语言简介 233
10.6 “傻瓜式”Exploit开发 239
10.7 用MSF发布POC 248
第11章 其他漏洞利用技术 251
11.1 格式化串漏洞 251
11.1.1 printf中的缺陷 251
11.1.2 用printf读取内存数据 253
11.1.3 用printf向内存写数据 254
11.1.4 格式化串漏洞的检测与防范 255
11.2 SQL注入攻击 256
11.2.1 SQL注入原理 256
11.2.2 攻击PHP+MySQL网站 257
11.2.3 攻击ASP+SQL Server网站 260
11.2.4 注入攻击的检测与防范 261
11.3 XSS攻击 262
11.3.1 脚本能够“跨站”的原因 262
11.3.2 XSS Reflection攻击场景 264
11.3.3 Stored XSS攻击场景 265
11.3.4 攻击案例回顾:XSS蠕虫 266
11.3.5 XSS的检测与防范 267
第3篇 漏洞分析 270
第12章 漏洞分析技术概述 270
12.1 漏洞分析的方法 270
12.2 用“白眉”在PE中漫步 271
12.2.1 指令追踪技术与Paimei 271
12.2.2 Paimei的安装 272
12.2.3 使用PE Stalker 273
12.2.4 迅速定位特定功能对应的代码 276
12.3 补丁比较 278
第13章 MS06-040分析:系统入侵与蠕虫 282
13.1 MS06-040简介 282
13.2 漏洞分析 283
13.2.1 动态调试 283
13.2.2 静态分析 292
13.3 远程Exploit 297
13.3.1 RPC编程简介 297
13.3.2 实现远程exploit 299
13.3.3 改进exploit 306
13.3.4 MS06-040与蠕虫 308
第14章 MS06-055分析:揭秘“网马” 310
14.1 MS06-055简介 310
14.1.1 矢量标记语言(VML)简介 310
14.1.2 0 day安全响应纪实 311
14.2 漏洞分析 312
14.3 漏洞利用 315
14.3.1 实践Heap Spray技术 315
14.3.2 网页木马攻击 319
第15章 MS07-060分析:Word文档中的阴谋 321
15.1 MS07-060简介 321
15.2 POC分析 322
第4篇 漏洞挖掘与软件安全性测试 330
第16章 漏洞挖掘技术浅谈 330
16.1 漏洞挖掘概述 330
16.2 Fuzz文件格式 331
16.2.1 File Fuzz简介 331
16.2.2 用Paimei实践File Fuzz 332
16.3 Fuzz网络协议 334
16.3.1 协议测试简介 334
16.3.2 SPIKE的Fuzz原理 336
16.3.3 SPIKE的Hello World 337
16.3.4 定义Block 338
16.3.5 生成Fuzz用例 340
16.4 Fuzz ActiveX 344
16.5 静态代码审计 347
第17章 安全的软件生命周期 350
17.1 Threat Modeling 350
17.2 编写安全的代码 351
17.3 产品安全性测试 353
17.4 漏洞管理与应急响应 356
参考文献 358