Angr
from angr import * import logging logging.getLogger('angr.manager').setLevel(logging.DEBUG) #用来记录日志 p = Project("test",auto_load_libs=False) #装载一个项目,即进程 state=p.factory.entry_state() #创建一个SimState对象,即程序状态 sm=p.factory.simulation_manager(state) #为上面对象创建模拟器 res=sm.explore(find=0x4005fb,avoid=0x400607) #利用explore求解 print len(res.found) #打印找到的结果 if len(res.found) > 0: print res.found[0].posix.dumps(0)
开始
import angr #包含angr库
import monkeyhex #是输出结果为16进制
proj = angr.Project('your_binary') #加载二进制
接口-基本属性(ARch)
proj.arch ##输出CPU体系结构
proj.entry ##程序入口地址
proj.filename ##程序名字
接口-加载器(Loader)
proj.loader ##输出程序加载信息
proj.loader.shared_objects ##输出加载的SO库信息
proj.loader.min_addr ##输出程序所占最小地址
proj.loader.max_addr ##同上
proj.loader.main_object ##输出程序主体内存信息
proj.loader.main_object.execstack ##检查栈可执行
proj.loader.main_object.pic ##检查是否地址无关代码,被加载任意地址
接口-工厂(Factory)
获取SimState对象,factory有许多构造函数,调用不同的构造函数实例化出不同的factory对象。
SimState对象在angr其中的一个子模块SimuVEX中,它追踪且记录着符号信息、符号对应的内存信息和符号对应的寄存器信息,以及打开的文件信息在当前状态等。
block=proj.factory.block(proj.entry) ##获取入口的代码块##angr以代码块为基础
block.pp() ##pretty-print信息块
block.instructions ##有多少指令
block.instruction.addrs ##这些指令的地址
block.capstone ##capstone反汇编
block.vex ##VEX (python 内部地址)
接口-状态(States)
state = proj.factory.entry_state() ##进入state状态,获取运行状态
state.regs.rip ##获取当前状态下的RIP寄存器数值
state.regs.rax
state.mem[proj.entry].int.resolved ##将入口点的内存解释为C int
bv = state.solver.BVV(0x1234, 32) ##创建一个32位宽的位向量值为0x1234 BVV代表为位向量
state.solver.eval(bv) ##转换为python int
state.regs.rsi = state.solver.BVV(3, 64)##将当前RSI复制为0x3的64位数据
state.mem[0x1000].long = 4
state.mem[0x1000].long.resolved
【mem】操作:
- 使用array [index]表示法指定地址
- .<type>解释指定内存类型为char, short, int, long, size_t, uint8_t, uint16_t..
- 操作.resolved将值作为向量获取,. Concrete将值作为Python int 获取
接口-模拟管理(Simulation Managers)
state表示一个指定时间的程序运行状态,需要有一种方法将它及时传给_next_点。simulation manager在angr中是主要接口,用于执行,模拟,通过state你可以想怎么调用它干啥都行。为简要介绍,让我们展示如何tick我们之前创建的state转发给几个基本块。