深入理解angr项目的执行流水线

深入理解angr项目的执行流水线

angr A powerful and user-friendly binary analysis platform! angr 项目地址: https://gitcode.com/gh_mirrors/an/angr

引言

在二进制分析领域,angr作为一个强大的符号执行框架,其核心是一个高度灵活且可深度定制的模拟器。要充分发挥angr的潜力,理解其执行流水线的工作原理至关重要。本文将深入剖析angr从调用simgr.run()开始到最终执行完成的整个执行流程,帮助开发者更好地控制和定制分析过程。

执行流程概述

angr的执行流水线可以看作是一个分层处理的过程,从顶层的SimulationManager到底层的执行引擎,每一层都有其特定的职责和处理逻辑。理解这个流水线对于调试分析过程、开发自定义探索技术以及优化性能都至关重要。

SimulationManager层

run()方法剖析

SimulationManager.run()方法是启动分析的入口点,它控制着整个执行过程的循环逻辑。该方法接受多个可选参数,其中最重要的是nuntil

  • n参数指定最大执行步数
  • until参数接受一个回调函数,当返回True时终止执行

执行循环会在以下任一条件满足时终止:

  1. 达到指定的步数限制
  2. until回调函数返回True
  3. 探索技术的complete()钩子指示分析完成
  4. 当前处理的stash变为空

explore()方法简析

explore()run()的一个便捷包装,它自动添加了Explorer探索技术,简化了常见的一次性探索操作。其核心逻辑是临时添加探索技术,执行run(),最后移除该技术。

探索技术钩子机制

angr通过探索技术(ExplorationTechnique)实现对执行流程的定制。当调用use_technique()时,angr会动态修改SimulationManager的方法,使得探索技术的实现可以拦截或修改原始行为。这种机制虽然实现上有些"hacky",但提供了强大而清晰的接口。

step()方法详解

step()方法处理了许多边界情况,包括:

  • 管理deadended stash
  • 处理save_unsat选项
  • 调用探索技术的filter()钩子

其核心逻辑是遍历指定stash中的状态,对每个状态调用step_state(),然后根据返回结果更新stash。

step_state()方法

step_state()方法的主要职责是:

  1. 调用successors()获取后继状态
  2. 将结果转换为stash映射字典
  3. 处理执行过程中可能出现的错误

successors()方法

该方法负责获取状态的后继,可以选择:

  • 使用提供的successor_func参数指定的函数
  • 默认使用project.factory.successors方法

执行引擎层

引擎选择机制

angr支持多种执行引擎,可以通过engine参数指定。这个参数可以从顶层方法一直传递到底层引擎,其他不相关的参数会被引擎自动过滤掉。

引擎处理流程

引擎的主要入口是SimEngine.process()方法,对于模拟管理器,引擎必须实现SuccessorsMixin,它提供了:

  1. process()方法创建SimSuccessors对象
  2. 调用process_successors()让其他mixin填充结果

UberEngine的组成

angr的默认引擎UberEngine由多个mixin组成,按顺序尝试处理状态:

  1. SimEngineFailure:处理错误跳转类型
  2. SimEngineSyscall:处理系统调用
  3. HooksMixin:处理hook地址
  4. SimEngineUnicorn:使用Unicorn引擎执行原生代码
  5. SootMixin:处理Java字节码
  6. HeavyVEXMixin:使用VEX IR进行符号执行

各引擎mixin详解

  1. SimEngineFailure:处理特殊跳转类型如Ijk_EmFailIjk_MapFail等,通常抛出异常或终止执行。

  2. SimEngineSyscall:通过SimOS获取并执行对应的SimProcedure来处理系统调用。

  3. HooksMixin:查找并执行地址hook,也可以通过procedure参数强制指定处理过程。

  4. SimEngineUnicorn:在满足条件时使用Unicorn引擎进行具体执行。

  5. SimEngineVEX:作为最后的回退方案,将字节码提升为IRSB并进行符号执行。

Unicorn引擎使用详解

启用Unicorn引擎

要启用Unicorn引擎,需要设置状态选项:

state.options.update(angr.options.unicorn)

这会启用一组优化过的选项,包括:

  • UNICORN:基本启用
  • UNICORN_SYM_REGS_SUPPORT:符号寄存器支持
  • INITIALIZE_ZERO_REGISTERS:零寄存器初始化
  • UNICORN_HANDLE_TRANSMIT_SYSCALL:系统调用处理

Unicorn执行流程

  1. 启动阶段:设置最大步数防止无限循环
  2. 内存映射:按需延迟映射内存页
  3. 执行监控:记录执行步数和终止原因
  4. 冷却机制:避免频繁进入/退出Unicorn造成的性能损失

调试技巧

可以通过日志了解Unicorn的执行细节:

import logging
logging.getLogger('angr.engines.unicorn_engine').setLevel('DEBUG')
logging.getLogger('angr.state_plugins.unicorn_engine').setLevel('DEBUG')

日志会显示:

  • 开始/结束执行的地址
  • 内存映射情况
  • 执行步数统计
  • 退出原因分析

总结

angr的执行流水线是一个精心设计的层次结构,从高层的执行管理到底层的具体执行引擎,每一层都提供了丰富的定制点。理解这个流水线的工作原理,可以帮助开发者:

  1. 更有效地调试分析过程
  2. 开发自定义的探索技术
  3. 优化分析性能
  4. 处理特殊的执行情况

通过合理配置状态选项和引擎参数,可以针对不同的分析需求调整angr的行为,获得最佳的分析效果。

angr A powerful and user-friendly binary analysis platform! angr 项目地址: https://gitcode.com/gh_mirrors/an/angr

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

资源下载链接为: https://pan.quark.cn/s/f7286fdf65f9 本项目旨在实现对MNIST手写体数字的识别。项目包含MNIST数据集、训练代码、验证代码、测试代码、实验报告以及手写体数字测试样例图片。运行环境为PyCharm搭配TensorFlow 1.x。 MNIST数据集是手写体数字识别领域经典的数据集,包含了大量手写数字的灰度图像,每个图像的尺寸为28×28像素,涵盖了0到9这十个数字。数据集分为训练集和测试集,训练集用于训练模型,测试集用于评估模型性能。 训练代码负责构建神经网络模型,并使用MNIST训练集对模型进行训练。在训练过程中,模型会不断学习输入图像与对应数字标签之间的映射关系,通过优化算法调整模型参数,以降低预测误差,提高模型对训练数据的拟合程度。 验证代码用于在训练过程中对模型进行验证。通过将训练好的模型应用于验证集,可以评估模型在未见过的数据上的表现,从而判断模型是否存在过拟合或欠拟合的情况,以便及时调整模型结构或训练策略。 测试代码利用训练完成的模型对MNIST测试集或手写体数字测试样例图片进行预测。它将输入图像输入到模型中,模型会输出预测的数字类别。同时,测试代码还会将预测值与原始值进行对比,并在终端输出预测值和原始值,方便用户直观地查看模型的预测结果是否准确。 实验报告详细记录了整个项目的实验过程和结果。包括模型的构建过程、训练策略的选择、验证过程中的模型性能评估指标(如准确率、召回率等),以及测试阶段模型对不同测试数据的预测准确率等。通过对实验结果的分析,可以总结出模型的优势和不足,为进一步优化模型提供参考。 为了更直观地展示模型的泛化能力,项目中还提供了手写体数字的测试样例图片。这些图片可以是用户自己手写绘制的数字图像,也可以是从其他渠道获取的手写数字图片。将这些测试样例图片输入到模型中进行预测,可以直观地观察模型对
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

解银旦Fannie

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值