文档信息
书名: Practical Binary Analysis(二进制分析实战)
作者: Dennis Andriesse
年份: 2018
索引: TP301.6 3426
Chapter 1 - 二进制简介
剥离二进制文件命令:
1 | strip --strip-all a.out |
使用objdump反汇编二进制文件命令:
1 | objdump -M intel -d a.out |
Chapter 2 - ELF格式
GOT表格存在的必要性
已经存在PLT机制的情况下,还要设计GOT机制的原因:
- 权限分离,代码段出于安全原因,不允许运行时修改,将修改的内容分离出来,放到GOT表中。
- 对于现在的操作系统设计,共享库的代码是共享的,因此PLT表格不应该修改,每个进程维护自己的GOT副本即可。
.got和.got.plt节的区别:
.got用于引用数据表项,而.got.plt用于存储通过PLT访问的(已解析的)库函数地址。
特殊section的作用
.dynamic节: 充当操作系统和动态链接器的”路线图”
Chapter3 - PE格式简介
PE是通用对象文件格式(Common Object File Format, COFF)的修改版本,因此PE有时候也被称为PE/COFF。
PE格式为了保证对MS-DOS格式的兼容,每个PE文件以MS-DOS头开始,当PE格式的文件在MS-DOS操作系统上执行时,这个存根就会被执行,理论上来说,这个存根可以是程序的完整MS-DOS版本。
在反汇编PE二进制文件时,可能会发现很多int3指令,这些指令来自Visual Studio的填充动作。
Chapter 4 - 使用libbfd创建二进制加载器
Chapter 5 - Linux二进制分析
使用xdd查看文件内容的命令:
1 | xdd a.out | head -n 15 |
使用nm对C++ namespace符号进行demangle:
1 | nm -D --demangle xxx.so |
strace可以追踪二进制执行时的系统调用。
ltrace可以追踪二进制执行时的库文件调用。
Chapter 6 - 反汇编与二进制分析基础
二进制分析可以分为静态分析、动态分析或者两者的组合。
静态汇编的两种方法:线性汇编和递归反汇编。
.eh_frame section可以用于函数检测。
二进制分析的不同特性:
- 程序间和程序内分析
这二者的区别在于分析的基本单位不同。 - flow-sensitive(流敏感性)
是否需要考虑指令的顺序 - context-sensitivity (上下文敏感性)
是否需要考虑函数调用的顺序
数据流分析:
- reaching definition analysis(到达定义分析)
- Use-Def链
- 程序切片
Chapter 7 - 简单的ELF代码注入技术
通过elfinject可以对现有的二进制进行节注入,这部分的原理比较简单,在section修改的基础上,同步对header部分的更新。
Chapter 8 - 自定义反汇编
Capstone是一个流行的反汇编框架。
glibc-2.22中一种利用重叠指令来实现功能的实例(手写汇编):
1 | 7b05a: cmp DWORD PTR fs:0x18,0x0 |
通过条件跳转来决定是否跳过lock前缀字节。
自定义反汇编的原因:
- 解决二进制混淆
- 扫描ROP指令
objdump可以从指定地址开始进行反汇编:
1 | objdump -M intel --start-address=0x400612 -d a.out |
ROP程序的生成过程:
- 扫描二进制,寻找可以用的ROP gadget。
- 在堆栈利用扫描的ROP gadget地址进行构造。
Chapter 9 - 二进制插桩
二进制插桩可以分为:
- Static Binary Instrumentation(SBI 静态二进制插桩)
- Dynamic Binary Instrumentation(DBI 动态二进制插桩)
静态二进制插桩方法
int3方法
通过int3,通过中断处理函数,触发插桩逻辑的处理。在实践中,int3虽然只有一个字节,但是也会破坏一条指令,因此需要对原有的指令进行记录,在执行插桩逻辑前,需要对该指令进行执行,必要时,需要进行分析和模拟。trampoline(跳板)方法
该方法的执行过程:
- 复制原有代码的副本
- 处理副本中的引用部分
动态二进制插桩方法
流行的DBI工具:
- Pin
- DynamoRIO
可执行文件加壳器:参考vmlinux执行时的压缩和解压动作。
DBI可以被用来脱壳。
Chapter 10 - 动态污点分析的原理(Dynamic Taint Analysis, DTA)
DTA的分析过程:
- 定义污染源(taint source)
- 定义污点槽(taint sink)
- 追踪污点传播 - 可以借助libdft实现
Chapter 12 - 符号执行原理
符号执行时一种使用逻辑公式表示程序状态、自动解决有关程序行为等复杂问题的软件分析技术。
流行的二进制符号执行引擎:
- Triton
- angr
- S2E
二进制分析工具清单
反汇编工具:
- IDA pro
- Hopper
- ODA
- Binary Nija
- Relyze
- Medusa
- radare
- objdump
调试器:
- GDB
- OllyDbg
- Windbg
- Bochs
反汇编框架:
- Capstone
- distorm3
- udis86
二进制分析框架:
- angr
- Pin
- Dyninst
- Unicorn
- libdft
- Triton