第Ⅰ部分 扩展缓冲区溢出 3
第1章 缓冲区溢出的基本概念 3
1.1 简介 4
1.2 软件安全危机 4
1.3 缓冲区溢出的增加 8
1.4 exploits与缓冲区溢出 9
1.5 定义 11
1.5.1 硬件 11
1.5.2 软件 11
1.5.3 安全 15
1.7 快速解决方案 16
1.6 小结 16
1.8 网站链接 17
1.9 邮件清单 17
1.10 常见问题 18
第2章 理解shellcode 19
2.1 简介 20
2.2 shellcode概述 20
2.3 空字节问题 27
2.4 实现系统调用 28
2.5 远程shellcode 30
2.5.1 端口绑定shellcode 30
2.5.2 套接字描述符重用shellcode 32
2.6.1 execve shellcode 33
2.6 本地shellcode 33
2.6.2 setuid shellcode 35
2.6.3 chroot shellcode 36
2.7 小结 41
2.8 快速解决方案 41
2.9 网站链接 42
2.10 邮件清单 42
2.11 常见问题 43
第3章 编写shellcode 45
3.1 简介 46
3.2 shellcode示例 46
3.2.1 Write系统调用 49
3.2.2 execve shellcode 52
3.2.3 端口绑定shellcode 60
3.2.4 反向连接shellcode 70
3.2.5 套接口重用shellcode 73
3.2.6 重用文件描述符 75
3.2.7 shellcode编码 81
3.3 重用程序变量 86
3.3.1 公开的源程序 87
3.3.2 关闭的源程序 88
3.4 操作系统间的shellcode 90
3.5 理解已有的shellcode 91
3.7 快速解决方案 95
3.6 小结 95
3.8 网站链接 96
3.9 邮件清单 97
3.10 常见问题 97
第4章 Win32汇编语言 99
4.1 简介 100
4.2 应用程序的内存布置 100
4.2.1 应用程序结构 102
4.2.2 内存分配——堆栈 103
4.2.3 内存分配——堆 103
4.3 Windows汇编 104
4.3.1 寄存器 104
4.3.2 Hello World 107
4.4 小结 109
4.5 快速解决方法 109
4.6 网站链接 110
4.7 常见问题 110
案例分析1.1 FreeBSD NN Exploit代码 114
案例分析1.2 xlockmore用户提供的格式化字符串 118
案例分析1.3 使用Winsock的Frontpage的拒绝服务 122
案例分析1.4 FreeBSD上的cURL缓冲区溢出 133
第Ⅱ部分 缓冲区溢出解析 139
第5章 堆栈溢出 139
5.1 简介 140
5.2.1 寄存器 141
5.2 Intel x86结构和机器语言基础 141
5.2.2 堆栈和程序调用 142
5.2.3 调用规则和堆栈结构 148
5.2.4 进程内存布局 156
5.3 堆栈溢出和它们的利用 157
5.3.1 简单的溢出 158
5.3.2 创建一个可利用的溢出的实例程序 162
5.3.3 执行exploit 164
5.4 什么是Off-by-One溢出? 174
5.5 寻找堆栈溢出的挑战 183
5.5.1 词汇分析 184
5.5.2 语义分析器 186
5.5.3 应用程序保护 187
5.5.4 OpenBSD2.8 ftpd的off-by-one错误 187
5.5.5 Apache htpasswd缓冲区溢出 188
5.6 小结 189
5.7 快速解决方案 191
5.8 网站链接 192
5.9 邮件清单 192
5.10 常见问题 192
第6章 堆腐烂 195
6.1 简介 196
6.2 简单堆腐烂 196
6.2.1 使用堆——malloc()、calloc()和realloc() 197
6.2.2 简单的堆和BSS溢出 198
6.2.3 腐烂C++中的函数指针 200
6.3 高级堆腐烂—Doug Lea malloc 203
6.3.1 Doug Lea malloc概述 203
6.3.2 内存组织——边界标志、箱(Bins)和场域(Arenas) 204
6.3.3 free()算法 208
6.3.4 伪数据块 209
6.3.5 易受攻击程序示例 211
6.3.6 利用frontlink() 213
6.3.7 堆上的Off-by-One和Off-by-Five 214
6.4 高级堆腐烂——System V malloc 215
6.5 应用程序防御 225
6.6 小结 227
6.7 快速解决方案 228
6.7.1 简单堆腐烂 228
6.7.2 高级堆腐烂——Doug Lea malloc 228
6.7.3 高级堆腐烂——System V malloc 228
6.7.4 应用程序防御 228
6.8 网站链接 229
6.9 常见问题 230
第7章 可移植的网络编程 231
7.2 什么是格式化字符串 232
7.2.1 带有不定数量参数的C函数 232
7.1 简介 232
7.2.2 省略和va_args 233
7.2.3 格式化输出的函数 235
7.3 使用格式化字符串 237
7.3.1 printf()例子 237
7.3.2 格式化符号和printf()参数 238
7.3.3 格式标识符的类型 239
7.4 误用格式化字符串 240
7.4.1 对坏的格式化字符串进行操作 242
7.4.2 拒绝服务 243
7.4.3 读取存储器 244
7.4.4 存储器写入 246
7.5 利用格式化字符串缺陷的挑战 251
7.5.1 寻找格式化字符串缺陷 251
7.5.2 覆盖什么 253
7.5.3 操作系统的差别 259
7.5.4 利用不同系统的困难 261
7.6 应用程序防御 261
7.7 小结 263
7.8 快速解决方案 264
7.9 网站链接 265
7.10 常见问题 265
第8章 Windows缓冲区溢出 267
8.1.1 背景 268
8.1.2 基本的堆栈溢出 268
8.1 简介 268
8.1.3 编写Windows shellcode 274
8.1.4 克服特殊的字符(例如空字节) 280
8.1.5 客户端服务器应用程序 285
8.1.6 使用/误用结构化异常处理器 295
8.2 小结 300
8.3 问题快速解决方案 301
8.4 网站链接 302
8.5 常见问题 302
案例分析2.1 Linux中的cURL缓冲区溢出 306
案例分析2.2 异常客户端密钥远程缓冲区溢出漏洞 311
案例分析2.3 X11 R6 4.2 XLOCALEDIR溢出 322
案例分析2.4 微软MDAC拒绝服务漏洞 327
案例分析2.5 本地UUX缓冲区在HPUX上溢出 339
第Ⅲ部分 查找缓冲区溢出 345
第9章 从源代码中找出缓冲区溢出 345
9.1 简介 346
9.2 源代码分析 346
9.3 免费开放源代码工具 348
9.3.1 Application Defence Snapshot 348
9.3.2 RATS 350
9.3.3 Flawfinder 353
9.3.4 ITS4 359
9.4 Application Defense——企业开发版 359
9.5 Secure Software公司 363
9.5.1 结构和部署 364
9.5.2 缺陷知识库 364
9.5.3 使用CodeAssure 365
9.5.4 补救措施 371
9.6 Ounce Labs公司 371
9.6.1 Prexis的自动化分析科学 372
9.6.2 Prexis结构 372
9.6.3 Prexis的运用 373
9.6.4 Prexis的缺陷评估 374
9.7 Fortify Software公司 378
9.7.2 使用源代码分析引擎 379
9.7.1 Fortify源代码分析工具 379
9.7.3 核查工作台 381
9.7.4 软件安全管理软件 384
9.8 小结 386
9.9 快速解决方案 386
9.10 网站链接 387
9.11 常见问题 388
案例分析3.1 InlineEgg Ⅰ 390
案例分析3.2 InlineEgg Ⅱ 392
案例分析3.3 Seti@Home Exploit代码 395
案例分析3.4 微软公司CodeBlue Exploit代码 402
附录A 完整的数据换算表 407
附录B 有用的系统调用函数 408