angr-学习笔记(一)

1.angr的安装

安装在虚拟环境virtualenvwrapper

如下步骤

:~$ sudo apt-get install python-dev libffi-dev build-essential virtualenvwrapper

:~$ export WORKON_HOME=~/HOME 

:~$ VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3

:~$ source /usr/share/virtualenvwrapper/virtualenvwrapper.sh

:~$ ~ source /home/lantern/.local/bin/virtualenvwrapper.sh

:~$ mkvirtualenv --python=$(which python3) angr && pip install angr

2.使用

使用angr来求解执行到某一个分支的步骤为:

(1)创建project    //p=angr.Project("./binary_path",auto_load_libs=False)

(2)设置状态      //state=p.factory.entry_state()

(3)设置simulation manager   //sm=p.factory.simulation_manager(state)

(4)模拟执行,选择要到达的地址和要避免的地址   //solution=sm.explore(find=0x1111)

(5)约束求解,打印输入    //solution.found[0].posix.dumps(0).decode("utf-8")

 

解析:

创建project:

auto_load_libs=False  ,阻止angr分析库函数,避免计算量增大而失败

 

设置状态:

entry_state() ,及使引擎从入口点开始进行符号执行

 

设置simulation manager  :

控制一组状态(state)的符号执行

 

运行:

def explore(self, stash='active', n=None, find=None, avoid=None, find_stash='found', avoid_stash='avoid', cfg=None,um_find=1, **kwargs):

.explore()方法------找到能到达某个地址的状态同时丢弃掉不能到达这个地址的状态

 find参数---指定要到达的地址

 

获取结果:

solution.found 保存了所有符合条件的分支,一般情况下只有一个,通过solution.found[0]得到答案即可

.posix.dumps(0).decode("utf-8")

 

第一个angr解题脚本

import angr
p=angr.Project("./00_angr_find",auto_load_libs=False)
state=p.factory.entry_state()
sm=p.factory.simulation_manager(state)
solution=sm.explore(find=0x0804867D)
print(len(solution.found))
if solution.found:
    print(solution.found[0].posix.dumps(0).decode("utf-8"))
else:
    raise Exception('ERROR')

 

 

 

posted @ 2021-12-20 00:22  re0juren  阅读(176)  评论(0编辑  收藏  举报