Fuzz概述

news2024/11/15 21:56:28

文章目录

  • AFL一些概念
    • 插桩与覆盖率
      • 边和块
      • 覆盖率
        • afl自实现劫持汇编器
        • clang内置
    • 覆盖率反馈与引导变异
      • 遗传算法
      • fork server机制
  • AFL调试准备


AFL一些概念

插桩与覆盖率

边和块

首先,要明白边和块的定义

在这里插入图片描述
正方形的就是块,箭头表示边,边表示程序执行哪一条分支

覆盖率

程序和fuzzer执行在不同进程,要通过共享内存的方式进行进程间通信。共享内存即在多个进程之间共享,每个index索引对应一条边,执行次数增加,边的数值就会增加

各个边如何映射到索引?为每个代码块分配一个随机值,然后计算前一个代码块和当前代码块的随机值的异或值,写入共享内存索引,即代表走到哪条边,执行什么样的分支。代码块之间的执行逻辑是怎样的,执行次数是怎样的。

cur_location = <COMPILE_TIME_RANDOM>;//当前位置
shared_mem[cur_location ^ prev_location]++; //将当前位置和前一个位置异或,得到一个索引,将共享内存中该索引对应的计数器加一,表示该位置被执行了。
prev_location = cur_location >> 1;//将当前位置右移一位,作为下一次计算的前一个位置。

通过这种方式,AFL 可以统计出每个输入文件在程序中到达了哪些位置,从而帮助程序找到更多的路径,提高覆盖率。同时由于使用了随机数初始化,也提高了运行时的覆盖率统计随机性,避免了测试过程中出现重复的路径覆盖。

afl自实现劫持汇编器

在将程序转换为二进制代码的过程中。可以劫持汇编器。识别其中的跳转指令,插入汇编指令(即以上一小段的边映射为核心的代码),通过afl-gcc/afl-clang/afl-g++实现

afl-gcc会通过设置环境变量的方式,添加一些必要的参数和宏定义,以及设置一些搜索路径和链接选项。然后会将实际地链接任务交给gcc,也就是说afl-gcc仅仅是一层wrapper

ubuntu20@ubuntu20-virtual-machine:~/Desktop/afl$ ./afl-gcc ../test.c -o test
afl-cc 2.52b by <lcamtuf@google.com>
	arg0: gcc
	arg1: ../test.c
	arg2: -o
	arg3: test
	arg4: -B
	arg5: .
	arg6: -g
	arg7: -O3

clang内置

运用clang编译的时候,llvm计算出一个edge集合,每条edge对应一个guard指针

__sanitizer_cov_trace_pc_guard(uint32_t* guard)
/*执行时机: 每当对应的edge被执行到的时候,就会执行这个函
数,向共享内存里写值。写入的值就是 *guard ,即guard指针指向的值,就是为每个边
插入的随机值*/
void __sanitizer_cov_trace_pc_guard(uint32_t* guard) {
  __afl_area_ptr[*guard]++;
}
__sanitizer_cov_trace_pc_guard_init(uint32_t *start, uint32_t *stop)
/*每个边对应着一个guard指针指向的值,start是第一个guard
指针,代表第一条边,stop是最后一个guard指针,代表最后
一条边,遍历start到stop,就可以给每个guard指针指向的值
初始化一个随机数。*/
/*afl-llvm-rt.o.c里while遍历,然后赋一个随机数*/
while (start < stop) {
/*分别指向覆盖记录数组的起始地址和结束地址。通过一个 while 循环,逐个遍历数组中的元素。*/

    if (R(100) < inst_ratio) *start = R(MAP_SIZE - 1) + 1;//给guard指针赋一个随机数
    else *start = 0;

    start++;

  }

AFL 会以一定的概率(由 inst_ratio 决定)为其赋一个随机数,或者赋值为 0。这里的随机数是指在 1 和 MAP_SIZE - 1 之间的一个随机整数。在程序运行时,这个随机数会用于辅助判断当前指令是否已经被执行过。

如果 guard 上的值不是 0,则认为这个指令是第一次执行。在第一次执行之后,__sanitizer_cov_trace_pc_guard()会将该 guard 上的值置为 0,表示该指令已经执行过了。在后续执行过程中,如果该指令再次被执行,对应的 guard 位置上的值已经是 0,不会再次被记录为覆盖信息。因此,通过这种方法,AFL 可以辅助判断当前指令是否已经被执行过。

GCOV和LCOV主要是程序员统计代码覆盖率使用,优点是能可视化展示,不用于fuzzer

覆盖率反馈与引导变异

遗传算法

当使用afl时,需要提供一个种子,从所有种子样本进行变异。即字节流变异,翻转等。

从一个A输入变成B,C,D,E等各种不一样的输入。如果从A到B变异的输入发现了不同路径。就把这个B记录下来,称为有趣样例(interesting case)

