使用angr的SIM_PROCEDURES来进行二进制程序的模拟执行
Angr是一个用于进行二进制程序分析和模拟执行的Python框架。它可以自动化执行二进制程序,控制程序的执行流程,并在执行过程中进行符号执行,以便分析程序的行为。
Angr的一个重要功能是使用SIM_PROCEDURES模块来定义自定义过程的模拟执行行为。使用SIM_PROCEDURES,可以模拟二进制程序中的库函数、系统调用和其他自定义函数的行为。
下面是一个使用SIM_PROCEDURES模拟执行的例子:
import angr
import claripy
# 创建一个具有模拟执行功能的Angr项目
proj = angr.Project("/path/to/binary")
# 定义一个自定义的模拟执行过程
class CustomProcedure(angr.SIM_PROCEDURES['libc']['strcmp']):
def run(self, s1_ptr, s2_ptr):
# 获取符号值
s1 = self.state.mem[s1_ptr].string.concrete
s2 = self.state.mem[s2_ptr].string.concrete
# 比较两个字符串
if s1 == s2:
return claripy.BVV(0, self.state.arch.bits)
elif s1 < s2:
return claripy.BVV(-1, self.state.arch.bits)
else:
return claripy.BVV(1, self.state.arch.bits)
# 创建一个自定义模拟执行过程对象
custom_strcmp = CustomProcedure()
# 将自定义模拟执行过程注册到Angr项目中
proj.hook_symbol('strcmp', custom_strcmp)
# 初始化状态
state = proj.factory.entry_state()
# 设置输入参数
param1 = claripy.BVS("param1", 8 * 32)
param2 = claripy.BVS("param2", 8 * 32)
state.memory.store(0x1000, param1)
state.memory.store(0x2000, param2)
# 模拟执行函数调用
sm = proj.factory.simulation_manager(state)
sm.explore(find=0x123456, avoid=0x654321) # 设置找到和避免的地址
# 输出符号执行的结果
found_state = sm.found[0]
result = found_state.solver.eval(param1, cast_to=str)
print("Result:", result)
上面的代码示例展示了如何使用SIM_PROCEDURES模块来模拟执行strcmp函数。首先,我们定义了一个自定义的模拟执行过程CustomProcedure,并继承自angr.SIM_PROCEDURES['libc']['strcmp']。在run方法中,我们使用了self.state.mem[s1_ptr].string.concrete来获取符号值,并实现了字符串比较的逻辑。
然后,我们将自定义模拟执行过程注册到Angr项目中,通过proj.hook_symbol('strcmp', custom_strcmp)来完成。
接下来,我们初始化了状态,并设置了输入参数。我们通过claripy.BVV创建了两个32字节的符号变量,并将其存储在状态的内存中。
最后,我们使用proj.factory.simulation_manager来创建一个模拟执行管理器,并使用sm.explore方法来进行符号执行。我们通过find和avoid参数来指定我们要找到和避免的地址。
当符号执行完成后,我们可以从sm.found集合中获取状态,并使用state.solver.eval方法来获取符号变量的值。在这个例子中,我们获取了param1的符号值,并将其转换为字符串,然后打印出来。
这个例子只是展示了Angr模拟执行的基本用法。在实际应用中,可以根据需要定义更复杂的自定义模拟执行过程,并结合动态符号执行等技术进行更深入的程序分析。
