zoukankan      html  css  js  c++  java
  • 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转发给几个基本块。

  • 相关阅读:
    课时8:环绕通知
    课时7:后置通知、异常通知
    课时6::AOP、execution表达式、前置通知
    课时:5 使用注解实现声明式事务
    课时22::PageHelper分页插件
    课时21 :使用MyBatis实现批量操作
    课时4:特殊值的注入问题和各种类型的自动装配
    课时3:三种方式的依赖注入、给各种集合类型的属性注入
    课时2:解耦合发展史、控制反转、依赖注入
    课时1:Spring环境搭建、STS工具、第一个Spring程序
  • 原文地址:https://www.cnblogs.com/0xHack/p/11581529.html
Copyright © 2011-2022 走看看