描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787115556936
1.本书面向安全工程师,对二进制分析和插桩等方向的一些有趣问题进行了介绍,帮助读者提升二进制分析技术。
2.本书各章后面的练习有助于读者深入掌握相关知识,无论是基本的汇编知识,还是复杂的二进制插桩及分析实践。
3.本书内容详细,从二进制分析的基本概念和二进制格式开始介绍,主要包括以下内容:
解析ELF和PE二进制,并基于libbfd构建二进制加载器;
通过代码注入和二进制编辑来修改ELF文件;
基于Capstone构建自定义反汇编工具;
使用二进制插桩来绕过常用的反分析技术;
应用污点分析来检测控制流劫持和数据泄露;
使用符号执行来构建自动化利用工具。
如今,读者可以找到许多关于汇编的书籍,甚至可以找到更多有关ELF和PE二进制格式的说明。关于信息流跟踪和符号执行也有大量的文章。但是,没有哪本书可以向读者展示从理解基本汇编知识到进行高级二进制分析的全过程。也没有哪本书可以向读者展示如何插桩二进制程序、如何使用动态污点分析来跟踪程序执行过程中的数据或使用符号执行来自动生成漏洞利用程序。换句话说,直到现在,没有一本书可以教你二进制分析所需的技术、工具和思维方式。
目 录
第 一部分 二进制格式
第 1章 二进制简介 2
1.1 C编译过程 3
1.1.1 预处理阶段 3
1.1.2 编译阶段 5
1.1.3 汇编阶段 6
1.1.4 链接阶段 7
1.2 符号和剥离的二进制文件 9
1.2.1 查看符号信息 9
1.2.2 剥离二进制文件 10
1.3 反汇编二进制文件 11
1.3.1 查看对象文件 11
1.3.2 检查完整的二进制执行体 13
1.4 加载并执行二进制文件 17
1.5 总结 19
1.6 练习 19
第 2章 ELF格式 20
2.1 ELF头部 22
2.1.1 e_ident数组 22
2.1.2 e_type、e_machine及e_version字段 24
2.1.3 e_entry字段 24
2.1.4 e_phoff和e_shoff字段 25
2.1.5 e_flags字段 25
2.1.6 e_ehsize字段 25
2.1.7 e_*entsize和e_*num字段 25
2.1.8 e_shstrndx字段 26
2.2 节头 26
2.2.1 sh_name字段 27
2.2.2 sh_type字段 28
2.2.3 sh_flags字段 28
2.2.4 sh_addr、sh_offset及sh_size字段 29
2.2.5 sh_link字段 29
2.2.6 sh_info字段 29
2.2.7 sh_addralign字段 29
2.2.8 sh_entsize字段 29
2.3 节 30
2.3.1 .init和.fini节 31
2.3.2 .text节 31
2.3.3 .bss、.data及.rodata节 33
2.3.4 延迟绑定和.plt、.got及.got.plt节 33
2.3.5 .rel.*和.rela.*节 36
2.3.6 .dynamic节 37
2.3.7 .init_array和.fini_array节 38
2.3.8 .shstrtab、.symtab、.strtab、.dynsym及.dynstr节 39
2.4 程序头 40
2.4.1 p_type字段 41
2.4.2 p_flags字段 42
2.4.3 p_offset、p_vaddr、p_paddr、p_filesz及p_memsz字段 42
2.4.4 p_align字段 42
2.5 总结 42
2.6 练习 43
第3章 PE格式简介 44
3.1 MS-DOS头和MS-DOS存根 45
3.2 PE签名、PF文件头及PE可选头 46
3.2.1 PE签名 48
3.2.2 PE文件头 48
3.2.3 PE可选头 48
3.3 节表 49
3.4 节 49
3.4.1 .edata和.idata节 50
3.4.2 PE代码节的填充 51
3.5 总结 51
3.6 练习 51
第4章 使用libbfd创建二进制加载器 53
4.1 什么是libbfd 53
4.2 一个简单的二进制加载接口 54
4.2.1 Binary类 56
4.2.2 Section类 57
4.2.3 Symbol类 57
4.3 实现二进制加载器 57
4.3.1 初始化libbfd并打开二进制文件 58
4.3.2 解析基础二进制属性 60
4.3.3 加载符号 63
4.3.4 加载节信息 66
4.4 测试二进制加载器 68
4.5 总结 71
4.6 练习 71
第二部分 二进制分析基础
第5章 Linux二进制分析 74
5.1 使用file解决类型问题 75
5.2 使用ldd探索依赖性 77
5.3 使用xxd查看文件内容 79
5.4 使用readelf解析并提取ELF库文件 81
5.5 使用nm解析符号 83
5.6 使用strings查看Hints 86
5.7 使用strace和ltrace跟踪系统调用和库文件调用 88
5.8 使用objdump检查指令集行为 93
5.9 使用GDB转储动态字符串缓冲区 95
5.10 总结 97
5.11 练习 97
第6章 反汇编与二进制分析基础 98
6.1 静态反汇编 98
6.1.1 线性反汇编 99
6.1.2 递归反汇编 101
6.2 动态反汇编 104
6.2.1 示例:使用GDB跟踪二进 制执行 105
6.2.2 代码覆盖策略 108
6.3 构建反汇编代码和数据 111
6.3.1 构建代码 112
6.3.2 构建数据 118
6.3.3 反编译 119
6.3.4 中间语言 121
6.4 基本分析方法 123
6.4.1 二进制分析的特性 123
6.4.2 控制流分析 127
6.4.3 数据流分析 129
6.5 编译器设置对反汇编的影响 132
6.6 总结 133
6.7 练习 134
第7章 简单的ELF代码注入技术 135
7.1 使用十六进制编辑器修改裸机二进制文件 135
7.1.1 在操作中观察off-by-one漏洞 136
7.1.2 修复off-by-one漏洞 139
7.2 使用LD_PRELOAD修改共享库行为 142
7.2.1 堆溢出漏洞 143
7.2.2 检测堆溢出 145
7.3 注入代码节 148
7.3.1 注入ELF节:高级概述 149
7.3.2 使用elfinject注入ELF节 151
7.4 调用注入的代码 155
7.4.1 入口点修改 155
7.4.2 劫持构造函数和析构函数 158
7.4.3 劫持GOT条目 161
7.4.4 劫持PLT条目 164
7.4.5 重定向直接调用和间接调用 165
7.5 总结 166
7.6 练习 166
第三部分 高级二进制分析
第8章 自定义反汇编 168
8.1 为什么要自定义反汇编过程 168
8.1.1 一个自定义反汇编实例:代码混淆 169
8.1.2 编写自定义反汇编器的其他原因 171
8.2 Capstone介绍 172
8.2.1 Capstone安装 173
8.2.2 Capstone线性反汇编 174
8.2.3 研究Capstone C的API 179
8.2.4 使用Capstone编写递归反汇编器 180
8.3 实现一个ROP小工具扫描器 188
8.3.1 返回导向式编程简介 189
8.3.2 寻找ROP的“gadget” 190
8.4 总结 196
8.5 练习 197
第9章 二进制插桩 198
9.1 什么是二进制插桩 198
9.1.1 二进制插桩的相关API 199
9.1.2 静态二进制插桩和动态二进制插桩的对比 199
9.2 静态二进制插桩 201
9.2.1 int 3方法 201
9.2.2 跳板方法 203
9.3 动态二进制插桩 207
9.3.1 DBI系统的体系结构 207
9.3.2 Pin介绍 209
9.4 使用Pin进行分析 210
9.4.1 Profiler的数据结构和创建代码 210
9.4.2 解析函数符号 213
9.4.3 插桩基本块 214
9.4.4 检测控制流指令 216
9.4.5 指令、控制转移及系统调用计数 219
9.4.6 测试Profiler 220
9.5 用Pin自动对二进制文件脱壳 224
9.5.1 可执行文件加壳器简介 224
9.5.2 脱壳器的配置代码及其使用的数据结构 225
9.5.3 对内存写入插桩 228
9.5.4 插桩控制流指令 229
9.5.5 跟踪内存写入 229
9.5.6 检测原始入口点并转储脱壳二进制文件 230
9.5.7 测试脱壳器 231
9.6 总结 236
9.7 练习 236
第 10章 动态污点分析的原理 237
10.1 什么是DTA 237
10.2 DTA三步:污点源、污点槽及污点传播 238
10.2.1 定义污点源 238
10.2.2 定义污点槽 239
10.2.3 追踪污点传播 239
10.3 使用DTA检测心脏滴血漏洞 239
10.3.1 心脏滴血漏洞概述 239
10.3.2 通过污点分析检测心脏滴血漏洞 241
10.4 DTA设计因素:污点粒度、污点颜色及污点传播策略 242
10.4.1 污点粒度 243
10.4.2 污点颜色 244
10.4.3 污点传播策略 244
10.4.4 过污染和欠污染 246
10.4.5 控制依赖 246
10.4.6 影子内存 247
10.5 总结 249
10.6 练习 249
第 11章 基于libdft的动态污点分析 250
11.1 libdft简介 250
11.1.1 libdft的内部结构 251
11.1.2 污点传播策略指令 253
11.2 使用DTA检测远程控制流劫持攻击 254
11.2.1 检查污点信息 257
11.2.2 污点源:将收到的字节标记为污点 258
11.2.3 检查点:检查execve参数 260
11.2.4 检测控制流劫持攻击 261
11.3 用隐式流绕过DTA 266
11.4 基于DTA的数据泄露检测器 268
11.4.1 污点源:追踪打开文件的污点 270
11.4.2 检查点:监控泄露数据的网络发送 273
11.4.3 检测数据泄露 275
11.5 总结 277
11.6 练习 277
第 12章 符号执行原理 278
12.1 符号执行概述 278
12.1.1 符号执行与正常执行的对比 279
12.1.2 符号执行的变体和局限 282
12.1.3 提高符号执行的可扩展性 286
12.2 使用Z3进行约束求解 288
12.2.1 证明指令的可达性 288
12.2.2 证明指令的不可达性 291
12.2.3 证明公式的永真性 292
12.2.4 简化表达式 293
12.2.5 使用位向量对机器码建立约束模型 294
12.2.6 用位向量求解不透明谓词 296
12.3 总结 296
12.4 练习 297
第 13章 使用Triton实现符号执行 298
13.1 Triton的介绍 298
13.2 使用抽象语法树维护符号状态 299
13.2.1 完整的抽象语法树 301
13.2.2 使用引用的抽象语法树 301
13.3 使用Triton进行后向切片 302
13.3.1 Triton的头文件以及相关配置 304
13.3.2 符号化配置文件 305
13.3.3 模拟指令 306
13.3.4 设置Triton的体系结构 307
13.3.5 计算后向切片 308
13.4 使用Triton提升代码覆盖率 310
13.4.1 创建符号变量 312
13.4.2 寻找新路径的解 313
13.4.3 测试代码覆盖工具 316
13.5 漏洞利用自动化 319
13.5.1 包含脆弱调用点的程序 320
13.5.2 查找脆弱调用点的地址 323
13.5.3 构建漏洞利用生成器 325
13.5.4 获取root权限的Shell 331
13.6 总结 334
13.7 练习 334
第四部分 附录
附录A x86汇编快速入门 336
A.1 汇编程序的布局 336
A.1.1 汇编指令、伪指令、标号及注释 337
A.1.2 代码与数据分离 338
A.1.3 AT&T和Intel语法 339
A.2 x86指令结构 339
A.2.1 x86指令的汇编层表示 339
A.2.2 x86指令的机器级结构 339
A.2.3 寄存器操作数 340
A.2.4 内存操作数 342
A.2.5 立即数 343
A.3 常见的x86指令 343
A.3.1 比较操作数和设置状态标志位 344
A.3.2 实现系统调用 345
A.3.3 实现条件跳转 345
A.3.4 加载内存地址 345
A.4 汇编的通用代码构造 345
A.4.1 栈 346
A.4.2 函数调用与函数栈帧 347
A.4.3 条件分支 351
A.4.4 循环 352
附录B 使用libelf实现PT_NOTE覆盖 354
B.1 请求头 354
B.2 elfinject使用的数据结构 355
B.3 初始化libelf 356
B.4 获取可执行头 360
B.5 查找PT_NOTE段 360
B.6 注入代码 362
B.7 为注入的节对齐加载地址 362
B.8 覆盖.note.ABI-tag节头 363
B.9 设置注入节的名称 367
B.10 覆盖PT_NOTE程序头 369
B.11 修改入口点 372
附录C 二进制分析工具清单 373
C.1 反汇编工具 373
C.1.1 IDA Pro(Windows、Linux、macOS) 373
C.1.2 Hopper(Linux、macOS) 373
C.1.3 ODA(所有操作系统) 374
C.1.4 Binary Ninja(Windows、Linux、macOS) 374
C.1.5 Relyze(Windows) 374
C.1.6 Medusa(Windows、Linux) 374
C.1.7 radare(Windows、Linux、macOS) 374
C.1.8 objdump(Linux、macOS) 374
C.2 调试器 374
C.2.1 GDB(Linux) 374
C.2.2 OllyDbg(Windows) 375
C.2.3 Windbg(Windows) 375
C.2.4 Bochs(Windows、Linux、macOS) 375
C.3 反汇编框架 375
C.3.1 Capstone(Windows、Linux、macOS ) 375
C.3.2 distorm3(Windows、Linux、macOS) 375
C.3.3 udis86(Linux、macOS) 375
C.4 二进制分析框架 376
C.4.1 angr(Windows、Linux、macOS) 376
C.4.2 Pin(Windows、Linux、macOS) 376
C.4.3 Dyninst(Windows、Linux) 376
C.4.4 Unicorn(Windows、Linux、macOS) 376
C.4.5 libdft(Linux) 376
C.4.6 Triton(Windows、Linux、macOS) 376
“安德里斯是二进制分析领域的专业人士,能够以简单的方式解释非常复杂的理论,同时十分具有专业性。”
——赫伯·博斯,系统与网络安全专业的教授
评论
还没有评论。