《黑客攻防技术宝典:系统实战篇(第2版)》由世界不错安全专家亲自执笔,详细阐述了系统安全、应用程序安全、软件破解、加密解密等安全领域的核心问题,并用大量的实例说明如何检查Windows、Linux、Solaris等流行操作系统中的安全漏洞和Oracle等数据库中的安全隐患。
《黑客攻防技术宝典:系统实战篇(第2版)》适用于所有计算机安全领域的技术人员和管理人员以及对计算机安全感兴趣的爱好者。
部分 破解入门:x86上的Linux
章 写在前面 2
1.1 基本概念 2
1.1.1 内存管理 3
1.1.2 汇编语言 4
1.2 识别汇编指令里的C和C++代码 5
1.3 小结 7
第2章 栈溢出 8
2.1 缓冲区 8
2.2 栈
2.3 栈上的缓冲区溢出 13
2.4 有趣的转换 17
2.5 利用漏洞获得根特权 20
2.5.1 地址问题 21
2.5.2 NOP法 26
2.6 战胜不可执行栈 28
2.7 小结 31
第3章 shellcode 32
3.1 理解系统调用 32
3.2 为exit()系统调用写shellcode 34
3.3 可注入的shellcode 37
3.4 派生shell 39
3.5 小结 46
第4章 格式化串漏洞 47
4.1 储备知识 47
4.2 什么是格式化串 47
4.3 什么是格式化串漏洞 49
4.4 利用格式化串漏洞 52
4.4.1 使服务崩溃 53
4.4.2 信息泄露 54
4.5 控制程序执行 59
4.6 为什么会这样 67
4.7 格式化串技术概述 67
4.8 小结 69
第5章 堆溢出 70
5.1 堆是什么 70
5.2 发现堆溢出 71
5.2.1 基本堆溢出 72
5.2.2 中级堆溢出 77
5.2.3 堆溢出 83
5.3 小结 84
第二部分 其他平台:Windows、Solaris、OS X和Cisco
第6章 Windows操作系统 86
6.1 Windows和Linux有何不同 86
6.2 堆 88
6.3 DCOM、DCE-RPC的优缺点 90
6.3.1 侦察 91
6.3.2 破解 93
6.3.3 令牌及其冒用 93
6.3.4 Win32平台的异常处理 95
6.4 调试Windows 96
6.4.1 Win32里的bug 96
6.4.2 编写Windows shellcode 97
6.4.3 Win32 API黑客指南 97
6.4.4 黑客眼中的Windows 98
6.5 小结 99
第7章 Windows shellcode 0
7.1 句法和过滤器 0
7.2 创建 1
7.2.1 剖析PEB 2
7.2.2 分析Heapoverflow.c 2
7.3 利用Windows异常处理进行搜索 116
7.4 弹出shell 121
7.5 为什么不应该在Windows上弹出shell 122
7.6 小结 122
第8章 Windows溢出 123
8.1 栈缓冲区溢出 123
8.2 基于帧的异常处理程序 123
8.3 滥用Windows 2003 Server上的基于帧的异常处理 127
8.3.1 滥用已有的处理程序 128
8.3.2 在与模块不相关的地址里寻找代码段,从而返回缓冲区 129
8.3.3 在没有Load ConfiguratioDirectory的模块的地址空间里寻找代码段 130
8.3.4 关于改写帧处理程序的后说明 131
8.4 栈保护与Windows 2003 Server 131
8.5 堆缓冲区溢出 136
8.6 进程堆 136
8.6.1 动态堆 136
8.6.2 与堆共舞 136
8.6.3 堆是如何工作的 137
8.7 破解堆溢出 140
8.7.1 改写PEB里指向RtlEnter CriticalSection的指针 140
8.7.2 改写指向未处理异常过滤器的指针 146
8.7.3 修复堆 152
8.7.4 堆溢出的其他问题 154
8.7.5 有关堆的总结 154
8.8 其他的溢出 154
8.8.1 .data区段溢出 154
8.8.2 TEBPEB溢出 156
8.9 破解缓冲区溢出和不可执行栈 156
8. 小结 161
第9章 战胜过滤器 162
9.1 为仅接受字母和数字的过滤器写破解代码 162
9.2 为使用Unicode的过滤器写破解代码 165
9.2.1 什么是Unicode 165
9.2.2 从ASCII转为Unicode 166
9.3 破解Unicode漏洞 166
9.4 叶窗法 168
9.5 译码器和译码 171
9.5.1 译码器的代码 172
9.5.2 在缓冲区地址上定位 173
9.6 小结 174
第章 Solaris破解入门 175
.1 SPARC体系结构介绍 175
.1.1 寄存器和寄存器窗口 176
.1.2 延迟槽 177
.1.3 合成指令 177
.2 SolarisSPARC shellcode基础 178
.2.1 自定位和SPARC shellcode 178
.2.2 简单的SPARC exec shellcode 178
.2.3 Solaris里有用的系统调用 179
.2.4 NOP和填充指令 180
.3 SolarisSPARC栈帧介绍 180
.4 栈溢出的方法 180
.4.1 任意大小的溢出 180
.4.2 寄存器窗口和栈溢出的复杂性 181
.4.3 其他复杂的因素 181
.4.4 可能的解决方法 181
.4.5 off-by-one栈溢出漏洞 182
.4.6 shellcode的位置 182
.5 栈溢出破解实战 183
.5.1 脆弱的程序 183
.5.2 破解代码 184
.6 SolarisSPARC上的堆溢出 187
.6.1 Solaris System V堆介绍 188
.6.2 堆的树状结构 188
.7 基本的破解方法(t_delete) 209
.7.1 标准堆溢出的限制 2
.7.2 改写的目标 211
.8 其他与堆相关的漏洞 213
.8.1 off-by-one溢出 213
.8.2 二次释放漏洞 214
.8.3 任意释放漏洞 214
.9 堆溢出的例子 214
. 破解Solaris的其他方法 218
..1 静态数据溢出 218
..2 绕过不可执行栈保护 218
.11 小结 219
1章 Solaris破解 220
11.1 单步执行动态链接程序 221
11.2 Solaris SPARC堆溢出的各种技巧 235
11.3 SolarisSPARC shellcode 236
11.4 小结 248
2章 OS X shellcode 249
12.1 OS X就是BSD吗 249
12.2 OS X是否开源 250
12.3 UNIX支持的OS X 250
12.4 OS X PowerPC shellcode 251
12.5 OS X Intel shellcode 257
12.5.1 shellcode实例 258
12.5.2 ret2libc 259
12.5.3 ret2str(l)cpy 261
12.6 OS X跨平台shellcode 263
12.7 OS X堆利用 264
12.8 在OS X中寻找bug 266
12.9 一些有趣的bug 266
12. 关于OS X破解的资料 267
12.11 小结 268
3章 思科IOS破解技术 269
13.1 思科IOS纵览 269
13.1.1 硬件平台 269
13.1.2 软件 270
13.1.3 IOS系统架构 271
13.2 思科IOS里的漏洞 274
13.2.1 协议剖析代码 274
13.2.2 路由器上的服务 274
13.2.3 安全特征 274
13.2.4 命令行接口 275
13.3 逆向分析IOS 275
13.3.1 仔细剖析映像 275
13.3.2 比较IOS映像文件 276
13.3.3 运行时分析 277
13.4 破解思科IOS 281
13.4.1 栈溢出 282
13.4.2 堆溢出 283
13.4.3 shellcode 286
13.5 小结 294
4章 保护机制 295
14.1 保护 295
14.1.1 不可执行栈 296
14.1.2 W^X内存 299
14.1.3 栈数据保护 304
14.1.4 AAAS 309
14.1.5 ASLR 3
14.1.6 堆保护 312
14.1.7 Windows SEH保护机制 318
14.1.8 其他保护机制 321
14.2 不同实现之间的差异 322
14.2.1 Windows 322
14.2.2 Linux 325
14.2.3 OpenBSD 327
14.2.4 Mac OS X 328
14.2.5 Solaris 329
14.3 小结 330
第三部分 漏洞发现
5章 建立工作环境 332
15.1 需要什么样的参考资料 332
15.2 用什么编程 333
15.2.1 gcc 333
15.2.2 gdb 333
15.2.3 NASM 333
15.2.4 WinDbg 333
15.2.5 OllyDbg 333
15.2.6 Visual C++ 334
15.2.7 Pytho334
15.3 研究时需要什么 334
15.3.1 有用的定制脚本工具 334
15.3.2 所有的平台 335
15.3.3 UNIX 336
15.3.4 Windows 336
15.4 需要学习的资料 337
15.5 优化shellcode开发 339
15.5.1 计划 339
15.5.2 用内联汇编写shellcode 340
15.5.3 维护shellcode库 341
15.5.4 持续运行 341
15.5.5 使破解程序稳定可靠 342
15.5.6 窃取连接 343
15.6 小结 343
6章 故障注入 344
16.1 设计概要 345
16.1.1 生成输入数据 345
16.1.2 故障注入 347
16.1.3 修正引擎 347
16.1.4 提交故障 351
16.1.5 Nagel算法 351
16.1.6 时序 351
16.1.7 试探法 351
16.1.8 无状态协议与基于状态的协议 352
16.2 故障监视 352
16.2.1 使用调试器 352
16.2.2 FaultMo352
16.3 汇总 353
16.4 小结 354
7章 模糊测试的艺术 355
17.1 模糊测试理论 355
17.1.1 静态分析与模糊测试 359
17.1.2 可扩缩的模糊测试 359
17.2 模糊测试法的缺点 360
17.3 建立任意的网络协议模型 361
17.4 其他可能的模糊测试法 362
17.4.1 位翻转 362
17.4.2 修改开源程序 362
17.4.3 带动态分析的模糊测试 362
17.5 SPIKE 363
17.5.1 什么是SPIKE 363
17.5.2 为什么用SPIKE数据结构模仿网络协议 364
17.6 其他的模糊测试工具 371
17.7 小结 371
8章 源码审计:在基于C的语言里寻找漏洞 372
18.1 工具 373
18.1.1 Cscope 373
18.1.2 Ctags 373
18.1.3 编辑器 373
18.1.4 Cbrowser 373
18.2 自动源码分析工具 374
18.3 方法论 374
18.3.1 自顶向下(明确的)的方法 374
18.3.2 自底向上的方法 375
18.3.3 结合法 375
18.4 漏洞分类 375
18.4.1 普通逻辑错误 375
18.4.2 (几乎)绝迹的错误分类 375
18.4.3 格式化串 376
18.4.4 错误的边界检查 377
18.4.5 循环结构 378
18.4.6 off-by-one漏洞 378
18.4.7 正确终止问题 379
18.4.8 跳过以0结尾问题 380
18.4.9 有符号数比较漏洞 381
18.4. 整数相关漏洞 382
18.4.11 不同大小的整数转换 383
18.4.12 二次释放错误 384
18.4.13 超出范围的内存使用漏洞 384
18.4.14 使用未初始化的变量 384
18.4.15 释放后再使用漏洞 385
18.4.16 多线程问题和重入安全代码 386
18.5 识别:真正的漏洞和错误 386
18.6 小结 386
9章 手工的方法 387
19.1 原则 387
19.2 Oracle extproc溢出 387
19.3 普通的体系架构故障 390
19.3.1 问题发生在边界 390
19.3.2 在数据转换时出现问题 391
19.3.3 不对称区域里的问题 393
19.3.4 当认证和授权混淆的时候出现问题 393
19.3.5 在显眼的地方存在的问题 393
19.4 绕过输入验证和攻击检测 394
19.4.1 剥离坏数据 394
19.4.2 使用交替编码 394
19.4.3 使用文件处理特征 395
19.4.4 避开攻击特征 397
19.4.5 击败长度限制 397
19.5 Windows 2000 SNMP DOS 399
19.6 发现DOS攻击 399
19.7 SQL-UDP 400
19.8 小结 400
第20章 跟踪漏洞 402
20.1 概述 402
20.1.1 脆弱的程序 403
20.1.2 组件设计 404
20.1.3 编译VulnTrace 411
20.1.4 使用VulnTrace 416
20.1.5 的技术 418
20.2 小结 419
第21章 二进制审计:剖析不公开源码的软件 421
21.1 二进制与源码审计之间的明显差异 421
21.2 IDA pro——商业工具 422
21.2.1 IDA特征简介 422
21.2.2 调试符号 423
21.3 二进制审计入门 423
21.3.1 栈帧 423
21.3.2 调用约定 424
21.3.3 编译器生成的代码 425
21.3.4 类似memcpy代码构造 428
21.3.5 类似stlen的代码构造 429
21.3.6 C++代码构造 429
21.3.7 this指针 429
21.4 重构类定义 430
21.4.1 vtables 430
21.4.2 快速且有用的花絮 431
21.5 手动二进制分析 431
21.5.1 快速检查函数库调用 431
21.5.2 可疑的循环和写指令 431
21.5.3 高层理解和逻辑错误 432
21.5.4 二进制的图形化分析 432
21.5.5 手动反编译 433
21.6 二进制漏洞例子 433
21.6.1 微软SQL Server错误 433
21.6.2 LSD的RPC-DCOM漏洞 434
21.6.3 IIS WebDav漏洞 434
21.7 小结 436
第四部分 内容
第22章 其他载荷策略 438
22.1 修改程序 438
22.2 SQL Server 3B补丁 439
22.3 MySQL 1位补丁 442
22.4 OpenSSH RSA认证补丁 443
22.5 其他运行时修补方法 444
22.6 上载和运行(或proglet服务器) 446
22.7 系统调用代理 446
22.8 系统调用代理的问题 448
22.9 小结 456
第23章 编写在实际环境中运行的代码 457
23.1 不可靠的因素 457
23.1.1 魔术数字 457
23.1.2 版本 458
23.1.3 shellcode问题 458
23.2 对策 459
23.2.1 准备 460
23.2.2 暴力破解 460
23.2.3 本地破解 461
23.2.4 OS应用程序指纹 461
23.2.5 信息泄露 463
23.3 小结 463
第24章 攻击数据库软件 464
24.1 网络层攻击 464
24.2 应用层攻击 474
24.3 运行操作系统命令 475
24.3.1 微软SQL Server 475
24.3.2 Oracle 475
24.3.3 IBM DB2 476
24.4 SQL层的多种利用方法 478
24.5 小结 480
第25章 UNIX内核溢出 481
25.1 内核漏洞类型 481
25.2 0day内核漏洞 489
25.2.1 OpenBSD exec_ibcs2_coff_prep_zmagic()栈溢出 489
25.2.2 漏洞 490
25.3 Solaris vfs_getvfssw()可加载内核模块遍历漏洞 494
25.3.1 sysfs()系统调用 495
25.3.2 mount()系统调用 496
25.4 小结 497
第26章 破解UNIX内核漏洞 498
26.1 exec_ibcs2_coff_prep_zmagic()漏洞 498
26.1.1 计算偏移量和断点 503
26.1.2 改写返回地址并重定向执行流程 505
26.1.3 查找进程描述符(或进程结构) 506
26.1.4 开发内核模式载荷 508
26.1.5 从内核载荷返回 509
26.1.6 得到根权限(uid=0) 514
26.2 Solaris vfs_getvfssw()可加载内核模块路径遍历破解 520
26.2.1 精心编写破解代码 521
26.2.2 加载内核模块 522
26.2.3 得到根权限(uid=0) 525
26.3 小结 526
第27章 破解Windows内核 527
27.1 Windows内核模式缺陷——逐渐增多的猎物 527
27.2 Windows内核介绍 528
27.3 常见内核模式编程缺陷 528
27.3.1 栈溢出 529
27.3.2 堆溢出 532
27.3.3 没有充分验证用户模式地址 532
27.3.4 多目的化攻击 533
27.3.5 共享的对象攻击 533
27.4 Windows系统调用 533
27.4.1 理解系统调用 534
27.4.2 攻击系统调用 535
27.5 与设备驱动程序通信 536
27.5.1 IOCTL组件 536
27.5.2 发现IOCTL处理程序中的缺陷 537
27.6 内核模式载荷 538
27.6.1 提升用户模式进程 538
27.6.2 运行任意的用户模式载荷 540
27.6.3 颠覆内核安全 543
27.6.4 安装rootkit 544
27.7 内核shellcoder的资料 544
27.8 小结 545
文件大小:132MB
内附PC端和移动端阅读器