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】操作:

  1. 使用array [index]表示法指定地址
  2. .<type>解释指定内存类型为char, short, int, long, size_t, uint8_t, uint16_t..
  3. 操作.resolved将值作为向量获取,. Concrete将值作为Python int 获取

接口-模拟管理(Simulation Managers)

       state表示一个指定时间的程序运行状态,需要有一种方法将它及时传给_next_点。simulation manager在angr中是主要接口,用于执行,模拟,通过state你可以想怎么调用它干啥都行。为简要介绍,让我们展示如何tick我们之前创建的state转发给几个基本块。

posted @ 2019-09-24 22:18  0xM2r00t  阅读(810)  评论(0编辑  收藏  举报