欢迎访问宙启技术站
智能推送

利用Claripy进行模糊测试自动化

发布时间:2024-01-16 00:17:32

Claripy是一个Python库,用于进行符号执行和约束求解。它可以用于模糊测试自动化,通过生成符号输入来寻找程序中的漏洞。

以下是一个使用Claripy进行模糊测试自动化的示例:

import claripy
import angr

# 创建一个符号变量作为输入
input_size = 16
input_var = claripy.BVS('input', input_size * 8)

# 创建一个angr的工程
project = angr.Project('./binary')

# 将输入变量作为程序的输入
initial_state = project.factory.entry_state(stdin=input_var)

# 创建一个可控制的路径,使得每个字节的输入都在0-255之间
for i in range(input_size):
    initial_state.add_constraints(input_var.get_byte(i) >= 0)
    initial_state.add_constraints(input_var.get_byte(i) <= 255)

# 创建一个路径池并添加初始状态
path_pool = project.factory.path_group(initial_state)

# 开始符号执行并进行模糊测试
while len(path_pool.active) > 0:
    # 从路径池中选择一个active路径进行符号执行
    path = path_pool.active[0]

    # 如果路径达到了一个目标,即发现了一个漏洞,则打印路径并终止符号执行
    if reached_target(path):
        print(reconstruct_input(path))  # 将符号输入重构为具体输入
        break

    # 根据当前路径进行路径探索
    path_pool.step()

# 辅助函数:判断路径是否达到了目标
def reached_target(path):
    # 在这里可以编写一些条件来判断路径是否达到了一个漏洞
    # 例如,可以检查程序的输出是否包含了一个特定的字符串
    return path.state.posix.dumps(1).find(b"VULNERABILITY") >= 0

# 辅助函数:将符号输入重构为具体输入
def reconstruct_input(path):
    # 获取路径上的符号输入
    concrete_input = path.state.se.any_str(input_var)

    # 如果输入为字节列表,则将其转换为字符串
    if isinstance(concrete_input, bytes):
        concrete_input = concrete_input.decode()

    return concrete_input

在这个示例中,我们首先使用Claripy创建了一个符号变量 input_var,作为程序的输入。然后,我们使用angr创建了一个项目,并将初始状态设置为具有符号输入的状态。

接下来,我们使用循环将每个字节的输入约束在0-255之间,以确保输入的每个字节都有可能是任意的值。然后,我们创建了一个路径池,并将初始状态添加到路径池中。

在一个while循环中,我们从路径池中选择一个active路径进行符号执行。如果路径达到了一个目标,即发现了一个漏洞,我们打印出符号输入的具体值,并终止符号执行。否则,我们继续在该路径上进行路径探索。

在示例中的辅助函数中,我们定义了一个 reached_target 函数来判断路径是否达到了一个漏洞。您可以根据实际情况来定义这个函数,例如通过检查程序的输出是否包含了一个特定的字符串。另外,我们定义了一个 reconstruct_input 函数来将符号输入重构为具体输入。

通过使用Claripy和angr,我们可以将模糊测试自动化,从而更有效地发现程序中的漏洞。在实际的应用中,您可能需要根据具体的情况来调整和扩展这个示例。