
本文共 2007 字,大约阅读时间需要 6 分钟。
∠Variables and Dynamic Symbol Resolution
angr是一个多架构的二进制分析平台,支持对二进制文件的动态符号执行和多种静态分析能力。在各类CTF竞赛中,angr展现出其强大的工具力。
∠Installation Guide: Surviving Dependencies
在Ubuntu系统中,首先需要安装编译所需的依赖环境:
sudo apt-get install python-dev libffi-dev build-essential virtualenvwrapper
为避免angr依赖覆盖官方共享库,建议在虚拟环境中安装:
mkvirtualenv angr sudo pip install angr
如果安装出现问题,可按顺序从angr官方仓库安装claripy、archinfo等项目。
∠Exploring binary Analysis with angr
使用angr的第一步是创建一个工程,所有操作都围绕该工程展开:
$> import angr
proj = angr.Project('/bin/true') WARNING: The main binary is a position-independent executable. It will be loaded with a base address of 0x400000.
通过proj可获取文件信息:
proj.filename # '/bin/true' proj.arch # archinfo.Arch对象 hex(proj.entry) # 0x401370
proj.loader帮助分析二进制文件中包含的对象文件等信息:
proj.loader.main_object # 主对象文件信息 proj.loader.shared_objects # 共享对象列表
Power of ang:Dynamic Symbol Resolution
_symbol resolution是angr的核心能力之一。ANGR通过符号执行技术,将程序的输出表示为符号表达式或数学表达式,并利用约束求解器进行求解。
Memory And Registers:
state = proj.factory.entry_state() state.regs # 寄存器名对象 state.mem # 内存操作
Registers和内存的读写:
$> state.mem[0x1000].long = state.solver.BVV(4, 64) $> state.mem[0x1000].long.resolved # 获取具体数值 $> state.mem[0x1000].long.concrete # 获取Python整数
Simulation Management
模拟管理器是angr最重要的接口。它允许对各个符号状态进行并排处理,还支持多种探索技术:
$> simgr = proj.factory.simgr(state) $> while len(simgr.active) == 1: simgr.step()
Deadends and Stashes
当程序无法继续执行时,状态会被放入deadended stash。推荐使用模拟管理器进行操作:
$> simgr.move(from_stash='deadended', to_stash='more_then_50', filter_func=lambda s: '100' in s.posix.dumps(1))
Exploring
了解程序的执行路径,查看Control-Flow Graph(CFG),以判断程序控制流:
$> cfg = proj.analyses.CFGFast() $> entry_node = cfg.get_any_node(proj.entry) $> len(cfg.graph.successors(entry_node))
# 控制流图中出口数量VEX Intermediate Representation
VEX是angr的中间表示,它将机器码转换为VEX IR。在angr中,可以通过PyVEX库进行处理:
$> import pyvex
bb = pyvex.IRSB('\xc3', 0x400400, archinfo.ArchAMD64()) bb.statements[3].data # 获取单个指令
Advanced Uses
在angr之上开发工具:
Reference Information 更多技术细节请参考官方文档和社区资源。
发表评论
最新留言
关于作者
