Angr学习(6)

it2025-07-11  5

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大佬的翻译文档

最新回复(0)