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')