利用angr解决一些简单CTF逆向题

之前就听说过angr很强大,一直没有时间去研究,今天简单的了解一下,以我的理解,就感觉跟爆破是一个原理,只不过用的是可变的符号来代替字符串进行遍历,直到找到我们需要的那条路径为止

angr的安装

1
2
3
4
5
6
7
8
9
10
11
12
#安装编译所需要的环境
#virtualenv就是用来为一个应用创建一套“隔离”的Python运行环境
sudo apt install python-dev libffi-dev build-essential virtualenvwrapper

#安装angr
pip install angr==7.7.9.21

#创建一个名字为angr的虚拟环境,并且会生成一个名字为angr目录
virtualenv angr

#开始使用虚拟环境前,需要被激活
source /home/hacker_mao/angr/bin/activate #这里改成自己的路径就好了

angr的使用方法

使用方法可以看这篇文章写的很详细
http://www.freebuf.com/articles/web/150296.html

angr解决ctf中的逆向题目

我直接拿网鼎杯第二场的martricks来练手

martricks

ida可以看到可以经过一系列校验后会有两条分支路径,一条成功,一条失败,所以我们就可以用angr来进行处理

exp:

1
2
3
4
5
6
7
8
9
10
11
12
#-*- coding:utf-8 -*-
import angr

def main():
p = angr.Project("martricks") #创建一个Angr工程
state = p.factory.entry_state() #获取入口函数
sm = p.factory.simgr(state) #在入口准备开始符号执行
sm.explore(find=0x400A84, avoid=0x400A90) #遍历可能的路径并找到成功的那条路径
return sm.found[0].posix.dumps(0).strip('\0\n') #返回当前状态输入 dumps(1)表示输入

if __name__ == '__main__':
print main()

angr还有很多强大的函数可以在ipython里面慢慢研究

1
2
3
4
5
6
7
8
9
10
11
In [3]: help(p.factory.)
p.factory.blank_state p.factory.full_init_state
p.factory.block p.factory.path
p.factory.call_state p.factory.path_group
p.factory.callable p.factory.procedure_engine
p.factory.cc p.factory.sim_block
p.factory.cc_from_arg_kinds p.factory.sim_run
p.factory.default_engine p.factory.simgr
p.factory.engines p.factory.simulation_manager
p.factory.entry_state p.factory.snippet
p.factory.fresh_block p.factory.successors