第1章 简介 1
第2章 程序设计 4
2.1 什么是程序设计 4
2.2 伪代码 5
2.3 控制结构 6
2.3.1 If-Then-Else 6
2.3.2 While/Until循环 7
2.3.3 For循环 8
2.4 更多程序设计的基本概念 9
2.4.1 变量 9
2.4.2 算术运算符 9
2.4.3 比较运算符 11
2.4.4 函数 12
2.5 自己动手 15
2.5.1 考虑全局 16
2.5.2 x86处理器 19
2.5.3 汇编语言 20
2.6 回到基础 31
2.6.1 字符串 31
2.6.2 Signed、Unsigned、Long和Short 35
2.6.3 指针 37
2.6.4 格式化字符串 41
2.6.5 强制类型转换 44
2.6.6 命令行参数 50
2.6.7 变量作用域 54
2.7 存储器分段 61
2.7.1 C语言中的存储器分段 67
2.7.2 使用堆 68
2.7.3 对malloc()进行错误检查 71
2.8 利用基础知识构建程序 72
2.8.1 文件访问 72
2.8.2 文件权限 77
2.8.3 User ID 79
2.8.4 结构 87
2.8.5 函数指针 90
2.8.6 伪随机数 91
2.8.7 赌博游戏 93
第3章 漏洞发掘 107
3.1 漏洞发掘通用技巧 109
3.2 缓冲区溢出 109
3.3 使用BASH进行实验 124
3.4 其他段中的溢出 139
3.4.1 一种基本的基于堆的溢出 139
3.4.2 函数指针溢出 144
3.5 格式化字符串 157
3.5.1 格式化参数 157
3.5.2 格式化字符串漏洞 159
3.5.3 读取任意存储地址的内容 161
3.5.4 向任意存储地址写入 162
3.5.5 直接参数访问 169
3.5.6 利用写入short类型的值 170
3.5.7 用.dtors间接修改 172
3.5.8 另一个notesearch漏洞 177
3.5.9 重写全局偏移表 179
第4章 网络 183
4.1 OSI模型 183
4.2 套接字 185
4.2.1 套接字函数 185
4.2.2 套接字地址 187
4.2.3 网络字节顺序 189
4.2.4 Internet地址转换 189
4.2.5 一个简单的服务器示例 189
4.2.6 一个Web客户端示例 193
4.2.7 一个Tinyweb服务器 198
4.3 揭示较低层的细节 202
4.3.1 数据链路层 203
4.3.2 网络层 204
4.3.3 传输层 206
4.4 网络窃听 208
4.4.1 原始套接字窃听 211
4.4.2 libpcap窃听 212
4.4.3 对层进行解码 214
4.4.4 活动窃听 223
4.5 拒绝服务 236
4.5.1 SYN泛洪 236
4.5.2 死亡之ping 240
4.5.3 泪滴 240
4.5.4 ping泛洪 241
4.5.5 放大攻击 241
4.5.6 分布式DoS泛洪 242
4.6 TCP/IP劫持 242
4.6.1 RST劫持 243
4.6.2 继续劫持 247
4.7 端口扫描 247
4.7.1 秘密SYN扫描 248
4.7.2 FIN、X-mas和Null扫描 248
4.7.3 欺骗诱饵 249
4.7.4 空闲扫描 249
4.7.5 主动防御(屏蔽) 250
4.8 发动攻击 256
4.8.1 利用GDB进行分析 257
4.8.2 非常危险的做法 259
4.8.3 将shellcode绑定到端口 262
第5章 shellcode 265
5.1 汇编语言与C语言的对比 265
5.2 通向shellcode之路 270
5.2.1 使用堆栈的汇编语言指令 270
5.2.2 用GDB系统地检查 272
5.2.3 删除全零字节 273
5.3 shell衍生shellcode 278
5.3.1 特权问题 281
5.3.2 更简短的代码 284
5.4 端口绑定shellcode 285
5.4.1 复制标准文件描述符 289
5.4.2 分支控制结构 291
5.5 反向连接shellcode 296
第6章 对策 301
6.1 检测对策 301
6.2 系统守护程序 302
6.2.1 信号速成 303
6.2.2 tinyweb守护程序 305
6.3 交易工具 310
6.4 日志文件 315
6.5 忽视明显的征兆 317
6.5.1 每次一步 317
6.5.2 恢复原程序 321
6.5.3 子劳动者 327
6.6 高级伪装 329
6.6.1 欺骗记录的IP地址 329
6.6.2 无日志漏洞发掘 333
6.7 完整的基础设施 335
6.8 偷运有效载荷 340
6.8.1 字符串编码 340
6.8.2 如何隐藏NOP填充 343
6.9 缓冲区约束 344
6.10 巩固对策 357
6.11 不可执行堆栈 357
6.11.1 ret2libc 358
6.11.2 Returning into system() 358
6.12 随机排列堆栈空间 360
6.12.1 用BASH和GDB进行研究 361
6.12.2 试探Linux-gate 365
6.12.3 实用知识 368
6.12.4 首次尝试 369
6.12.5 算一算成功的概率 370
第7章 密码学 373
7.1 信息理论 373
7.1.1 绝对安全性 374
7.1.2 一次性密码簿 374
7.1.3 量子密钥分配 374
7.1.4 计算安全性 375
7.2 算法运行时间 375
7.3 对称加密 376
7.4 非对称加密 378
7.4.1 RSA 378
7.4.2 Peter Shor的量子因子分解算法 381
7.5 混合密码 382
7.5.1 中途攻击 382
7.5.2 不同SSH协议主机指纹 386
7.5.3 模糊指纹 389
7.6 密码攻击 393
7.6.1 字典攻击 395
7.6.2 穷举暴力攻击 397
7.6.3 散列查找表 399
7.6.4 密码概率矩阵 399
7.7 无线802.11b加密 409
7.7.1 有线等效协议 410
7.7.2 RC4流密码 411
7.8 WEP攻击 412
7.8.1 离线暴力攻击 412
7.8.2 密钥流重用 412
7.8.3 基于IV的解密字典表 413
7.8.4 IP重定向 413
7.8.5 FMS攻击 415
第8章 结束语 425
关于Live CD及问题答案 426
参考文献 427