angr学习【二】

前言

这篇文章是一定要写的,虽然可能还不是很明白。

题目二

题目 https://github.com/angr/angr-doc/tree/master/examples/ais3_crackme
IDA看一下,需要从命令行进行输入。那么就需要使用到claripy这个模块。

claripy.BVS('arg1', n*8) 构造输入参数长度为8bytes
entry_state方法接受一个args参数来控制输入
proj = angr.Project("./ais3_crackme")
args = [proj.filename, claripy.BVS('arg1', 50*8)]
state = proj.factory.entry_state(args=args)

然后创建一个simulation_manager模拟器,执行
在 Angr 寻找路径时,程序的当前状态有多种表示。

step()表示向下执行一个block(42bytes),step()函数产生active状态,表示该分支在执行中;
run()表示运行到结束,run()函数产生deadended状态,表示分支结束;
explore()可以对地址进行限制以减少符号执行遍历的路径。例如
sm.explore(find=0x400676,avoid=[0x40073d])
explore()产生found状态,表示探索的结果等等

获取当前程序的输出

print sm.found.posix.dumps(1)

获取当前程序的命令行参数

print sm.found.solver.eval(arg1,cast_to = str)  
arg1就是我上面BVS构造的命令行的输入
eval是将我的输入转化为str

我们在刚开始时可以对输入进行限制

k=state.posix.files[0].read_from(1)  获取输入的一字节
state.se.add(k!=10)  添加限制条件
state.posix.files[0].length = int(sys.argv[2])+1  限制输入的长度
state.posix.files[0].seek(0)  记得需要将指针指向开头
state.posix.files[0].all_bytes()   获取用户的全部输入

注意一点在使用angr求解的时候,一定要弄清楚,flag到底在哪里,你应该输出什么,别到时候脚本跑了十分钟,成功结束了,然后什么输出也看不到,这就很尴尬。

总结

学会简单的输入输出还远不够,有时候还需要对一些结果存储到内存中,接下来学习下执行时变量的存取。

猜你喜欢

转载自blog.csdn.net/qq_33438733/article/details/80300289