逐代杂交选优,达到一个局部更优,解因为遗传算法的特征总是来自于初始种子样本和变异策略,所以改进也主要在这两方面进行改进

fork server机制

fuzzer变异生成样本后,写入到执行的文件(.cur_input里)
通过管道通知fork server要进行一次fuzz,fork server会fork出一个子进程去
执行这个文件,并通过管道返回子进程的执行结果的返回值,通知fuzzer。
在这里插入图片描述
如图所示,程序在fuzz一个文件时,先把他卡在初始化完成,但读入数据之前

int main()
{
    read();
}

相当于卡在程序的read之前,当再次进行fuzz的时候,并不需要重新再把这个程序执行一遍。只想在read这里开始执行

通知fork server去fork一个子进程,让子进程读取.cur_input,开始一次执行,执行完后会把程序执行的信息返回给fuzzer

AFL调试准备

用clion打开AFLcpp
在这里插入图片描述
第一行,填写我们的输入的参数,首先是输入输出,以及最大分配内存以及超时时间、分隔后填入我们@@读文件,会写入.cur_input里,如果没有@@就是从标准输入中读

-i
/home/ubuntu20/Desktop/AFLcpp/test_dir/fuzz_input
-o
/home/ubuntu20/Desktop/AFLcpp/test_dir/fuzz_output
-m
none
-t
500+
--
/home/ubuntu20/fuzz/out/fuzzbuild
@@

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/350745.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java有关类的初始化的分析

什么是类&#xff1f; 类是具有相同状态和相同行为的一组对象的集合 什么是对象&#xff1f; 万事万物皆为对象&#xff0c;可以理解为具体的个体就是对象 什么是面向对象的编程&#xff1f; 就是只在乎结果而不在乎过程&#xff0c;怎么理解这句话&#xff1f;举个例子&#x…

彻底废了,去干了两年外包...

先说一下自己的情况。大专生&#xff0c;17年通过校招进入湖南某软件公司&#xff0c;干了接近2年的点点点&#xff0c;今年年上旬&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01;而我已经在一个企业干了五年的功能测试…

MacOS Ventura 13.2.1 (22D68) 正式版带 OC 0.8.9 and winPE 双分区原版黑苹果镜像

2 月 14 日消息&#xff0c;苹果今日向 Mac 电脑用户推送了 macOS 13.2.1 更新&#xff08;内部版本号&#xff1a;22D68&#xff09;&#xff0c;本次距离上次发布隔了 21 天&#xff0c;以修复Bug和安全更新为主。 镜像下载&#xff1a; 微信公众号&#xff1a; MacOS Vent…

docker 查看和分析镜像内文件

docker inspect docker inspect node:alpine查看元数据信息&#xff0c;一共有三层 "RootFS": {"Type": "layers","Layers": ["sha256:8c6806a0692459f603d074b4a7bdd38915650f1563f4ec728dad229475a52090","sha256:…

Python学习-----函数4.0(递归函数习题)

