当前位置: 首页 > news >正文

Fuzz概述

文章目录

  • 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: gccarg1: ../test.carg2: -oarg3: testarg4: -Barg5: .arg6: -garg7: -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
@@

相关文章:

Fuzz概述

文章目录AFL一些概念插桩与覆盖率边和块覆盖率afl自实现劫持汇编器clang内置覆盖率反馈与引导变异遗传算法fork server机制AFL调试准备AFL一些概念 插桩与覆盖率 边和块 首先&#xff0c;要明白边和块的定义 正方形的就是块&#xff0c;箭头表示边&#xff0c;边表示程序执行…...

区块链知识系列 - 系统学习EVM(四)-zkEVM

区块链知识系列 - 系统学习EVM(一) 区块链知识系列 - 系统学习EVM(二) 区块链知识系列 - 系统学习EVM(三) 今天我们来聊聊 zkEVM、EVM 兼容性 和 Rollup 是什么&#xff1f; 1. 什么是 Rollup rollup顾名思义&#xff0c;就是把一堆交易卷&#xff08;rollup&#xff09;起来…...

Leetcode.2341 数组能形成多少数对

题目链接 Leetcode.2341 数组能形成多少数对 Rating : 1185 题目描述 给你一个下标从 0 开始的整数数组 nums。在一步操作中&#xff0c;你可以执行以下步骤&#xff1a; 从 nums选出 两个 相等的 整数从 nums中移除这两个整数&#xff0c;形成一个 数对 请你在 nums上多次执…...

C++复习笔记10

1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。 2. list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向其前一个元素和后一个元素。 3. list与for…...

leaflet 纯CSS的marker标记,不用图片来表示(072)

第072个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中使用纯CSS来打造marker的标记。这里用到的是L.divIcon来引用CSS来构造新icon,然后在marker的属性中引用。 这里必须要注意的是css需要是全局性质的,不能被scoped转义为其他随机的css。 直接复制下面的 v…...

Elasticsearch:使用 intervals query - 根据匹配项的顺序和接近度返回文档

Intervals query 根据匹配项的顺序和接近度返回文档。Intervals 查询使用匹配规则&#xff0c;由一小组定义构成。 然后将这些规则应用于指定字段中的术语。 这些定义产生跨越文本正文中的术语的最小间隔序列。 这些间隔可以通过父源进一步组合和过滤。 上述描述有点费解。我…...

无法决定博客主题的人必看!如何选择类型和推荐的 5 种选择

是否有人不能迈出第一步&#xff0c;因为博客的类型还没有决定&#xff1f;有些人在出发时应该行动&#xff0c;而不是思考&#xff0c;但让我们冷静下来&#xff0c;仔细想想。博客的难度因流派而异&#xff0c;这在很大程度上决定了随后的发展。因此&#xff0c;在选择博客流…...

数字化转型的成功模版,珠宝龙头曼卡龙做对了什么?

2月11日&#xff0c;曼卡龙&#xff08;300945.SZ&#xff09;发布2022年业绩快报&#xff0c;报告期内&#xff0c;公司实现营业收入16.11亿元&#xff0c;同比增长28.63%。来源&#xff1a;曼卡龙2022年度业绩快报曼卡龙能在2022年实现营收增长尤为不易。2022年受疫情影响&am…...

转换矩阵、平移矩阵、旋转矩阵关系以及python实现旋转矩阵、四元数、欧拉角之间转换

文章目录1. 转换矩阵、平移矩阵、旋转矩阵之间的关系2. 缩放变换、平移变换和旋转变换2. python实现旋转矩阵、四元数、欧拉角互相转化由于在平时总是或多或少的遇到平移旋转的问题&#xff0c;每次都是现查资料&#xff0c;然后查了忘&#xff0c;忘了继续查&#xff0c;这次弄…...

