Angr学习(6)

explore

首先介绍下stash,stash用来保存程序的运行路径,形成数组,我们也能通过指令去访问。

>>> proj = angr.Project('/home/fivefiveopen/Desktop/angr/r100' )
>>> state = proj.factory.entry_state()
>>> simgr = proj.factory.simgr()
>>> simgr.active
[<SimState @ 0x400610>]
>>> simgr.step()
<SimulationManager with 1 active>
>>> simgr.active
[<SimState @ 0x4005d0>]
>>> simgr.move(from_stash = 'deadended',to_stash = 'authenticated',filter_func = lambda s:'Nice' in simgr.posix.dump(1))
<SimulationManager with 1 active>//使用move使stash移动,可以通过要求将状态移入某个新的stash的方法来创建一个新的stash
>>> simgr.explore(find = lambda s:'Nice' in s.posix.dumps(1))//explore来找到符合我们要求的stash,比如这个是标准输出出现Nice,当然也能用指定地址的那种
<SimulationManager with 1 found, 10 deadended, 4 active>
>>> simgr.found[0]
<SimState @ 0x40084e>
>>> simgr.found[0].posix.dumps(1)
'Enter the password: Nice!\n'
>>> simgr.found[0].posix.dumps(0)
'Code_Talkers\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\x00'

除了explore这种方法以外还有一些其他的探索方法也能用,比如DFS,深度优先搜索,每次只同时保持一个运行。

断点

同样angr也支持给程序下断点

>>> state.inspect.b("mem_write",when = angr.BP_AFTER,action = angr.BP_IPYTHON)
<BP after-action with conditions {}, no condition func, with action func>

下断点的类型

类型含义
mem_read内存正在被读取
mem_write内存正在被写
reg_read寄存器正在被读
reg_write寄存器正在被写
tmp_read一个临时值(立即数?)正在被读
temp_write一个临时值正在被写
expr一个表达式正在被建立(比如一次数学计算的结果,或者IR中的常量(a constant in the IR))
statement一个IR statement正在被解释执行(translate)
instruction一个新的(本地native)指令正在被解释执行
lrsb一个新的基本块正在被解释执行
constraints一个新的约束正在被加入某个状态中
exit一个继承状态正由一次执行中产生
symbolic_variable一个新的符号变量正在被创建
call一个call指令正在被执行
address_concretization一个符号化的内存值正在被解析

对于不同事件对应的不同的条件

事件类型属性名适用的时机属性含义
mem_readmem_read_addressBP_BEFOR 或 BP_AFTER正在被读取的内存的地址
mem_readmem_read_lengthBP_BEFOR 或 BP_AFTER读取的内存的长度
mem_readmem_read_exprBP_AFTER地址中的表达式
mem_writemem_write_addressBP_BEFOR 或 BP_AFTER正在被写入的内存地址
mem_writemem_write_lengthBP_BEFOR 或 BP_AFTER写入内存的长度
mem_writemem_write_exprBP_BEFOR 或 BP_AFTER写入内存的表达式
reg_readreg_read_offsetBP_BEFOR 或 BP_AFTER被读取的寄存器的偏移
reg_readreg_read_lengthBP_BEFOR 或 BP_AFTER被读取寄存器的值的长度
reg_readreg_read_exprBP_BEFOR 或 BP_AFTER被读取的寄存器中的表达式
reg_writereg_write_lengthBP_BEFOR 或 BP_AFTER被写入寄存器数据的长度
reg_writereg_write_exprBP_BEFOR 或 BP_AFTER被写入寄存器的表达式
tmp_readtmp_read_numBP_BEFOR 或 BP_AFTER被读入的临时值的长度
tmp_readtmp_read_exprBP_AFTER被读入的临时表达式
tmp_writetmp_write_numBP_BEFOR 或 BP_AFTER被写入临时值的数
tmp_writetmp_write_exprBP_AFTER被写入临时值的表达式
exprexprBP_AFTER表达式的值
statementstatementBP_AFTER 或BP_BEFOR IR在其所在的基本块中的索引值(即断在当前基本块中的索引值)
instructioninstructionBP_BEFORE 或 BP_AFTER本地指令的地址
irsbaddressBP_BEFORE 或 BP_AFTER基本块地址
constraintsadded_constraintsBP_BEFORE 或 BP_AFTER被加入的约束的列表
callfunction_addressBP_BEFORE 或 BP_AFTER被调用的函数名
exitexit_targetBP_BEFORE 或 BP_AFTER代表SimExit的目标的表达式
exitexit_guardBP_BEFORE 或 BP_AFTER代表SimExit的限制的表达式
exitjumpkindBP_BEFORE 或 BP_AFTER代表SimExit的种类的表达式
symbolic_variablesymbolic_nameBP_BEFORE 或 BP_AFTER正在被创建的符号变量的名字。解析引擎可能改变这个名字(通过在后面添加唯一的ID和长度)。检查symbolic_expr来得到最终的符号表达式
symbolic_variablesymbolic_sizeBP_BEFORE 或 BP_AFTER正在被创建的符号变量的长度
symbolic_variablesymbolic_exprBP_AFTER代表新的符号变量的符号表达式
address_concretizationaddress_concretization_strategyBP_BEFORE 或 BP_AFTER被用于解析地址的SimConcretizationStrategy。断点处理函数可以改变将要被应用于解析当前地址的策略。如果你的断点处理函数被置为None,这个策略就会被忽略
address_concretizationaddress_concretization_actionBP_BEFORE 或 BP_AFTER用于记录内存操作的SimAction对象
address_concretizationaddress_concretization_memoryBP_BEFORE 或 BP_AFTER被操作的SimMemory对象
address_concretizationaddress_concretization_exprBP_BEFORE 或 BP_AFTER代表正在被解析的地址的AST。断点处理函数可以改变这个来影响正在被解析的地址
address_concretizationaddress_concretization_add_constraintsBP_BEFORE 或 BP_AFTER约束是否应该别加入到这次读取中
address_concretizationaddress_concretization_resultBP_AFTER被解析的地址列表(整型数)。断点处理函数可以覆盖这个来产生不同的解析结果。

差不多Angr的基础功能就差不多了,感觉其他的功能也不怎么会用到。可以着手去用Angr搞点好玩的了,实践实践,多运用下。

感谢v1gor大佬的翻译文档

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值