目录 递归算法 1.进制数转换 2.阶乘递归 3.递归获取两个数之间最小公倍数 4.递归获取两个数字之间最大公约数 5.斐波那契数列 5.递归求得数列的最值 6.倒序输出 7.递归二分法查找 递归算法 递归算法是把问题转化为规模缩小了的同类问题的子问题。然后递归调用函数(或过…

部署JDK+tomcat上线jspgou项目

系列文章目录 文章目录系列文章目录一、前言二、Tomcat部署1、Tomcat Http Server2、安装MySQL3、部署jspgou&#xff08;电子商城&#xff09;一、前言 什么是JAVA虚拟机 所谓虚拟机&#xff0c;就是一台虚拟的计算机。他是一款软件&#xff0c;用来执行一系列虚拟计算机指令…

背景透明(opacity vs background)

最近在做项目的时候&#xff0c;遇到透明度的相关设置。 常用的背景透明设置可分为两种&#xff0c;分别是&#xff1a; 一是给background设置透明度。二是利用opacity属性。 在跳了一些坑之后&#xff0c;本人更推荐给background设置透明度&#xff0c;为什么呢&#xff1f;…

【QCA6174】SDX12 WiFi QCA6174 bdwlan30.bin和bdwlan30.txt相互转化操作说明

1.从高通获bin文件和txt文件相互转化工具 软件包名称 QCA6174_BDF_Converter.zip 2.解压工具包&#xff0c;解压之后包括以下文件 3.从sdx12 sdk拷贝bdwlan30.bin 路径如下&#xff0c;将bdwlan30.bin放到QCA6174_BDF_Converter目录下 ./cnss_proc_firmware/cnss_proc/wlan…

Twitter账号老被封?一文教会你怎么养号

昨天龙哥给大家科普完要怎么批量注册Twitter账号&#xff0c;立刻有朋友来私信龙哥说里面提到的这个养号和防关联具体是个怎么样的做法。由于Twitter检测机制还是比较敏感的&#xff0c;账号很容易被冻结&#xff0c;所以养号是非常重要的步骤。其实要养好Twitter账号其实并不难…

docker-compose极速部署kafka3.2.0集群(含zookeeper集群)

极速部署kafka3.2.0集群准备工作&#xff1a;准备三台服务器部署Zookeeper集群部署kafka集群创建Topic开启JMX_PORTkafka集群管理工具使用的 KakfaStreaming准备工作&#xff1a;准备三台服务器 服务器地址缩写192.168.0.200200192.168.0.201201192.168.0.202202 一、完成服务…

格创东智与金羽新能合作|先进工业互联网助力固态电池智能化运营

2022年12月&#xff0c;浙江金羽新能源科技有限公司&#xff08;以下简称金羽新能&#xff09;与格创东智签订战略合作框架协议&#xff0c;并在湖州安吉举行金羽新能固态电池MES项目启动会。 固态电池是一种使用固体电极和固体电解质的电池。相较传统锂电池&#xff08;液态电…

Android开发初识

文章目录一 Android发展历程二 开发工具Android Studio的发展历程三 硬件要求四 Android Studio 的安装和使用一 Android发展历程 安卓&#xff08;Android&#xff09;是一种基于Linux内核&#xff08;不包含GNU组件&#xff09;的自由及开放源代码的操作系统。 由美国Google公…

解药 or 毒药:ChatGPT辅助设计,规划师和建筑师要失业了吗?

​人工智能聊天机器人ChatGPT火爆全球&#xff0c; 规划师笔记也紧赶潮流&#xff0c;快速尝试&#xff0c; AI与设计发生碰撞&#xff0c; 会产生怎样的火花&#xff1f; 运用AI帮助写文案、作图、视频剪辑、游戏制作等等随着2021被称为元宇宙元年&#xff0c;近些年来AI在…

中国地图航线图(echarjs)

1、以上为效果图 需要jq、echarjs、china.json三个文件支持。以上 2、具体代码 DOM部分 <!-- 服务范围 GO--> <div class"m-maps"><div id"main" style"width:1400px;height: 800px; margin: 0 auto;"> </div> <!-…

【Java基础】021 -- 常见算法及API(查找、排序、Arrays)

目录 常见算法 1、企业中的常见算法 一、查找算法 1、基本查找&#xff08;数据没有任何顺序&#xff09; ①、代码实现&#xff1a; ②、课堂练习&#xff1a; 2、二分查找/折半查找&#xff08;数据一定要有顺序&#xff09; ①、示例情况&#xff1a; ②、代码实现&#xff…

一文搞懂ECU休眠唤醒之利器-TJA1145

前言 首先&#xff0c;小T请教大家几个小小问题&#xff0c;你清楚&#xff1a; 什么是TJA1145吗&#xff1f;你知道休眠唤醒控制基本逻辑是怎么样的吗&#xff1f;TJA1145又是如何控制ECU进行休眠唤醒的呢&#xff1f;使用TJA1145时有哪些注意事项呢&#xff1f; 今天&…

自动化测试的12个认识误区给后人避坑

自动化测试的12个认识误区 1、自动化的软件测试与手工的软件测试过程一样 自动化测试所需要的技巧与手工测试所需要的技巧是不一样的。 通常&#xff0c;你的项目经理会被那些测试工具销售们迷惑&#xff0c;认为自动化的软件测试就是简单地按一个录制的按钮&#xff0c;产…

电脑风扇声音大怎么办?五个好用的方法【完整教程】

电脑风扇可以电脑更好地运行&#xff0c;但是很多小伙伴投稿&#xff0c;说它们的电脑风扇不知道什么原因&#xff0c;风扇的声音很大。电脑风扇声音大怎么办&#xff1f;来看本文讲解的5个原因以及对应的解决方法。 操作环境&#xff1a; 演示机型&#xff1a;Dell optiplex 7…

如何备考pmp才能一次通过?

只有努力学习PMP知识&#xff0c;才能一次性通过这次考试&#xff0c;这是大家公认的。 但一味地埋头学习是枯燥而低效&#xff0c;学习还是要注重方法&#xff0c;下面我就来谈谈PMP的学习方法&#xff0c;希望能够帮助到你&#xff0c;一把通过pmp考试。 把PMBOK当作小说来…

Redis三 高级篇-2. 多级缓存

多级缓存 《Redis三 高级篇-2. 多级缓存》 提示: 本材料只做个人学习参考,不作为系统的学习流程,请注意识别!!! 《Redis三 高级篇-2. 多级缓存》多级缓存《Redis三 高级篇-2. 多级缓存》1. 什么是多级缓存2. JVM进程缓存2.1 导入案例2.2 初识Caffeine2.3 实现JVM进程缓存2.3.…