工具学习_模糊测试
定义:模糊测试(fuzz testing, fuzzing)是一种软件测试技术。其核心思想是将自动或半自动生成的随机数据输入到一个程序中,并监视程序异常,如崩溃、断言失败,以发现可能的程序错误,比如内存泄漏。模糊测试常常用于检测软件或计算机系统的安全漏洞。
历史:1988年,威斯康星大学的Barton Miller教授率先在他的课程实验中提出了模拟测试。实验内容是开发一个基本的命令行模拟器来测试Unix程序。这个模拟器可以用随机数据来“毁坏”这些测试程序直到其崩溃。该类实验于1995年被重新复兴,并且包括了图形界面程序(例如X Window System)、网络协议和系统API库。一些后续工作可以测试Mac和Windows系统上的命令行程序与图形界面程序。关于模拟测试更早的想法可以追溯到1983年。Steve Capps当时开发了一个叫做The Monkey的Macintosh程序以测试Mac程序,并曾被用于发现MacPaint的程序错误。另一个早期的模拟测试工具是crashme,于1991年发布。其主要功能是让Unix以及Unix系统去执行随机关联指令以测试这些系统的健壮性。
测试流程:模糊测试通过向系统输入随机或异常数据来发现潜在问题。流程包括:在测试前搭建测试环境并配置测试工具;在测试中生成并执行模糊测试用例,监控系统状态,检查崩溃或异常;在测试后生成报告,列出发现的问题并提供修复建议。
案例分析:当数据长度超过100时,目标程序会发生缓冲区溢出,可能导致程序崩溃或其他未预期的行为。
#include <stdio.h>
#include <string.h>void vulnerable_function(char *input) {char buffer[100];strcpy(buffer, input);printf("Received: %s\n", buffer);
}int main() {char input[200];printf("Enter data: ");gets(input);vulnerable_function(input);return 0;
}
测试脚本:该脚本的目的是通过随机生成不同长度的字符串并不断发送到易受攻击的目标程序,测试程序如何响应这些异常数据。这种方法可以帮助发现潜在的内存溢出、缓冲区溢出等漏洞,或者其他没有预期的行为。
import subprocess
import random
import stringdef random_string(length):return "".join(random.choice(string.ascii_letters) for i in range(length))# Fuzzing loop
for _ in range(1000):data = random_string(random.randint(1, 200))process = subprocess.Popen(['./vulnerable_program'], stdin=subprocess.PIPE)process.communicate(data.encode())
定向模糊测试(Directed Fuzz Testing):是一种更加精确的模糊测试方法,它通过特定的输入策略和目标导向来提高测试效率,旨在发现特定类型的漏洞,如缓冲区溢出、内存泄漏等。
与传统的模糊测试相比,定向模糊测试并不完全依赖于随机生成数据,而是基于某些程序特性或漏洞模式的知识来生成更具针对性的输入数据。这种方法通过向程序输入特定类型的数据(例如,有意造成溢出的数据),来测试程序在特定情况下的行为。