angr学习
昨天打dasctf,被第一个题暴打了,之后复现的时候感觉可以爆破,尝试一下angr,(虽然不知道行不行)
安装
因为是exe所以在win上安装
1 | pip install --upgrade pip |
最后的numpy一定要小于这个版本,不然会报错
使用
载入文件
1 | p = Project('xxx',auto_load_libs = False) |
执行后,视为载入了这个文件,这时才可以分析
数据类型及操作
1 | bv = state.solver.BVV(0x1234, 32) # create a 32-bit-wide bitvector with value 0x1234 |
位向量和int的转换
1 | state.mem[index] #指定一个内存地址 |
操作寄存器和内存地址
求解器
Simulation Managers用来管理状态,执行模拟和运行。控制一组state的符号执行
1 | simgr = proj.factory.simulation_manager(state) #创建一个SM |
不加state默认用入口点
1 | step() # 执行一个基本块 |
explore
用explore方法来探索路径
方法定义是:
1 | def explore(self, stash='active', n=None, find=None, avoid=None, find_stash='found', avoid_stash='avoid', cfg=None,num_find=1, **kwargs): |
1 | simgr.explore(find=lambda s: b"Congrats" in s.posix.dumps(1)) |
1 | s = simgr.found[0] #取解 |
求解引擎
state.solver
位向量:比特序列,可以是值或者符号
1 | one = state.solver.BVV(1, 64) |
1 | 64 - 27) weird_nine.zero_extend( |
S带符号,用extend扩展长度
创建符号变量:
1 | x = state.solver.BVS("x", 64) |
可以直接运算得到AST抽象语法树,使用SMT求解器可以转化AST
1 | state.solver.add(x > y) |
add用来添加约束,eval用来求解
1 | state.satisfiable() #解是否可行 |
除了朴素的 eval ,angr 提供了多种解析方式 。
接口 | 描述 |
---|---|
solver.eval(expression) |
将会解出一个可行解 |
solver.eval_one(expression) |
将会给出一个表达式的可行解,若有多个可行解,则抛出异常 |
solver.eval_upto(expression, n) |
将会给出最多n个可行解,如果不足n个就给出所有的可行解。 |
solver.eval_exact(expression, n) |
将会给出n个可行解,如果解的个数不等于n个,将会抛出异常。 |
solver.min(expression) |
给出最小可行解 |
solver.max(expression) |
给出最大可行解 |
同时可以设置 extra_constraints
和 cast_to
参数对结果进行限制或转换。
评论