-
-
[原创] 符号学习之 Angr(一)angr API 简要学习
-
发表于: 2021-4-26 11:28 7894
-
angr 是多架构二进制分析工具,能够执行动态符号执行和多种静态分析
主要查看常见信息
angr 模块的主类,用来容纳二进制集及他们之间的关系并提供分析
常见变量
常用函数
SimState 表示程序的状态,包括内存、寄存器等
常见变量与属性
常用函数
SimMemView
访问内存便捷接口
SimFile
在硬盘中构建文件
参数:name, content, size
Memory Mixins
主要功能是处理 State,并根据需要进行 step forward, filter, merge, move around
例如,可以以不同的速率步进两个不同的状态 stashes,然后将其进行 merge
Stashes 可以被作为属性获取到(比如 .active
)
多路复用 可以加上 mp_
,单个状态可以加上 one_
注意:不应直接构造 SimulationManager,有便携的方式创建 factory
最重要的方法是 step
explore
use_technique
exploreexplore(stash='active', n=None, find=None, avoid=None, find_stash='found',avoid_stash='avoid', cfg=None, num_find=1, **kwargs)
explore 主要用来探索路径的可能性
查找 find
条件 --> 存入 find_stash
避免 avoid
条件 --> 存入 avoid_stash
find 和 avoid 参数可能是:
SimProcedure
这是一个非常棒的对象,可以用来描述状态运行的流程
通常可以构建子类并重写 run()
函数
程序上的各种分析
主要类
angr.analysis.backward_slice.BackwardSlice
程序后端切片。
基于 CFG,CDG,DDG 从特定语句创建后端切片
angr.analysis.bindiff.BinDiff
计算 angr Project 表示的两个二进制之间的 diff
angr.analysis.cfg.cfg_fast.CFGFast
在给定的二进制文件中查找函数,并以非常快速的方式构建控制流程图:避免模拟程序执行、跟踪状态、展示花费巨大的数据流分析,CFGFast 将展现轻量级分析,部分启发式,部分强假设
CLE 是一个可拓展的二进制加载器,主要目标是加载可执行文件及所依赖的各种库,生成程序加载和执行的地址空间
Loder
加载所有对象和输出进程的内存抽象
常见可选参数:
可选项字典需要从以下键值中选取:
除非进行核心分析,否则不必要用到深层 API,大部分时间均当作 z3 的简易前端
PyVEX 提供接口,能够将二进制代码转换成 VEX 中间语言
archinfo 是一个类集合,包含了制定架构信息,用于辅助跨架构工具,比如 pyvex
参考资料
官网文档
670K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6V1L8$3y4K6i4K6u0W2j5h3&6Y4M7W2)9J5k6h3W2G2i4K6u0r3
727K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3q4F1k6%4u0Q4x3X3g2A6L8#2)9J5c8X3q4H3K9g2)9J5k6r3c8G2j5#2)9J5c8X3W2F1k6r3g2^5i4K6u0W2K9s2c8E0L8l9`.`.
db6K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6S2L8X3N6J5i4K6u0r3j5h3&6Y4M7W2)9J5c8Y4c8J5k6h3g2Q4x3V1k6E0j5i4y4@1k6i4u0Q4x3V1k6S2L8X3N6J5i4K6u0r3M7s2u0G2j5$3g2V1N6i4u0W2M7#2)9J5c8X3I4A6j5X3x3`.
49bK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2B7K9h3q4F1M7$3S2#2i4K6u0W2j5$3!0E0i4K6u0r3M7q4)9J5c8X3j5$3y4U0l9^5x3o6m8T1j5U0M7H3k6R3`.`.
7b3K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6^5P5W2)9J5k6h3q4D9K9i4W2#2L8W2)9J5k6h3y4G2L8g2)9J5c8Y4c8Q4x3V1j5%4x3e0p5%4i4K6t1K6N6r3!0U0i4K6u0V1x3e0b7`.
analysis
— 可用分析类型factory
— 提供对重要分析节点的访问,比如路径组、符号执行结果loader
— 程序加载器storage
— 应该被加载或存储的字典
hook(addr, hook=None, length=0)
使用一个函数去 Hook 一节代码factory.blank_state(**kargs)
返回一个几乎未初始化的状态对象factory.entry_state(**kargs)
返回一个代表程序入口点的状态对象call_state(addr, *args, **kwargs)
返回初始化到给定函数起点的状态对象,就像是被传入给定参数调用simulation_manager()
regs
— 寄存器mem
— 内存memory
— 作为 flat memory regionsolver
— 符号求解和变量管理器addr
— 指令指针的具体地址
add_constraints
— 添加约束satisfiable
— 当约束满足时step
— 使用当前状态执行符号执行copy
— 复制状态stack_push
— 入栈stack_pop
— 出栈