首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

表哥有话说 第十四期

【表哥有话说 第十四期】

angr安装与简单使用

01

介绍

angr

总结来说,angr用于逆向工程中进行二进制分析的一个python框架。

具体介绍见其github主页

(https://github.com/angr/angr)

符号执行

符号执行 (Symbolic Execution)是一种程序分析技术。其可以通过分析程序来得到让特定代码区域执行的输入。使用符号执行分析一个程序时,该程序会使用符号值作为输入,而非一般执行程序时使用的具体值。在达到目标代码时,分析器可以得到相应的路径约束,然后通过约束求解器来得到可以触发目标代码的具体值。

– 摘自维基百科

02

安装

采用pip去安装virtualenv和virtualenvwrapper,具体命令如下

sudo apt-get remove virtualenv virtualenvwrapper

pip install virtualenv virtualenvwrapper

安装完成后

配置.zshrc(terminal若为bash,则配置.bash_profile)

# virtualenvwrapper

export WORKON_HOME=$HOME/.virtualenvs

export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python #python目录

export VIRTUALENVWRAPPER_VIRTUALENV=/usr/local/bin/virtualenv # virtualenv 目录source /usr/local/bin/virtualenvwrapper.sh #virtualenvwrapper.sh文件所在位置,方法如上

可见

https://stackoverflow.com/questions/19549824/terminal-issue-with-virtualenvwrapper-after-mavericks-upgrade

03

简单使用

这里以这个链接给的例子来测试sym-write

(https://github.com/angr/angr-doc/tree/master/examples/sym-write)

先看源码

#include

char u=0;

int main(void){

int i, bits[2]=;

for (i=0; i

bits[(u&(1

if (bits[0]==bits[1]) {

printf("you win!");}

else {

printf("you lose!");}

return 0;

}

具体exp为

#!/usr/bin/env python

# coding=utf-8

import angr

import claripy

p = angr.Project('./issue')

state = p.factory.entry_state(args=['./issue',])

u = claripy.BVS('u',8)

state.memory.store(0x0804A021,u)

sm = p.factory.simulation_manager(state)

sm.explore(find=0x080484E3,avoid=0x080484F5)

if len(sm.found)>0:

print sm.found[0].solver.eval(u)

我们来具体分析以下这个脚本

import angr 这个自然不用说,导入angr包

import claripy 这个模块用来来定义抽象的数据,

u = claripy.BVS('u',8) 这一句即是用claripy这个模块的BVS函数来创建一个指定长度的抽象数据,BVS函数要求两个参数,第一个参数为变量名,第二个参数为变量长度。

p = angr.Project('./issue') 加载一个一个程序,建立一个angr工程

state = p.factory.entry_state(args=['./issue',]) 用于指明程序在初始运行时的状态,另外有函数blank_state,可用于指定程序起始运行地址通过给定参数addr的值

state.memory.store(0x0804A021,u),将指定data,这里是u,存储到给定地址addr,这里是0x0804A021,

sm = p.factory.simulation_manager(state) 从给定状态创建了一个模拟器,进行符号执行

sm.explore(find=0x080484E3,avoid=0x080484F5) 进行符号执行得到想要的状态,这里的两个地址为

即要产生win的状态,而避免lose的状态

最终sm.found 用于存储我们想要的状态,通过if判断其长度,从而确定能否得到我们想要的状态

sm.found[0].solver.eval(u) sm.found[0].solver 用于存储状态的解,而eval函数则输入参数的值

04

局部总结

以上就是angr的基本用法,本人对于angr的理解很浅显,有些地方也不是特别清楚,如果有错的地方,希望大家指点。以后会继续放出其他的关于angr的使用简介

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180312G0W06I00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券