第一部分 内核态 2
第1章 从用户态利用到内核态利用 2
引言 2
内核和内核漏洞利用的世界 2
漏洞利用的艺术 4
为什么用户态漏洞利用不再有效 7
内核态漏洞利用和用户态漏洞利用 8
一个漏洞利用者的内核观 10
用户态进程和调度 10
虚拟内存 11
开源操作系统和闭源操作系统 14
小结 14
相关阅读 15
尾注 15
第2章 内核漏洞分类 16
引言 16
未初始化的/未验证的/已损坏的指针解引用 17
内存破坏漏洞 20
内核栈漏洞 20
内核堆漏洞 21
整数误用 22
算术/整数溢出 23
符号转换错误 24
竞态条件 26
逻辑bug 31
引用计数器溢出 31
物理设备输入验证 32
内核生成的用户态漏洞 33
小结 35
尾注 36
第3章 成功内核利用进阶 37
引言 37
架构级概览 38
基本概念 38
x86和x86-64 43
执行阶段 46
放置shellcode 46
伪造shellcode 52
触发阶段 55
内存破坏 55
竞态条件 66
信息收集阶段 69
环境告诉我们什么 70
环境不想告诉我们的:信息泄露 74
小结 75
相关阅读 76
第二部分 UNIX家族、Mac OS X和Windows 78
第4章 UNIX家族 78
引言 78
UNIX家族成员 79
Linux 79
Solaris/OpenSolaris 87
BSD衍生操作系统 97
执行步骤 97
滥用Linux的权限模型 98
实战UNIX 108
内核堆利用 108
利用OpenSolaris的slab分配器 109
利用Linux 2.6 SLAB^H^HUB分配器 127
Linux的栈溢出利用 142
重拾CVE-2009-3234 148
小结 156
尾注 157
第5章 Mac OS X 158
引言 158
XNU概述 159
Mach 160
BSD 160
IOKit 160
系统调用表 161
内核调试 162
内核扩展(kext) 169
IOKit 174
内核扩展审计 174
执行步骤 185
利用注释 186
随意的内存重写 186
基于栈的缓冲区溢出 195
内存分配符利用 208
竞态条件 219
Snow Leopard利用 219
小结 219
尾注 220
第6章 Windows 221
引言 221
Windows内核概述 223
内核信息收集 223
DVWD介绍 227
内核内部组织攻略 228
内核调试 232
执行阶段 234
Windows验证模型 234
编写shellcode 242
Windows漏洞利用实践 253
重写任意内存 253
栈缓冲区溢出 261
小结 278
尾注 278
第三部分 远程内核漏洞利用 280
第7章 远程内核漏洞利用面临的挑战 280
引言 280
利用远程漏洞 281
缺少公开信息 281
缺少对远程目标的控制 283
执行第一条指令 284
直接执行流程重定向 284
内核内存的任意写 294
远程payload 296
payload迁移 297
KEP上下文 297
多级shellcode 306
小结 311
尾注 312
第8章 一个Linux案例 313
引言 313
SCTP的转发块堆内存损坏 313
SCTP简要概述 314
漏洞路径 316
远程漏洞利用:总体分析 319
获得任意内存重写原语 320
远程调整堆布局 320
创建SCTP消息:从相对到绝对内存的重写 323
安装shellcode 327
从中断上下文直接跳到用户态 327
执行shellcode 333
检查当前进程,模拟gettimeofday()函数 333
执行反向连接 334
恢复Vsyscall 336
小结 337
相关阅读 337
尾注 337
第四部分 展望 340
第9章 内核演变:未来内核攻防模式 340
引言 340
内核攻击 341
保密性 341
完整性 342
可用性 344
内核防御 344
内核威胁的分析与建模 345
内核防御机制 346
内核保证机制 347
超越内核bug:虚拟化 350
虚拟层安全 350
客户机内核安全 351
小结 351