首页
社区
课程
招聘
[原创] 符号学习之 Angr(一)angr API 简要学习
发表于: 2021-4-26 11:28 7894

[原创] 符号学习之 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

explore
explore(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 region
  • solver — 符号求解和变量管理器
  • addr — 指令指针的具体地址
  • add_constraints — 添加约束
  • satisfiable — 当约束满足时
  • step — 使用当前状态执行符号执行
  • copy — 复制状态
  • stack_push — 入栈
  • stack_pop — 出栈

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回