书籍详情
软件剖析:代码攻防之道
作者:(美)Greg Hoglund,(美)Gary McGraw编著;邓劲生翻译
出版社:清华大学出版社
出版时间:2005-01-01
ISBN:9787302104452
定价:¥39.90
购买这本书可以去
内容简介
本书详细解释了恶意的软件攻击者所采用的技术,描述了各种攻击模式,并且展示了如何发现新的薄弱环节。作者讨论了实现bug和架构缺陷的区别、逆向工程工具、服务器/客户机软件的脆弱性、恶意输入攻击、缓冲区溢出等内容,并且介绍了一个简单的WindowsXP内核rootkit。本书要求读者具备全面的系统硬件、操作系统软件结构、网络协议和编程(特别是C/C++和Java)知识。本书是面向有意成为软件安全专家的指南,适用于对编程有一定经验的软件设计师和软件测试师。软件是如何可被码解的?攻击者是如何有目地地破解软件的?为什么防火墙、指令检测系统以及反病毒软件不能将黑客们拒之门外?什么工具可以用来破解软件?本书为您提供了详细的答案。书中提供了大量黑客们破解软件的示例,包括实际攻击、攻击模式、攻击工具以及相关破解技术,并全面阐述了逆向工程、典型的对服务器软件的攻击、对客户端软件的攻击、制造恶意输入的技术,以及缓冲区溢出的技术细节等内容。在深入阅读本书后,您就可洞悉软件世界的激烈斗争,成为安全领域的专爱。
作者简介
GregHoglund博士十几年来一直是软件安全领域的领军人物。他创建并记录了第一个基于WindowsNT的rootkit,可以通过站点www.rootkit.com找到相关内容。
目录
第1章 软件—— 问题的根源 1
1.1 软件简史 1
1.1.1 软件和信息战 4
1.1.2 数字谍报手段 4
1.2 不良软件很普遍 7
1.2.1 NASA(美国国家航空和宇宙航行局)的火星登陆器 7
1.2.2 丹佛机场行李管理系统 7
1.2.3 鱼鹰MV-22 8
1.2.4 美国军事系统自伤 8
1.2.5 Microsoft和“爱”bug 9
1.3 问题三组合 10
1.3.1 复杂性 10
1.3.2 代码行数越多,bug就越多 11
1.3.3 可扩展性 12
1.3.4 连通性 15
1.3.5 结论 16
1.4 软件的未来 16
1.4.1 短期未来:2003-2004 16
1.4.2 中期未来:2005-2007 18
1.4.3 长期未来:2008-2010 20
1.4.4 十条思路 21
1.5 什么是软件安全 21
1.6 小结 22
第2章 攻击模式 24
2.1 分类 24
2.1.1 bug 25
2.1.2 缺陷 25
2.1.3 脆弱点 25
2.1.4 设计中的脆弱点 26
2.2 开放系统 27
2.2.1 风险 29
2.2.2 潜在损失 29
2.2.3 暴露度与力度 30
2.2.4 实际风险 30
2.3 一次攻击历程 31
2.3.1 攻击者的观点 31
2.3.2 为什么不能信任用户 32
2.3.3 “开锁” 32
2.3.4 一个简单的示例 34
2.4 攻击模式:灾难性的蓝图 36
2.4.1 破解、攻击和攻击者 36
2.4.2 攻击模式 36
2.4.3 代码注入 37
2.4.4 活动区 37
2.4.5 输出事件 37
2.4.6 反馈事件 37
2.5 攻击示例:对Microsoft C++编译器的攻击 37
2.5.1 攻击的技术细节 39
2.5.2 对Microsoft栈保护的概述 39
2.5.3 绕过Microsoft的安全特性 40
2.5.4 解决方案 42
2.5.5 攻击回顾 42
2.6 应用攻击模式 43
2.6.1 网络扫描 43
2.6.2 操作系统辨识 43
2.6.3 端口扫描 44
2.6.4 路径追踪和区文件传输 44
2.6.5 目标组件 44
2.6.6 选择攻击模式 45
2.6.7 环境缺陷的影响 45
2.6.8 间接使用攻击 45
2.6.9 种植后门 45
2.7 攻击模式工具箱 46
2.8 小结 46
第3章 逆向工程和程序理解 47
3.1 进入逻辑的“房屋” 47
3.1.1 逆向工程 48
3.1.2 为什么需要逆向工程 50
3.2 逆向工程是非法的吗 50
3.3 逆向工程的概念及其使用的工具 51
3.3.1 调试程序 52
3.3.2 缺陷注入工具 52
3.3.3 反汇编工具 52
3.3.4 反编译器 52
3.4 逆向工程的方法 53
3.4.1 白箱分析 53
3.4.2 黑箱分析 53
3.4.3 灰箱分析 54
3.4.4 使用灰箱技术在Microsoft的SQL Server 7中寻找脆弱点 55
3.5 逆向方法 56
3.5.1 输入追踪 56
3.5.2 软件版本的差异 57
3.5.3 代码覆盖 58
3.5.4 内核访问 59
3.5.5 共享缓冲区中的数据泄漏 59
3.5.6 对访问请求的审计 60
3.5.7 使用自己的API资源 60
3.6 编写IDA插件 61
3.7 对软件进行反编译和反汇编 73
3.8 实练反编译:逆向helpctr.exe 74
3.8.1 bug报告 75
3.8.2 调试记录 75
3.9 自动、成批地审计脆弱点 78
3.10 编写属于自己的破解工具 87
3.10.1 x86工具 87
3.10.2 基本的x86调试程序 88
3.10.3 断点 89
3.10.4 存储器的读写 92
3.10.5 调试多线程程序 93
3.10.6 枚举线程或进程 95
3.10.7 单步执行 96
3.10.8 修补 97
3.10.9 故障注入 97
3.10.10 进程快照 98
3.10.11 反汇编机器代码 102
3.11 编写基本的代码覆盖工具 104
3.12 小结 109
第4章 攻击服务器软件 110
4.1 可信任输入问题 111
4.2 权限提升问题 112
4.2.1 进程权限之间的信任 112
4.2.2 如果不以管理员的身份运行,一切就会崩溃 113
4.2.3 从不被信任的资源中读取数据的进程权限提升 113
4.2.4 使用提升权限的进程 114
4.3 寻找注入点 114
4.4 输入路径的追踪 116
4.4.1 使用基于Solaris SPARC二进制的GDB和IDA-Pro 116
4.4.2 设置断点和表达式 116
4.4.3 利用IDA映射运行时存储器地址 117
4.4.4 将GDB附加到一个正在运行的进程 117
4.4.5 基于Solaris使用Truss以模拟目标软件 118
4.5 通过配置破解受信任的软件 120
4.5.1 审计直接可执行文件 121
4.5.2 了解当前工作目录 121
4.5.3 如果Web服务器不执行cgi程序该怎么办 121
4.5.4 什么是不可执行的文件 122
4.5.5 策略的使用 123
4.6 特殊的技术和对服务器软件的攻击 123
4.6.1 技术:注入命令解释程序 124
4.6.2 技术:管道、端口和权限 134
4.6.3 技术:攻击文件系统 136
4.6.4 技术:操作环境变量 140
4.6.5 技术:利用无关变量 140
4.6.6 技术:利用不良会话认证 142
4.6.7 技术:蛮力会话ID 143
4.6.8 技术:验证的多重路径 147
4.6.9 技术:不能检验错误代码 147
4.7 小结 147
第5章 攻击客户端软件 148
5.1 作为攻击目标的客户端程序 148
5.1.1 服务器控制客户端 149
5.1.2 软件蜜罐 149
5.2 混合信号 150
5.2.1 古老(但却相关)的历史 150
5.2.2 基本的混合数据使用 152
5.2.3 针对打印机的有趣的混合信号 153
5.2.4 Linux中的混合终端字符注入 153
5.2.5 反射问题 155
5.3 跨站点脚本 155
5.4 客户端脚本和恶意代码 160
5.4.1 检查较脆弱的本地调用 160
5.4.2 Web浏览器和ActiveX 166
5.4.3 E-mail注入 167
5.5 基于内容的攻击 170
5.6 逆向攻击:利用客户端缓冲区溢出 170
5.7 小结 171
第6章 构造恶意输入 172
6.1 防御者的困惑 173
6.1.1 过滤器 174
6.1.2 通信系统 174
6.2 入侵检测 175
6.2.1 基于签名和基于异常的IDS 175
6.2.2 疲于应付的IDS 176
6.2.3 在IDS上交替编码的效应 176
6.3 分割分析 178
6.3.1 Windows的APISPY 178
6.3.2 红点 179
6.4 追踪代码 179
6.4.1 从脆弱区回溯 180
6.4.2 死端和逃避 181
6.4.3 运行时追踪 181
6.4.4 速度中断 183
6.4.5 追踪缓冲区 184
6.4.6 跳步 185
6.4.7 内存页断点 185
6.4.8 boron标记符 185
6.5 反向分析程序代码 186
6.5.1 字符转换 186
6.5.2 字节操作 187
6.5.3 指针操作 187
6.5.4 空终止符 188
6.6 示例:通过“正门”逆向I-Planet Server 6.0 189
6.7 错误的分类 193
6.8 产生“等效”请求 193
6.8.1 映射API层 194
6.8.2 虚字符 195
6.8.3 等效元字符 196
6.8.4 转义元字符 197
6.8.5 字符转换 198
6.8.6 组合攻击 200
6.9 检测中毒 201
6.10 小结 202
第7章 缓冲区溢出 203
7.1 缓冲区溢出 203
7.1.1 栈的摧毁(为了有趣和有益) 204
7.1.2 遭到破坏的状态 204
7.2 病毒注入:再次利用输入 205
7.2.1 病毒注入的结束和攻击代码的开始 206
7.2.2 在目标中选择合适的代码地址 206
7.2.3 高地址区和低地址区 207
7.2.4 big endian和little endian表示方式 208
7.2.5 使用寄存器 208
7.2.6 使用内存中现有的代码或是数据块 209
7.3 缓冲区溢出与嵌入式系统 210
7.4 数据库缓冲区溢出 211
7.4.1 存储过程 212
7.4.2 命令行应用程序 212
7.4.3 数据库的客户端程序 212
7.5 缓冲区溢出和Java 212
7.5.1 同时使用Java和C/C++ 213
7.5.2 存储过程和动态链接库 214
7.6 基于内容的缓冲区溢出 214
7.7 缓冲区溢出的截获审计和过滤器 216
7.8 环境变量引起的溢出 217
7.9 多重操作问题 218
7.10 发现潜在的缓冲区溢出 218
7.10.1 异常处理掩盖错误 218
7.10.2 使用反汇编 219
7.11 栈溢出 219
7.11.1 固定大小的缓冲区 220
7.11.2 不能自动添加空字符作为结束的函数 221
7.11.3 off-by-one空字符结束的函数 222
7.11.4 改写异常处理程序结构 225
7.12 内存管理中的计算错误 226
7.12.1 负数“等于”很大的正数 226
7.12.2 有符号数和无符号数的不匹配 228
7.12.3 有符号数和内存管理 231
7.13 格式化字符串的脆弱点 233
7.13.1 从内存中的任何一个地方输出数据 235
7.13.2 在代码中检测问题 238
7.14 堆溢出 239
7.15 缓冲区溢出和C++ 242
7.16 攻击代码 243
7.16.1 定向 244
7.16.2 攻击代码的大小 245
7.16.3 使用硬编码的函数调用 245
7.16.4 使用动态指令跳转表 245
7.16.5 定位数据段 247
7.16.6 异或(XOR)保护 247
7.16.7 校验和与散列加载 247
7.17 基于RISC体系结构的攻击代码 248
7.17.1 分支延迟或者延迟槽 248
7.17.2 基于MIPS的攻击代码结构 249
7.17.3 MIPS指令 249
7.17.4 定向 249
7.17.5 在MIPS操作码中避免空字节 250
7.17.6 MIPS中的系统调用 251
7.17.7 SPARC 攻击代码结构 251
7.17.8 SPARC 寄存器窗口 251
7.17.9 SPARC上的栈调用 252
7.17.10 嵌套在SPARC中的函数调用 254
7.17.11 PA-RISC攻击代码的结构 254
7.17.12 PA-RISC上的栈调用 256
7.17.13 在HPUX PA-RISC上的栈溢出 258
7.17.14 PA-RISC的内部空间分支 258
7.17.15 内部空间跳跃 259
7.17.16 定向 260
7.17.17 HPUX的自解密攻击代码 261
7.17.18 AIX/PowerPC的攻击代码结构 263
7.17.19 定位 263
7.17.20 给PowerPC命令解释程序代码披上盔甲 264
7.17.21 删除空字符 265
7.18 多平台的攻击代码 265
7.19 保护函数的Prolog-Epilog代码 267
7.19.1 击溃栈保护 267
7.19.2 击溃非可执行栈 269
7.20 小结 271
第8章 rootkit 272
8.1 破坏性的程序 272
8.1.1 什么是rootkit 272
8.1.2 什么是内核rootkit 273
8.1.3 内核rootkit及其受信任的计算基础 273
8.2 简单的Windows XP内核rootkit 273
8.2.1 编写rootkit 273
8.2.2 checked 编译环境 273
8.2.3 rootkit中的文件 274
8.2.4 建立环境 274
8.2.5 内核驱动程序 274
8.2.6 驱动程序的基本结构 274
8.2.7 使用驱动程序 275
8.2.8 允许卸载驱动程序 276
8.2.9 注册驱动程序 278
8.2.10 使用SystemLoadAndCallImage 280
8.3 钩子调用 282
8.3.1 隐藏进程 283
8.3.2 系统调用的钩子 283
8.3.3 基本钩子调用的结构 283
8.3.4 删除进程记录 284
8.3.5 另一种进程注入的方法 287
8.4 特洛伊可执行程序的重定向 287
8.4.1 重定向和Tripwire问题 287
8.4.2 重定向驱动程序 288
8.5 隐藏文件和目录 292
8.6 修补二进制代码 294
8.6.1 窥探补丁 295
8.6.2 修补NT内核以删除所有的安全保护 296
8.7 硬件病毒 306
8.7.1 读写硬件存储空间 307
8.7.2 示例:读/写键盘硬件 308
8.7.3 允许从EEPROM读或写 313
8.7.4 CIH 313
8.7.5 EEPROM和定时 316
8.7.6 以太网的EEPROM 316
8.7.7 串行EEPROM和并行EEPROM 319
8.7.8 烧毁硬件 319
8.7.9 制造商 319
8.7.10 通过通用闪存接口检测芯片 320
8.7.11 示例:检测Flash RAM 芯片 320
8.7.12 利用ID模式或JEDEC ID检测芯片 321
8.8 低级磁盘访问 322
8.8.1 读或写主引导记录 323
8.8.2 感染CD-ROM 323
8.9 给驱动程序添加网络支持 323
8.9.1 使用NDIS库 323
8.9.2 使接口处于混杂模式 325
8.9.3 寻找正确的网卡 326
8.9.4 为了安全而使用boron标记 331
8.9.5 添加交互式命令解释程序 331
8.10 中断 331
8.10.1 Intel的中断请求(IRQ)结构 331
8.10.2 钩住中断描述符表(IDT) 332
8.10.3 神秘的程序中断控制器(PIC) 333
8.11 击键记录 334
8.11.1 Linux下的击键记录 334
8.11.2 Windows NT/2000/XP下的击键记录 335
8.11.3 键盘控制器芯片 335
8.12 高级rootkit专题 335
8.12.1 使用rootkit作为调试器 336
8.12.2 禁用Windows系统的文件保护功能 336
8.12.3 直接写物理存储器 336
8.12.4 内核缓冲区溢出 336
8.12.5 感染内核镜像 336
8.12.6 改变程序执行方向 336
8.12.7 检测rootkit 337
8.13 小结 337
附录A 攻击模式 338
1.1 软件简史 1
1.1.1 软件和信息战 4
1.1.2 数字谍报手段 4
1.2 不良软件很普遍 7
1.2.1 NASA(美国国家航空和宇宙航行局)的火星登陆器 7
1.2.2 丹佛机场行李管理系统 7
1.2.3 鱼鹰MV-22 8
1.2.4 美国军事系统自伤 8
1.2.5 Microsoft和“爱”bug 9
1.3 问题三组合 10
1.3.1 复杂性 10
1.3.2 代码行数越多,bug就越多 11
1.3.3 可扩展性 12
1.3.4 连通性 15
1.3.5 结论 16
1.4 软件的未来 16
1.4.1 短期未来:2003-2004 16
1.4.2 中期未来:2005-2007 18
1.4.3 长期未来:2008-2010 20
1.4.4 十条思路 21
1.5 什么是软件安全 21
1.6 小结 22
第2章 攻击模式 24
2.1 分类 24
2.1.1 bug 25
2.1.2 缺陷 25
2.1.3 脆弱点 25
2.1.4 设计中的脆弱点 26
2.2 开放系统 27
2.2.1 风险 29
2.2.2 潜在损失 29
2.2.3 暴露度与力度 30
2.2.4 实际风险 30
2.3 一次攻击历程 31
2.3.1 攻击者的观点 31
2.3.2 为什么不能信任用户 32
2.3.3 “开锁” 32
2.3.4 一个简单的示例 34
2.4 攻击模式:灾难性的蓝图 36
2.4.1 破解、攻击和攻击者 36
2.4.2 攻击模式 36
2.4.3 代码注入 37
2.4.4 活动区 37
2.4.5 输出事件 37
2.4.6 反馈事件 37
2.5 攻击示例:对Microsoft C++编译器的攻击 37
2.5.1 攻击的技术细节 39
2.5.2 对Microsoft栈保护的概述 39
2.5.3 绕过Microsoft的安全特性 40
2.5.4 解决方案 42
2.5.5 攻击回顾 42
2.6 应用攻击模式 43
2.6.1 网络扫描 43
2.6.2 操作系统辨识 43
2.6.3 端口扫描 44
2.6.4 路径追踪和区文件传输 44
2.6.5 目标组件 44
2.6.6 选择攻击模式 45
2.6.7 环境缺陷的影响 45
2.6.8 间接使用攻击 45
2.6.9 种植后门 45
2.7 攻击模式工具箱 46
2.8 小结 46
第3章 逆向工程和程序理解 47
3.1 进入逻辑的“房屋” 47
3.1.1 逆向工程 48
3.1.2 为什么需要逆向工程 50
3.2 逆向工程是非法的吗 50
3.3 逆向工程的概念及其使用的工具 51
3.3.1 调试程序 52
3.3.2 缺陷注入工具 52
3.3.3 反汇编工具 52
3.3.4 反编译器 52
3.4 逆向工程的方法 53
3.4.1 白箱分析 53
3.4.2 黑箱分析 53
3.4.3 灰箱分析 54
3.4.4 使用灰箱技术在Microsoft的SQL Server 7中寻找脆弱点 55
3.5 逆向方法 56
3.5.1 输入追踪 56
3.5.2 软件版本的差异 57
3.5.3 代码覆盖 58
3.5.4 内核访问 59
3.5.5 共享缓冲区中的数据泄漏 59
3.5.6 对访问请求的审计 60
3.5.7 使用自己的API资源 60
3.6 编写IDA插件 61
3.7 对软件进行反编译和反汇编 73
3.8 实练反编译:逆向helpctr.exe 74
3.8.1 bug报告 75
3.8.2 调试记录 75
3.9 自动、成批地审计脆弱点 78
3.10 编写属于自己的破解工具 87
3.10.1 x86工具 87
3.10.2 基本的x86调试程序 88
3.10.3 断点 89
3.10.4 存储器的读写 92
3.10.5 调试多线程程序 93
3.10.6 枚举线程或进程 95
3.10.7 单步执行 96
3.10.8 修补 97
3.10.9 故障注入 97
3.10.10 进程快照 98
3.10.11 反汇编机器代码 102
3.11 编写基本的代码覆盖工具 104
3.12 小结 109
第4章 攻击服务器软件 110
4.1 可信任输入问题 111
4.2 权限提升问题 112
4.2.1 进程权限之间的信任 112
4.2.2 如果不以管理员的身份运行,一切就会崩溃 113
4.2.3 从不被信任的资源中读取数据的进程权限提升 113
4.2.4 使用提升权限的进程 114
4.3 寻找注入点 114
4.4 输入路径的追踪 116
4.4.1 使用基于Solaris SPARC二进制的GDB和IDA-Pro 116
4.4.2 设置断点和表达式 116
4.4.3 利用IDA映射运行时存储器地址 117
4.4.4 将GDB附加到一个正在运行的进程 117
4.4.5 基于Solaris使用Truss以模拟目标软件 118
4.5 通过配置破解受信任的软件 120
4.5.1 审计直接可执行文件 121
4.5.2 了解当前工作目录 121
4.5.3 如果Web服务器不执行cgi程序该怎么办 121
4.5.4 什么是不可执行的文件 122
4.5.5 策略的使用 123
4.6 特殊的技术和对服务器软件的攻击 123
4.6.1 技术:注入命令解释程序 124
4.6.2 技术:管道、端口和权限 134
4.6.3 技术:攻击文件系统 136
4.6.4 技术:操作环境变量 140
4.6.5 技术:利用无关变量 140
4.6.6 技术:利用不良会话认证 142
4.6.7 技术:蛮力会话ID 143
4.6.8 技术:验证的多重路径 147
4.6.9 技术:不能检验错误代码 147
4.7 小结 147
第5章 攻击客户端软件 148
5.1 作为攻击目标的客户端程序 148
5.1.1 服务器控制客户端 149
5.1.2 软件蜜罐 149
5.2 混合信号 150
5.2.1 古老(但却相关)的历史 150
5.2.2 基本的混合数据使用 152
5.2.3 针对打印机的有趣的混合信号 153
5.2.4 Linux中的混合终端字符注入 153
5.2.5 反射问题 155
5.3 跨站点脚本 155
5.4 客户端脚本和恶意代码 160
5.4.1 检查较脆弱的本地调用 160
5.4.2 Web浏览器和ActiveX 166
5.4.3 E-mail注入 167
5.5 基于内容的攻击 170
5.6 逆向攻击:利用客户端缓冲区溢出 170
5.7 小结 171
第6章 构造恶意输入 172
6.1 防御者的困惑 173
6.1.1 过滤器 174
6.1.2 通信系统 174
6.2 入侵检测 175
6.2.1 基于签名和基于异常的IDS 175
6.2.2 疲于应付的IDS 176
6.2.3 在IDS上交替编码的效应 176
6.3 分割分析 178
6.3.1 Windows的APISPY 178
6.3.2 红点 179
6.4 追踪代码 179
6.4.1 从脆弱区回溯 180
6.4.2 死端和逃避 181
6.4.3 运行时追踪 181
6.4.4 速度中断 183
6.4.5 追踪缓冲区 184
6.4.6 跳步 185
6.4.7 内存页断点 185
6.4.8 boron标记符 185
6.5 反向分析程序代码 186
6.5.1 字符转换 186
6.5.2 字节操作 187
6.5.3 指针操作 187
6.5.4 空终止符 188
6.6 示例:通过“正门”逆向I-Planet Server 6.0 189
6.7 错误的分类 193
6.8 产生“等效”请求 193
6.8.1 映射API层 194
6.8.2 虚字符 195
6.8.3 等效元字符 196
6.8.4 转义元字符 197
6.8.5 字符转换 198
6.8.6 组合攻击 200
6.9 检测中毒 201
6.10 小结 202
第7章 缓冲区溢出 203
7.1 缓冲区溢出 203
7.1.1 栈的摧毁(为了有趣和有益) 204
7.1.2 遭到破坏的状态 204
7.2 病毒注入:再次利用输入 205
7.2.1 病毒注入的结束和攻击代码的开始 206
7.2.2 在目标中选择合适的代码地址 206
7.2.3 高地址区和低地址区 207
7.2.4 big endian和little endian表示方式 208
7.2.5 使用寄存器 208
7.2.6 使用内存中现有的代码或是数据块 209
7.3 缓冲区溢出与嵌入式系统 210
7.4 数据库缓冲区溢出 211
7.4.1 存储过程 212
7.4.2 命令行应用程序 212
7.4.3 数据库的客户端程序 212
7.5 缓冲区溢出和Java 212
7.5.1 同时使用Java和C/C++ 213
7.5.2 存储过程和动态链接库 214
7.6 基于内容的缓冲区溢出 214
7.7 缓冲区溢出的截获审计和过滤器 216
7.8 环境变量引起的溢出 217
7.9 多重操作问题 218
7.10 发现潜在的缓冲区溢出 218
7.10.1 异常处理掩盖错误 218
7.10.2 使用反汇编 219
7.11 栈溢出 219
7.11.1 固定大小的缓冲区 220
7.11.2 不能自动添加空字符作为结束的函数 221
7.11.3 off-by-one空字符结束的函数 222
7.11.4 改写异常处理程序结构 225
7.12 内存管理中的计算错误 226
7.12.1 负数“等于”很大的正数 226
7.12.2 有符号数和无符号数的不匹配 228
7.12.3 有符号数和内存管理 231
7.13 格式化字符串的脆弱点 233
7.13.1 从内存中的任何一个地方输出数据 235
7.13.2 在代码中检测问题 238
7.14 堆溢出 239
7.15 缓冲区溢出和C++ 242
7.16 攻击代码 243
7.16.1 定向 244
7.16.2 攻击代码的大小 245
7.16.3 使用硬编码的函数调用 245
7.16.4 使用动态指令跳转表 245
7.16.5 定位数据段 247
7.16.6 异或(XOR)保护 247
7.16.7 校验和与散列加载 247
7.17 基于RISC体系结构的攻击代码 248
7.17.1 分支延迟或者延迟槽 248
7.17.2 基于MIPS的攻击代码结构 249
7.17.3 MIPS指令 249
7.17.4 定向 249
7.17.5 在MIPS操作码中避免空字节 250
7.17.6 MIPS中的系统调用 251
7.17.7 SPARC 攻击代码结构 251
7.17.8 SPARC 寄存器窗口 251
7.17.9 SPARC上的栈调用 252
7.17.10 嵌套在SPARC中的函数调用 254
7.17.11 PA-RISC攻击代码的结构 254
7.17.12 PA-RISC上的栈调用 256
7.17.13 在HPUX PA-RISC上的栈溢出 258
7.17.14 PA-RISC的内部空间分支 258
7.17.15 内部空间跳跃 259
7.17.16 定向 260
7.17.17 HPUX的自解密攻击代码 261
7.17.18 AIX/PowerPC的攻击代码结构 263
7.17.19 定位 263
7.17.20 给PowerPC命令解释程序代码披上盔甲 264
7.17.21 删除空字符 265
7.18 多平台的攻击代码 265
7.19 保护函数的Prolog-Epilog代码 267
7.19.1 击溃栈保护 267
7.19.2 击溃非可执行栈 269
7.20 小结 271
第8章 rootkit 272
8.1 破坏性的程序 272
8.1.1 什么是rootkit 272
8.1.2 什么是内核rootkit 273
8.1.3 内核rootkit及其受信任的计算基础 273
8.2 简单的Windows XP内核rootkit 273
8.2.1 编写rootkit 273
8.2.2 checked 编译环境 273
8.2.3 rootkit中的文件 274
8.2.4 建立环境 274
8.2.5 内核驱动程序 274
8.2.6 驱动程序的基本结构 274
8.2.7 使用驱动程序 275
8.2.8 允许卸载驱动程序 276
8.2.9 注册驱动程序 278
8.2.10 使用SystemLoadAndCallImage 280
8.3 钩子调用 282
8.3.1 隐藏进程 283
8.3.2 系统调用的钩子 283
8.3.3 基本钩子调用的结构 283
8.3.4 删除进程记录 284
8.3.5 另一种进程注入的方法 287
8.4 特洛伊可执行程序的重定向 287
8.4.1 重定向和Tripwire问题 287
8.4.2 重定向驱动程序 288
8.5 隐藏文件和目录 292
8.6 修补二进制代码 294
8.6.1 窥探补丁 295
8.6.2 修补NT内核以删除所有的安全保护 296
8.7 硬件病毒 306
8.7.1 读写硬件存储空间 307
8.7.2 示例:读/写键盘硬件 308
8.7.3 允许从EEPROM读或写 313
8.7.4 CIH 313
8.7.5 EEPROM和定时 316
8.7.6 以太网的EEPROM 316
8.7.7 串行EEPROM和并行EEPROM 319
8.7.8 烧毁硬件 319
8.7.9 制造商 319
8.7.10 通过通用闪存接口检测芯片 320
8.7.11 示例:检测Flash RAM 芯片 320
8.7.12 利用ID模式或JEDEC ID检测芯片 321
8.8 低级磁盘访问 322
8.8.1 读或写主引导记录 323
8.8.2 感染CD-ROM 323
8.9 给驱动程序添加网络支持 323
8.9.1 使用NDIS库 323
8.9.2 使接口处于混杂模式 325
8.9.3 寻找正确的网卡 326
8.9.4 为了安全而使用boron标记 331
8.9.5 添加交互式命令解释程序 331
8.10 中断 331
8.10.1 Intel的中断请求(IRQ)结构 331
8.10.2 钩住中断描述符表(IDT) 332
8.10.3 神秘的程序中断控制器(PIC) 333
8.11 击键记录 334
8.11.1 Linux下的击键记录 334
8.11.2 Windows NT/2000/XP下的击键记录 335
8.11.3 键盘控制器芯片 335
8.12 高级rootkit专题 335
8.12.1 使用rootkit作为调试器 336
8.12.2 禁用Windows系统的文件保护功能 336
8.12.3 直接写物理存储器 336
8.12.4 内核缓冲区溢出 336
8.12.5 感染内核镜像 336
8.12.6 改变程序执行方向 336
8.12.7 检测rootkit 337
8.13 小结 337
附录A 攻击模式 338
猜您喜欢