第 1章 网络基础 1
1.1 网络架构与协议 1
1.2 互联网协议套件 2
1.3 数据封装 4
1.3.1 报头、报尾和地址 4
1.3.2 数据传输 6
1.4 网络路由 6
1.5 我的网络协议分析模型 8
1.6 总结 9
第 2章 捕获应用程序流量 11
2.1 被动网络流量捕获 11
2.2 Wireshark快速入门 12
2.3 其他的被动捕获技术 14
2.3.1 系统调用跟踪 14
2.3.2 Linux上的strace实用工具 15
2.3.3 使用DTrace监控网络连接 16
2.3.4 Windows上的Process Monitor 17
2.4 被动捕获的优缺点 19
2.5 主动网络流量捕获 19
2.6 网络代理 20
2.6.1 端口转发代理 20
2.6.2 SOCKS代理 23
2.6.3 HTTP代理 28
2.6.4 转发HTTP代理 29
2.6.5 反向HTTP代理 31
2.7 总结 34
第3章 网络协议结构 35
3.1 二进制协议结构 35
3.1.1 数值型数据 36
3.1.2 布尔值 39
3.1.3 位标志 39
3.1.4 二进制字节序 39
3.1.5 文本与人类可读的数据 40
3.1.6 可变长度的二进制数据 44
3.2 日期和时间 46
3.2.1 POSIX/UNIX时间 47
3.2.2 Windows的FILETIME 47
3.3 标记、长度、值模式 47
3.4 多路复用与分片 48
3.5 网络地址信息 49
3.6 结构化二进制格式 50
3.7 文本协议结构 51
3.7.1 数值型数据 51
3.7.2 文本布尔型 52
3.7.3 日期和时间 52
3.7.4 长度可变的数据 52
3.7.5 结构化的文本格式 53
3.8 编码二进制数据 55
3.8.1 十六进制(Hex)编码 55
3.8.2 Base64 56
3.9 总结 58
第4章 高级应用程序流量捕获 59
4.1 重路由流量 59
4.1.1 使用traceroute 60
4.1.2 路由表 61
4.2 配置路由器 62
4.2.1 在Windows上启用路由 62
4.2.2 在类UNIX系统上启用路由 63
4.3 网络地址转换 63
4.3.1 启用SNAT 64
4.3.2 在Linux上配置SNAT 65
4.3.3 启用DNAT 65
4.4 将流量转发到网关 67
4.4.1 DHCP欺骗 67
4.4.2 ARP毒化 69
4.5 总结 72
第5章 分析线上流量 73
5.1 流量生成应用程序:SuperFunkyChat 73
5.1.1 启动服务器 74
5.1.2 启动客户端 74
5.1.3 客户端之间的通信 75
5.2 Wireshark分析速成课 75
5.2.1 生成网络流量并捕获数据包 76
5.2.2 基础分析 78
5.2.3 读取TCP会话中的内容 79
5.3 使用Hex Dump(十六进制转储)识别数据包结构 80
5.3.1 观察单个数据包 80
5.3.2 确定协议结构 81
5.3.3 检验我们的假设 83
5.3.4 使用Python剖析协议 84
5.4 使用Lua开发Wireshark解析器 89
5.4.1 创建剖析器 91
5.4.2 Lua剖析 93
5.4.3 解析消息数据包 94
5.5 使用代理来主动分析流量 96
5.5.1 设置代理 97
5.5.2 使用代理进行协议分析 99
5.5.3 添加基本的协议解析 100
5.5.4 修改协议行为 102
5.6 总结 103
第6章 应用程序逆向工程 105
6.1 编译器、解释器和汇编程序 106
6.1.1 解释型语言 106
6.1.2 编译型语言 106
6.1.3 静态链接与动态链接的对比 107
6.2 x86架构 108
6.2.1 指令集架构 108
6.2.2 CPU寄存器 109
6.2.3 程序流 111
6.3 操作系统基础 112
6.3.1 可执行文件格式 112
6.3.2 段(节) 113
6.3.3 进程与线程 113
6.3.4 操作系统网络接口 114
6.3.5 应用程序二进制接口(ABI) 116
6.4 静态逆向工程 117
6.4.1 IDA Pro免费版本的快速入门 118
6.4.2 分析栈变量与参数 120
6.4.3 识别关键功能 121
6.5 动态逆向工程 126
6.5.1 设置断点 126
6.5.2 调试器窗口 126
6.5.3 在哪里设置断点 128
6.6 托管语言的逆向工程 128
6.6.1 .NET应用程序 128
6.6.2 使用ILSpy 129
6.6.3 Java应用程序 132
6.6.4 处理代码混淆问题 133
6.7 总结 134
第7章 网络协议安全 135
7.1 加密算法 136
7.1.1 替换密码 136
7.1.2 异或加密 137
7.2 随机数生成器 138
7.3 对称密钥加密学 139
7.3.1 块密码 139
7.3.2 块密码模式 142
7.3.3 块密码填充 144
7.3.4 填充预言机攻击 145
7.3.5 流密码 147
7.4 非对称密钥加密学 148
7.4.1 RSA算法 149
7.4.2 RSA填充 150
7.4.3 Diffie-Hellman密钥交换 151
7.5 签名算法 152
7.5.1 加密哈希算法 152
7.5.2 非对称签名算法 153
7.5.3 消息认证码 154
7.6 公钥基础设施 156
7.6.1 X.509证书 157
7.6.2 验证证书链 158
7.7 案例研究:传输层安全 159
7.7.1 TLS握手 159
7.7.2 初始化协商 160
7.7.3 端点身份验证 161
7.7.4 建立加密机制 162
7.7.5 满足安全要求 162
7.8 总结 164
第8章 实现网络协议 165
8.1 重放已捕获的网络流量 165
8.1.1 使用Netcat捕捉流量 166
8.1.2 使用Python重新发送捕获的UDP流量 168
8.1.3 重新利用我们的分析代理 169
8.2 重用现有的可执行代码 174
8.2.1 重用.NET应用程序的代码 175
8.2.2 重用Java应用程序的代码 179
8.2.3 非托管的可执行文件 181
8.3 加密技术及TLS的处理方法 186
8.3.1 了解正在使用中的加密技术 186
8.3.2 解密TLS流量 187
8.4 总结 192
第9章 漏洞的根本原因 193
9.1 漏洞类别 193
9.1.1 远程代码执行 194
9.1.2 拒绝服务 194
9.1.3 信息泄露 194
9.1.4 验证绕过 194
9.1.5 权限绕过 195
9.2 内存损坏漏洞 195
9.2.1 内存安全编程语言与内存不安全编程语言的对比 195
9.2.2 内存缓冲区溢出 196
9.2.3 缓冲区索引越界 201
9.2.4 数据膨胀攻击 202
9.2.5 动态内存分配失败 203
9.3 默认凭据或硬编码凭据 203
9.4 用户枚举 204
9.5 不正确的资源访问 205
9.5.1 规范化 205
9.5.2 详细错误 207
9.6 内存耗尽攻击 208
9.7 存储耗尽攻击 209
9.8 CPU耗尽攻击 209
9.8.1 算法复杂度 209
9.8.2 可配置的密码学 211
9.9 格式化字符串漏洞 212
9.10 命令行注入 213
9.11 SQL注入 214
9.12 文字编码字符替换 215
9.13 总结 216
第 10章 查找和利用安全漏洞 217
10.1 模糊测试 217
10.1.1 最简单的模糊测试 218
10.1.2 变异模糊测试器 218
10.1.3 生成测试用例 219
10.2 漏洞分类筛选 219
10.2.1 调试应用程序 220
10.2.2 提高找出程序崩溃根本原因的概率 226
10.3 利用常见的漏洞 228
10.3.1 利用内存损坏漏洞 229
10.3.2 任意内存写入漏洞 235
10.4 编写shell code 238
10.4.1 入门 238
10.4.2 简单的调试技术 240
10.4.3 调用系统调用 241
10.4.4 执行其他程序 246
10.4.5 使用Metasploit生成shell code 247
10.5 内存损坏利用的缓解措施 249
10.5.1 数据执行保护 249
10.5.2 ROP的反漏洞利用技术 250
10.5.3 地址空间布局随机化(ASLR) 252
10.5.4 使用内存金丝雀检测栈溢出 255
10.6 总结 257
附录A 网络协议分析套件 258