angr学习
0、资料
几个主要的网站
angr的github:https://github.com/angr
angr的document:https://docs.angr.io/
angr的api:https://angr.io/api-doc/
1、angr安装
我的实验环境是Ubuntu14.04,显示安装依赖:
sudo apt-get install python-dev libffi-dev build-essential virtualenv
然后新建一个python虚拟环境,进入angr环境
virtualenv angr
source angr/bin/activate
安装angr
sudo pip install angr
2、angr中的基本概念
Project
Project是angr中的基本概念,通过下面的简单两行代码可以新建一个Project变量
import angr
p = angr.Project('/bin/sh')
project中有一些基本属性,然后打印他们,包括arch中的很多属性
print(p.arch)
print(p.arch.bits)
print(p.arch.name)
print(p.arch.bytes)
print(p.arch.memory_endness)
print(hex(p.entry))
print(p.filename)
结果
<Arch AMD64 (LE)>
64
AMD64
8
Iend_LE
0x404e32
/bin/sh
loader
loader是表示可执行文件加载到内存之中的变量,同样先来看一些基本的属性,打印他们
print(p.loader)#主程序对象,下面的打印结果显示程序的名字是dash
print(p.loader.shared_objects)#动态库对象,结果包含了动态连接器、库以及主程序
print(p.loader.min_addr)
print(p.loader.max_addr)
print(p.loader.main_object)#主对象
print(p.loader.main_object.execstack)#是否有可执行栈,即是否开启了nx
print(p.loader.main_object.pic)#是否是地址无关代码
结果如下:
<Loaded dash, maps [0x400000:0x5008000]>
OrderedDict([('dash', <ELF Object dash, maps [0x400000:0x61fde7]>), (u'libc.so.6', <ELF Object libc-2.19.so, maps [0x1000000:0x13c82bf]>), (u'ld-linux-x86-64.so.2', <ELF Object ld-2.19.so, maps [0x2000000:0x22241c7]>)])
4194304
83918848
<ELF Object dash, maps [0x400000:0x61fde7]>
False
True
factory
可以使用project构造一系列对象
Blocks
angr可以从基本块的角度来分析程序,block代表基本块,给project.factory.block()函数传递一个地址,则会返回一个block对象
看block中有哪些对象,将p.entry传递给block函数
block = p.factory.block(p.entry)
print(block)#基本块信息
print(block.pp())#打印出汇编指令
print(block.instructions)#打印出指令数目
print(block.instruction_addrs)#打印出每条指令的地址
结果:
<Block for 0x404e32, 41 bytes>
0x404e32: xor ebp, ebp
0x404e34: mov r9, rdx
0x404e37: pop rsi
0x404e38: mov rdx, rsp
0x404e3b: and rsp, 0xfffffffffffffff0
0x404e3f: push rax
0x404e40: push rsp
0x404e41: lea r8, qword ptr [rip + 0x10c88]
0x404e48: lea rcx, qword ptr [rip + 0x10c11]
0x404e4f: lea rdi, qword ptr [rip - 0x1f6]
0x404e56: call 0x404900
None
11
[4214322L, 4214324L, 4214327L, 4214328L, 4214331L, 4214335L, 4214336L, 4214337L, 4214344L, 4214351L, 4214358L]
同时,可以使用block来获得其他的对象
print(block.capstone)
print(block.vex)
States
在angr中,project代表一个可执行文件的映像,如果要模拟执行程序,则需要angr中的SimState的对象states来表示程序状态
state = p.factory.entry_state()
看里面的一些属性
print(state.regs.rip)#rip的值
print(state.regs.rax)#rax的值
print(state.mem[p.entry].int.resolved)#以int的格式打印出p.entry处的值
结果,因为是初始状态,所以初始的rip指向的是p.entry的值
<BV64 0x404e32>
<BV64 0x1c>
<BV32 0x8949ed31>
上面这些都是不python中int值的含义,BV指的Bitvector,位向量。
这样来进行位向量和int值的转换
>>> bv = state.solver.BVV(0x1234, 32) # create a 32-bit-wide bitvector with value 0x1234
<BV32 0x1234> # BVV stands for bitvector value
>>> state.solver.eval(bv) # convert to python int
0x1234
>>> state.regs.rsi = state.solver.BVV(3, 64)
>>> state.regs.rsi
<BV64 0x3>
然后看mem接口
>>> state.regs.rsi = state.solver.BVV(3, 64)
>>> state.regs.rsi
<BV64 0x3> >>> state.mem[0x1000].long = 4
>>> state.mem[0x1000].long.resolved
<BV64 0x4>
使用数组[索引]符号指定地址
使用.<type>指定内存应该解释为<type>(常见值:char、short、int、long、size_t、uint8_t、uint16_t…)
从那里,你可以:
为它存储一个值,可以是位向量,也可以是python int
使用.resolve获取作为位向量的值
使用.concrete获取作为python int的值
>>> state.regs.rdi
<BV64 reg_48_11_64{UNINITIALIZED}>
这仍然是一个64位位向量,但它不包含数值。相反,它有一个名字!这被称为符号变量,它是符号执行的基础。
Simulation Managers
模拟管理器,管理了程序在执行过程之中的各种接口,看看新建一个模拟管理器,使用statue
simgr = proj.factory.simulation_manager(state)
往下执行一个基本快
simgr.step()
我们可以看看simgr.active[0]来查看我们当前的statue,simgr.active[0].regs.rip则会打印寄存器的RIP,可以发现它和初始化simgr的statue已经不同了
Analyses
project中定义了许多的analyses
# Originally, when we loaded this binary it also loaded all its dependencies into the same virtual address space
# This is undesirable for most analysis.
>>> proj = angr.Project('/bin/true', auto_load_libs=False)
>>> cfg = proj.analyses.CFGFast()
<CFGFast Analysis Result at 0x2d85130> # cfg.graph is a networkx DiGraph full of CFGNode instances
# You should go look up the networkx APIs to learn how to use this!
>>> cfg.graph
<networkx.classes.digraph.DiGraph at 0x2da43a0>
>>> len(cfg.graph.nodes())
951 # To get the CFGNode for a given address, use cfg.get_any_node
>>> entry_node = cfg.get_any_node(proj.entry)
>>> len(list(cfg.graph.successors(entry_node)))
2
angr学习的更多相关文章
- angr 学习笔记
前言 angr 是一个基于 符号执行 和 模拟执行 的二进制框架,可以用在很多的场景,比如逆向分析,漏洞挖掘等.本文对他的学习做一个总结. 安装 这里介绍 ubuntu 下的安装,其他平台可以看 官方 ...
- 符号执行-基于python的二进制分析框架angr
转载:All Right 符号执行概述 在学习这个框架之前首先要知道符号执行.符号执行技术使用符号值代替数字值执行程序,得到的变量的值是由输入变 量的符号值和常量组成的表达式.符号执行技术首先由Kin ...
- 动若脱兔:深入浅出angr--初步理解符号执行以及angr架构
一:概论 angr作为符号执行的工具,集成了过去的许多分析方式,它不仅能进行动态符号执行,而且还能进行很多静态分析,他在分析二进制程序中能发挥很大的作用,下面为一些应用: 1:利用符号执行探究执行路径 ...
- kali安装angr
最近打算重新学习一波angr,先把环境搭好 1. 先安装virtualenv,这玩意是可以创建一个纯净的python环境,我陷入了沉思,pyenv好像也可以 这里利用豆瓣的源下载,非常快而且很舒服 p ...
- 从直播编程到直播教育:LiveEdu.tv开启多元化的在线学习直播时代
2015年9月,一个叫Livecoding.tv的网站在互联网上引起了编程界的注意.缘于Pingwest品玩的一位编辑在上网时无意中发现了这个网站,并写了一篇文章<一个比直播睡觉更奇怪的网站:直 ...
- Angular2学习笔记(1)
Angular2学习笔记(1) 1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之 ...
- ABP入门系列(1)——学习Abp框架之实操演练
作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...
- 消息队列——RabbitMQ学习笔记
消息队列--RabbitMQ学习笔记 1. 写在前面 昨天简单学习了一个消息队列项目--RabbitMQ,今天趁热打铁,将学到的东西记录下来. 学习的资料主要是官网给出的6个基本的消息发送/接收模型, ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
随机推荐
- STM32基于固件库新建MDK工程模板(精简版)
上个博文理论讲解的东西太多,太复杂,这里把所有步骤全部贴出 1.新建一个工程文件夹LED 2.LED文件夹下建立如下文件夹 3.Project –>New Uvision Project 到US ...
- java 判断是否为中文字符,部分,。中文符号不能识别
public static void main(String[] args) { int i = 0; for (char c : ",.判断一个字符串是否有中文一般情况是利用Unicode ...
- MYSQL—— Insert的几种用法!
向表中插入数据 标题头示例图如下: 用insert插入值得方式: 1.使用如下语句进行插入值操作,要求:插入值必须与表头给出列数值一致,否则报:[Err] 1136 - Column count do ...
- springboot2.x里面访问静态资源的坑
在spring boot的自定义配置类继承 WebMvcConfigurationSupport 后,发现自动配置的静态资源路径( classpath:/META/resources/,classpa ...
- SpringBoot进阶教程(二十八)整合Redis事物
Redis默认情况下,事务支持被禁用,必须通过设置setEnableTransactionSupport(true)为使用中的每个redistplate显式启用.这样做会强制将当前重新连接绑定到触发m ...
- TFS线上生成环境发布历程
继前文 TFS在项目中Devops落地进程(上) TFS在项目中DevOps落地进程(下) 自从之前将开发环境使用TFS进行了自动化之后,就享受在此成果中,其他后续进度就停顿了好一段时间. 毕竟在我们 ...
- Win10+RTX2080深度学习环境搭建:tensorflow、mxnet、pytorch、caffe
目录 准备工作 设置conda国内镜像源 conda 深度学习环境 tensorflow.mxnet.pytorch安装 tensorflow mxnet pytorch Caffe安装 配置文件修改 ...
- C# 插入超链接到PDF文档(3种情况)
超链接可以实现不同元素之间的连接,用户可以通过点击被链接的元素来激活这些链接.具有高效.快捷.准确的特点.本文中,将分享通过C#编程在PDF文档中插入超链接的方法.内容包含以下要点: 插入网页链接 插 ...
- 全网首发! Odoo 订单分解执行及供应链管理免费开源解决方案
引言 前一篇介绍了佛山王朝家具的案例背景.佛山王朝家具公司在全国有30多家门店,三个生产工厂.王朝家具有六大痛点问题: 订单迫切需要实现电子化管理及在线签名 总部分单工作量大,供应链效率低 配送和售后 ...
- 【技术讨论】RF环境搭建手册
(原创文章,转载请注明出处.) 简要整理下环境搭建的步骤,以便快速.准确的搭建测试环境. 一.环境搭建 一.Python 2.7 1. 不要用Python3.6,很多库3.6中还没有,wxPython ...