第一部分 二进制格式
第1章 二进制简介
1.1 C编译过程
1.1.1 预处理阶段
1.1.2 编译阶段
1.1.3 汇编阶段
1.1.4 链接阶段
1.2 符号和剥离的二进制文件
1.2.1 查看符号信息
1.2.2 剥离二进制文件
1.3 反汇编二进制文件
1.3.1 查看对象文件
1.3.2 检查完整的二进制执行体
1.4 加载并执行二进制文件
1.5 总结
1.6 练习
第2章 ELF格式
2.1 ELF头部
2.1.1 e_ident数组
2.1.2 e_type、e_machine及e_version字段
2.1.3 e_entry字段
2.1.4 e_phoff和e_shoff字段
2.1.5 e_flags字段
2.1.6 e_ehsize字段
2.1.7 e_*entsize和e_*num字段
2.1.8 e_shstrndx字段
2.2 节头
2.2.1 sh_name字段
2.2.2 sh_type字段
2.2.3 sh_flags字段
2.2.4 sh_addr、sh_offset及sh_size字段
2.2.5 sh_link字段
2.2.6 sh_info字段
2.2.7 sh_addralign字段
2.2.8 sh_entsize字段
2.3 节
2.3.1 .init和.fini节
2.3.2 .text节
2.3.3 .bss、.data及.rodata节
2.3.4 延迟绑定和.plt、.got及.got.plt节
2.3.5 .rel.*和.rela.*节
2.3.6 .dynamic节
2.3.7 .init_array和.fini_array节
2.3.8 .shstrtab、.symtab、.strtab、.dynsym及.dynstr节
2.4 程序头
2.4.1 p_type字段
2.4.2 p_flags字段
2.4.3 p_offset、p_vaddr、p_paddr、p_filesz及p_memsz字段
2.4.4 p_align字段
2.5 总结
2.6 练习
第3章 PE格式简介
3.1 MS-DOS头和MS-DOS存根
3.2 PE签名、PF文件头及PE可选头
3.2.1 PE签名
3.2.2 PE文件头
3.2.3 PE可选头
3.3 节表
3.4 节
3.4.1 .edata和.idata节
3.4.2 PE代码节的填充
3.5 总结
3.6 练习
第4章 使用libbfd创建二进制加载器
4.1 什么是libbfd
4.2 一个简单的二进制加载接口
4.2.1 Binary类
4.2.2 Section类
4.2.3 Symbol类
4.3 实现二进制加载器
4.3.1 初始化libbfd并打开二进制文件
4.3.2 解析基础二进制属性
4.3.3 加载符号
4.3.4 加载节信息
4.4 测试二进制加载器
4.5 总结
4.6 练习
第二部分 二进制分析基础
第5章 Linux二进制分析
5.1 使用file解决类型问题
5.2 使用ldd探索依赖性
5.3 使用xxd查看文件内容
5.4 使用readelf解析并提取ELF库文件
5.5 使用nm解析符号
5.6 使用strings查看Hints
5.7 使用strace和ltrace跟踪系统调用和库文件调用
5.8 使用objdump检查指令集行为
5.9 使用GDB转储动态字符串缓冲区
5.10 总结
5.11 练习
第6章 反汇编与二进制分析基础
6.1 静态反汇编
6.1.1 线性反汇编
6.1.2 递归反汇编
6.2 动态反汇编
6.2.1 示例:使用GDB跟踪二进制执行
6.2.2 代码覆盖策略
6.3 构建反汇编代码和数据
6.3.1 构建代码
6.3.2 构建数据
6.3.3 反编译
6.3.4 中间语言
6.4 基本分析方法
6.4.1 二进制分析的特性
6.4.2 控制流分析
6.4.3 数据流分析
6.5 编译器设置对反汇编的影响
6.6 总结
6.7 练习
第7章 简单的ELF代码注入技术
7.1 使用十六进制编辑器修改裸机二进制文件
7.1.1 在操作中观察off-by-one漏洞
7.1.2 修复off-by-one漏洞
7.2 使用LD_PRELOAD修改共享库行为
7.2.1 堆溢出漏洞
7.2.2 检测堆溢出
7.3 注入代码节
7.3.1 注入ELF节:高级概述
7.3.2 使用elfinject注入ELF节
7.4 调用注入的代码
7.4.1 入口点修改
7.4.2 劫持构造函数和析构函数
7.4.3 劫持GOT条目
7.4.4 劫持PLT条目
7.4.5 重定向直接调用和间接调用
7.5 总结
7.6 练习
第三部分 高级二进制分析
第8章 自定义反汇编
8.1 为什么要自定义反汇编过程
8.1.1 一个自定义反汇编实例:代码混淆
8.1.2 编写自定义反汇编器的其他原因
8.2 Capstone介绍
8.2.1 Capstone安装
8.2.2 Capstone线性反汇编
8.2.3 研究Capstone C的API
8.2.4 使用Capstone编写递归反汇编器
8.3 实现一个ROP小工具扫描器
8.3.1 返回导向式编程简介
8.3.2 寻找ROP的“gadget”
8.4 总结
8.5 练习
第9章 二进制插桩
9.1 什
展开