claripy

runwu2204 Lv6

类似于z3用于创建变量求解(可用于argv传参或者 寄存器传参)

变量

BVS -用于创建位向量符号

BVS('变量名',长度)

BVV -用于创建位向量值(主要用于添加条件)

BVV(bytes数据)

设置变量

stdin 标准输入现在似乎不支持添加条件 或者只对应架构下系统添加条件 比如pe文件则需要在windows环境下添加

寄存器

example:

1
2
3
flag=BVS('flag',8*(flag_length))#BVS长度单位是bit,创建变量对象
state=p.factory.entry_state()#创建状态对象
state.regs.eax=flag#不会超过eax大小

内存

example:

1
2
3
flag=BVS('flag',8*(flag_length))#BVS长度单位是bit,创建变量对象
state=p.factory.entry_state()#创建状态对象
state.memory.store(addr,flag)#在指定地址addr写入flag(长度为8字节)也可以自定义长度

添加条件

1
state.solver.add(条件语句)

解决问题

1
state.solver.eval(变量对象)

00_angr_find

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#第一种 直接explore
from angr import *
from claripy import *
p=Project('./00_angr_find')
state=p.factory.entry_state()#
sm=p.factory.simgr(state)
sm.explore(find=0x08048675)
sm.found[0].posix.dumps(0)
#第二种 通过栈操作实际上是内存操作
from angr import *
from claripy import *
p=Project('./00_angr_find')
state=p.factory.entry_state(addr=0x0804860F)#地址不放在开始 是因为为了防止其他函数影响操作
flag=BVS('flag',8*9)
state.solver.add(*[And(flag[i+7:i]<=ord('Z'),flag[i+7:i]>=ord('A'))for i in range(8,72,8)])#注意是大端序所以此处从倒数第二个字符开始,因为倒数第一个字符是结束符\x00
state.solver.add(flag[7:0]==0)#结束符条件
addr=state.regs.ebp-0x15
state.memory.store(addr,flag)
sm=p.factory.simgr(state)
sm.explore(find=0x8048675)
int.to_bytes(sm.found[0].solver.eval(flag),9,'big')#注意是大端序(低地址在高位,高地址在低位)
  • 标题: claripy
  • 作者: runwu2204
  • 创建于 : 2024-01-18 20:00:27
  • 更新于 : 2024-01-19 21:01:36
  • 链接: https://runwu2204.github.io/2024/01/18/Re/分析工具/angr分析框架/claripy/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论