中国地图航线图(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> <!-…...

Python正则表达式中group与groups的用法详解

本文主要介绍了Python正则表达式中group与groups的用法详解&#xff0c;文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值&#xff0c;需要的朋友们下面随着小编来一起学习学习吧目录在Python中&#xff0c;正则表达式的group和groups方…...

c++练习题7

1&#xff0e;下列运算符中优先级最高的是 A&#xff09;> B&#xff09; C&#xff09; && D&#xff09;! 2&#xff0e;以下关于运算符优先级的描述中&#xff0c;正确的是 。 A&#xff09;!&#xff08;逻辑非&#x…...

MySQL学习

目录1、数据库定义基本语句&#xff08;1&#xff09;数据库操作&#xff08;2&#xff09;数据表操作2.数据库操作SQL语句&#xff08;1&#xff09;插入数据&#xff08;2&#xff09;更新语句&#xff08;3&#xff09;删除数据3.数据库查询语句&#xff08;1&#xff09;基…...

C语言(强制类型转换)

一.类型转换原则 1.升级&#xff1a;当类型转换出现在表达式时&#xff0c;无论时unsigned还是signed的char和short都会被自动转换成int&#xff0c;如有必要会被转换成unsigned int(如果short与int的大小相同&#xff0c;unsigned short就比int大。这种情况下&#xff0c;uns…...

搭建hadoop高可用集群(二)

搭建hadoop高可用集群&#xff08;一&#xff09;配置hadoophadoop-env.shworkerscore-site.xmlhdfs-site.xmlmapred-site.xmlyarn-site.xml/etc/profile拷贝集群首次启动1、先启动zk集群&#xff08;自动化脚本&#xff09;2、在hadoop151,hadoop152,hadoop153启动JournalNode…...

CentOS升级内核-- CentOS9 Stream/CentOS8 Stream/CentOS7

官方文档在此 升级原因 当我们安装一些软件(对,我说的就是Kubernetes),可能需要新内核的支持,而CentOS又比较保守,不太升级,所以需要我们手工升级. # 看下目前是什么版本内核 uname -a# 安装公钥 rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org# 添加仓库,如果…...

【基础篇】一文掌握css的盒子模型(margin、padding)

1、CSS 盒子模型(Box Model) 所有HTML元素可以看作盒子,在CSS中,"box model"这一术语是用来设计和布局时使用。CSS盒模型本质上是一个盒子,封装周围的HTML元素,它包括:边距,边框,填充,和实际内容。盒模型允许我们在其它元素和周围元素边框之间的空间放置元素…...

重生之我是赏金猎人-漏洞挖掘(十一)-某SRC储存XSS多次BypassWAF挖掘

0x01&#xff1a;利用编辑器的超链接组件导致存储XSS 鄙人太菜了&#xff0c;没啥高质量的洞呀&#xff0c;随便水一篇文章吧。 在月黑风高的夜晚&#xff0c;某骇客喊我起床挖洞&#xff0c;偷瞄了一下发现平台正好出活动了&#xff0c;想着小牛试刀吧 首先信息收集了一下&a…...

Wails简介

https://wails.io/zh-Hans/docs/introduction 简介 Wails 是一个可让您使用 Go 和 Web 技术编写桌面应用的项目。 将它看作为 Go 的快并且轻量的 Electron 替代品。 您可以使用 Go 的灵活性和强大功能&#xff0c;结合丰富的现代前端&#xff0c;轻松的构建应用程序。 功能…...

滑动窗口 AcWing (JAVA)

给定一个大小为 n≤10^6 的数组。 有一个大小为 k 的滑动窗口&#xff0c;它从数组的最左边移动到最右边。 你只能在窗口中看到 k 个数字。 每次滑动窗口向右移动一个位置。 以下是一个例子&#xff1a; 该数组为 [1 3 -1 -3 5 3 6 7]&#xff0c;k 为 33。 窗口位置最小值最大…...

vue小案例

vue小案例 组件化编码流程 1.拆分静态组件&#xff0c;按功能点拆分 2.实现动态组件 3.实现交互 文章目录vue小案例组件化编码流程1.父组件给子组件传值2.通过APP组件给子组件传值。3.案例实现4.项目小细节1.父组件给子组件传值 父组件给子组件传值 1.在父组件中写好要传的值&a…...

阅读笔记3——空洞卷积

空洞卷积 1. 背景 空洞卷积&#xff08;Dilated Convolution&#xff09;最初是为解决图像分割的问题而提出的。常见的图像分割算法通常使用池化层来增大感受野&#xff0c;同时也缩小了特征图尺寸&#xff0c;然后再利用上采样还原图像尺寸。特征图先缩小再放大的过程造成了精…...

CSS系统学习总结

目录 CSS边框 CSS背景 CSS3渐变 线性渐变&#xff08;Linear Gradients&#xff09;- 向下/向上/向左/向右/对角方向 语法 线性渐变&#xff08;从上到下&#xff09; 线性渐变&#xff08;从左到右&#xff09; 线性渐变&#xff08;对角&#xff09; 使用角度 使用多…...

阿里一面:你做过哪些代码优化?来一个人人可以用的极品案例

前言 在尼恩读者50交流群中&#xff0c;尼恩经常指导小伙伴改简历。 改简历所涉及的一个要点是&#xff1a; 在 XXX 项目中&#xff0c;完成了 XXX 模块的代码优化 另外&#xff0c;在面试的过程中&#xff0c;面试官也常常喜欢针对提问&#xff0c;来考察候选人对代码质量的追…...

Android NFC 标签读写Demo与历史漏洞概述

文章目录前言NFC基础1.1 RFID区别1.2 工作模式1.3 日常应用NFC标签2.1 标签应用2.2 应用实践2.3 标签预览2.4 前台调度NFC开发3.1 NDEF数据3.2 标签的调度3.3 读写Demo3.4 Demo演示历史漏洞4.1 中继攻击4.2 预览伪造4.3 篡改卡片4.4 其它漏洞总结前言 NFC 作为 Android 手机一…...

亿级高并发电商项目-- 实战篇 --万达商城项目 六(编写角色管理、用户权限(Spring Security认证授权)、管理员管理等模块)

专栏&#xff1a;高并发---前后端分布式 &#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是小童&#xff0c;Java开发工程师&#xff0c;CSDN博客博主&#xff0c;Java领域新星创作者 &#x1f4d5;系列专栏&#xff1a;前端、Java、Java中间件大全、微信小程序、微信…...

博视像元获近5000万元融资,主攻半导体前道及锂电高端部件供应

这两年各大车企与电池厂商都在快速新建产能&#xff0c;尤其上游原材料成本大增&#xff0c;反映到产业链上巨头都在寻求增效&#xff0c;高端制造技术投入也大幅增长。比如这家&#xff0c;高端工业相机提供商「博视像元」近期宣布完成近5000万的天使加轮融资&#xff0c;投资…...

SpringCloud-断路器Hystrix

一、降级使用1、添加依赖<!--hystrix--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId></dependency>2、启动类添加注解EnableCircuitBreakerSpringBoot…...

JavaScript精简笔记

文章目录基础语法函数1.1、函数的使用预解析对象1.1、创建对象基础语法 函数 1.1、函数的使用 函数在使用时分为两步&#xff1a;声明函数和调用函数 ①声明函数 //声明函数 function 函数名(){//函数体代码 }function 是声明函数的关键字,必须小写由于函数一般是为了实现…...

MySQL常用函数汇总

1 MySQL 字符串函数函数描述实例ASCII(s)返回字符串 s 的第一个字符的 ASCII 码。返回 CustomerName 字段第一个字母的 ASCII 码&#xff1a;SELECT ASCII(CustomerName) AS NumCodeOfFirstCharFROM Customers;CHAR_LENGTH(s)返回字符串 s 的字符数返回字符串 RUNOOB 的字符数S…...

浙江省住房和城乡建设厅网站/重庆网络推广公司

1.利用时间戳来获得随机数 利用System.currentTimeMillis&#xff08;&#xff09;获得时间的位数&#xff0c;例如&#xff1a;个位&#xff0c;十位&#xff0c;百位…等等。 例如&#xff1a; int number1 (int)(System.currentTimeMillis() % 10); #获得时间个位数 int …...

综合网站建设课程设计/搜索引擎营销优化

存储过程: procedure 概念类似于函数,就是把一段代码封装起来, 当要执行这一段代码的时候,可以通过调用该存储过程来实现. 在封装的语句体里面,可以用if/else, case,while等控制结构. 可以进行sql编程. 查看现有的存储过程: Show procedure status 删除存储过程 Drop procedure…...

初中做网站用什么软件/厦门网站到首页排名

1.lucene简介 1.1 什么是lucene Lucene是一个全文搜索框架&#xff0c;而不是应用产品。因此它并不像www.baidu.com 或者google Desktop那么拿来就能用&#xff0c;它只是提供了一种工具让你能实现这些产品。 1.2 lucene的工作方式 lucene提供的服务实际包含两部分&#xff1…...

怎么才能注册做网站/网站设计优化

下载android应用的apk文件变成了zip--网上转载的解决方案 下载android应用的apk文件变成了zip--网上转载的解决方案 解决方案一、 最近把开发的android应用放在公司网站上&#xff0c;用IE下载后遇到了问题&#xff1a;扩展名.APK文件点击下载后却变成了.ZIP文件&#xff0c;…...

为什么很多公司没自己的网站/百度seo哪家公司好

创建容器时指定网络模式 docker run -d -p 外部访问端口:容器内端口 --net"网络模式" -v 本机目录:容器内目录 --name"容器名称" 镜像名 要执行的角本 docker ps 查看启动的容器列表 docker ps -a 查看所有的容器列表 docker start 容器名称 …...

山西做网站的公司哪个好/广告开户南京seo

二维平面作图 ? 三维空间作图 ? 符号作图 ? Matlab 绘图过程/原理 2 手工作图如何画出 数学软件 Matlab —— 二维平面作图 —— 三维空间作图 1 本讲主要内容......是通过描点、连线来实现的,故在 画一个曲线图形之前,必须先取得该图形上的 一系列的点的坐标(即横坐标和纵坐…...