模糊测试Fuzzing基础知识学习笔记

news/2025/2/23 2:50:26/

概念

模糊测试(Fuzzing),是一种通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法。在模糊测试中,用随机坏数据(也称做 fuzz)攻击一个程序,然后观察哪里遭到了破坏。

模糊测试(Fuzz Testing)是一种自动化的软件测试技术,最初是由威斯康辛大学的巴顿·米勒于1989年开发的,通常用于识别程序中的潜在漏洞。模糊测试的核心是自动或半自动的生成随机数据输入到应用程序中,同时监控程序的异常情况,如崩溃、代码断言失败,以此发现可能的程序错误,如内存泄漏。模糊化是指自动生成和执行测试,模糊测试中输入的随机数据被称为“Fuzz”,随机数据的类型包括:超长字符串;随机数如负数,浮点数,超大数、特殊字符如~!@#$%等包含特殊含义的字符,作为输入可能会引发报错;unicode编码,因为有些程序是不支持unicode的。模糊测试无法提供对于一个软件应用在安全威胁或漏洞方面的整体评估,在处理不会导致应用崩溃的安全威胁时效果较差,例如某些病毒、蠕虫、木马等,因此需要结合其它的安全测试手段来保障软件系统的安全。

Fuzz生成的随机输入大多数在语法上是不成立的,为了能让模糊测试有效的进行下去,需要增加获得有效输入的几率。一个好的模糊生成器产生的数据,不会偏离预期输入太远,但又是非预期的,会触发应用的异常行为。模糊测试用例生成算法主要有两种:
1)基于变异:根据已知数据样本,通过变异的方法生成新的测试用例;
2)基于生成:根据已知的协议或接口规范,建模并生成测试用例;

目前最常用的 Fuzzer 是由谷歌工程师迈克尔·扎里斯基(Michal Zalewski)开发的 American Fuzzy Lop(AFL)。AFL 是一款开源的模糊测试工具,在程序执行前对程序源码进行插桩(instrumentation),以便在程序执行过程中实时获取程序的执行情况。AFL 采用遗传算法对程序的输入进行变异能够在程序运行的时候注入自己的代码,然后自动产生测试用例进行模糊测试。代码覆盖率是模糊测试工具用来评估找到导致错误的代码路径的可能性的主要指标。在执行过程中,AFL 向被测程序中输入 input,然后获取程序的覆盖率,将覆盖率大的 input 保留下来进行变异,然后在下一轮测试中向被测程序中输出这些变异后的 input,一直到程序的覆盖率在较长的一段时间不能继续增大为止。

随着技术的演变,模糊测试从单纯的黑盒模糊测试,也衍生了灰盒、白盒模糊测试技术。目前AFL没有维护了,社区维护版叫AFL++。

常用工具

  • AFL
  • libfuzzer

Resource

  1. AFL
  2. 自己写一个小型的Fuzzer
  3. 北大 软件分析
  4. 南大 软件分析
  5. The Fuzzing Book 模糊测试入门
  6. Static Program Analysis
  7. libfuzzer-workshop

Reference

1.什么是模糊测试?
2.什么是模糊测试? (不是同一篇文章)
3.Fuzzing(模糊测试)技术,你真的了解吗?
4.CS研究生如何入门模糊测试方向?


http://www.ppmy.cn/news/678509.html

相关文章

github上传文件及其问题解决

文章目录 1. github上上传文件夹2. <filename> does not have a commit checked out3. this exceeds GitHubs file size limit of 100.00 MB4. error: src refspec master does not match any 1. github上上传文件夹 首先在github上create a new repository&#xff0c;…

2的幂次方表示(递归)

2的幂次方表示 任何一个正整数都可以用2的幂次方表示。例如&#xff1a; 137272320同时约定方次用括号来表示&#xff0c;即ab可表示为a(b)。由此可知&#xff0c;137可表示为&#xff1a; 2(7)2(3)2(0)进一步&#xff1a;722220&#xff08;21用2表示&#xff09; 3220所以…

# 从键盘输入一个正整数,用2的幂次方的形式输出。约定幂次方用括号来表示,即表示为2(b),b=1时,幂省略。例如139=2^7+2^3+2^1+2^0,即:2(7)+2(3)+2+2(0)

样例输入&#xff1a; 402 样例输出&#xff1a; 2(8)2(7)2(4)2 要求&#xff1a;幂不能重复&#xff0c;如&#xff1a;1392626232120&#xff08;出现了2个6次方&#xff09; 参考 C 代码&#xff1a; #include<stdio.h> #include<stdlib.h> #include<ma…

7-1 这是2的幂么? (10 分)

7-1 这是2的幂么&#xff1f; (10 分) 在类Tool中定义一个方法 isPower&#xff0c;要求对于形参num&#xff08;num>0&#xff09;&#xff0c;判断num是不是2的幂&#xff0c;如果是返回true&#xff0c;否则返回false 在Main类中main方法中调用此方法&#xff0c;输入一…

7-56 365次方

7-56 365次方 网上曾经有两个很火的公式&#xff0c;那就是1的365次方是1&#xff0c;1.01的365次方约等于37.8&#xff0c;0.99的365次方约等于0.03。每天多努力百分之一&#xff0c;每天进步百分之一&#xff0c;一年以后将取得很大进步&#xff0c;而每天退步百分之一&#…

(java)2的幂次方

题目描述 何一个正整数都可以用2的幂次方表示。例如&#xff1a;1372^72^32^0 同时约定幂次方用括号来表示&#xff0c;即a^b可表示为a(b)。由此可知&#xff0c;137可表示为&#xff1a; 2&#xff08;7&#xff09;2&#xff08;3&#xff09;2&#xff08;0&#xff09; …

用计算机怎么算3分之2次方,64的3分之2次方怎么算啊

64的3分之2次方怎么算啊以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01; 64的3分之2次方怎么算啊 你好&#xff0c;很高兴为你解答 64的3分之2次方这样算 6416 16开3次方16 64的3分之2次方16…

为什么byte的最大是2的7次方减一而最小是负2的7次方

简书 来我们一步步分析分析&#xff1a; 1.byte占用8位&#xff0c;每位用0或1表示&#xff0c;能够表示256(2^8)个数据。 2.这8位分为符号位&#xff08;最高位&#xff09;和数值位&#xff08;剩余七位&#xff09;&#xff0c;符号位0表示正数&#xff0c;1表示负数。 …