Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >使用go-fuzz进行简单的fuzzing实践

使用go-fuzz进行简单的fuzzing实践

作者头像
用户1423082
发布于 2024-12-31 12:14:31
发布于 2024-12-31 12:14:31
9100
代码可运行
举报
文章被收录于专栏:giantbranch's bloggiantbranch's blog
运行总次数:0
代码可运行

go环境配置

具体参考

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://golang.org/doc/install

以我当时为例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
wget https://golang.org/dl/go1.17.2.linux-amd64.tar.gz
rm -rf /usr/local/go && tar -C /usr/local -xzf go1.17.2.linux-amd64.tar.gz

# 下面的最好放到.bashrc里面(我用的Ubuntu)
export PATH=$PATH:/usr/local/go/bin:~/go/bin

其他注意事项:

go1.16以后,默认需要提供go.mod,我们可以设置环境变量GO111MODULE为auto让其自动

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
go env -w GO111MODULE=auto

例子实践

源码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ cat png.go 
package png

import (
	"bytes"
	"image/png"
)

func Fuzz(data []byte) int {
	png.Decode(bytes.NewReader(data))
	return 0
}

在文件目录执行go-fuzz-build,就会生成png-fuzz.zip

之后直接运行go-fuzz命令即可

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ go-fuzz
2021/11/03 09:21:10 workers: 1, corpus: 25 (0s ago), crashers: 0, restarts: 1/0, execs: 0 (0/sec), cover: 0, uptime: 3s
2021/11/03 09:21:13 workers: 1, corpus: 27 (2s ago), crashers: 0, restarts: 1/0, execs: 0 (0/sec), cover: 187, uptime: 6s
2021/11/03 09:21:16 workers: 1, corpus: 27 (5s ago), crashers: 0, restarts: 1/6770, execs: 40621 (4513/sec), cover: 191, uptime: 9s
2021/11/03 09:21:19 workers: 1, corpus: 27 (8s ago), crashers: 0, restarts: 1/8809, execs: 88095 (7341/sec), cover: 191, uptime: 12s

不过最好指定一下输出路径:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
go-fuzz -workdir output

还有一种是以libfuzzer的支持

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
go-fuzz-build -libfuzzer -o png.a
clang -fsanitize=fuzzer png.a -o png.libfuzzer

之后把png.libfuzzer运行就可以了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ ./png.libfuzzer 
INFO: Running with entropic power schedule (0xFF, 100).
INFO: Seed: 4139029883
INFO: 65536 Extra Counters
INFO: -max_len is not provided; libFuzzer will not generate inputs larger than 4096 bytes
INFO: A corpus is not provided, starting from an empty corpus
#2	INITED ft: 27 corp: 1/1b exec/s: 0 rss: 29Mb
#414	NEW    ft: 34 corp: 2/9b lim: 8 exec/s: 0 rss: 30Mb L: 8/8 MS: 2 InsertByte-InsertRepeatedBytes-
#262144	pulse  ft: 34 corp: 2/9b lim: 2611 exec/s: 87381 rss: 35Mb
#524288	pulse  ft: 34 corp: 2/9b lim: 4096 exec/s: 74898 rss: 35Mb

当然是用corpus会有更好的覆盖率,corpus可以从github.com/dvyukov/go-fuzz-corpus获取

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ ./png.libfuzzer ./go-fuzz-corpus/png/corpus/
INFO: Running with entropic power schedule (0xFF, 100).
INFO: Seed: 4180837821
INFO: 65536 Extra Counters
INFO:      441 files found in ./go-fuzz-corpus/png/corpus/
INFO: -max_len is not provided; libFuzzer will not generate inputs larger than 294915 bytes
INFO: seed corpus: files: 441 min: 1b max: 294915b total: 4508226b rss: 29Mb
#442	INITED ft: 3197 corp: 328/2959Kb exec/s: 0 rss: 47Mb
#476	REDUCE ft: 3197 corp: 328/2959Kb lim: 294915 exec/s: 0 rss: 47Mb L: 134/294915 MS: 4 ChangeByte-ChangeBit-ShuffleBytes-EraseBytes-
#1957	REDUCE ft: 3197 corp: 328/2959Kb lim: 294915 exec/s: 0 rss: 48Mb L: 64/294915 MS: 1 EraseBytes-
#2283	REDUCE ft: 3197 corp: 328/2959Kb lim: 294915 exec/s: 0 rss: 49Mb L: 15997/294915 MS: 1 EraseBytes-
#2629	REDUCE ft: 3197 corp: 328/2959Kb lim: 294915 exec/s: 2629 rss: 49Mb L: 2182/294915 MS: 1 EraseBytes-
#5131	REDUCE ft: 3197 corp: 328/2958Kb lim: 294915 exec/s: 5131 rss: 50Mb L: 329/294915 MS: 2 CrossOver-EraseBytes-
#5372	REDUCE ft: 3197 corp: 328/2958Kb lim: 294915 exec/s: 5372 rss: 50Mb L: 48/294915 MS: 1 EraseBytes-
#5388	REDUCE ft: 3197 corp: 328/2958Kb lim: 294915 exec/s: 5388 rss: 50Mb L: 93/294915 MS: 1 EraseBytes-
#5464	NEW    ft: 3198 corp: 329/2958Kb lim: 294915 exec/s: 5464 rss: 50Mb L: 75/294915 MS: 1 CopyPart-
#5695	REDUCE ft: 3198 corp: 329/2958Kb lim: 294915 exec/s: 2847 rss: 50Mb L: 31/294915 MS: 1 EraseBytes-
#7537	REDUCE ft: 3198 corp: 329/2958Kb lim: 294915 exec/s: 3768 rss: 50Mb L: 92/294915 MS: 2 ChangeBit-EraseBytes-
#7693	REDUCE ft: 3198 corp: 329/2958Kb lim: 294915 exec/s: 3846 rss: 50Mb L: 9059/294915 MS: 5 CrossOver-CrossOver-CrossOver-InsertByte-EraseBytes-
#8192	pulse  ft: 3198 corp: 329/2958Kb lim: 294915 exec/s: 4096 rss: 50Mb
#8239	REDUCE ft: 3198 corp: 329/2958Kb lim: 294915 exec/s: 4119 rss: 50Mb L: 110/294915 MS: 1 EraseBytes-
#8491	REDUCE ft: 3198 corp: 329/2958Kb lim: 294915 exec/s: 4245 rss: 50Mb L: 114/294915 MS: 2 ChangeASCIIInt-EraseBytes-
#9009	REDUCE ft: 3198 corp: 329/2954Kb lim: 294915 exec/s: 4504 rss: 50Mb L: 14101/294915 MS: 3 ChangeASCIIInt-ChangeByte-EraseBytes-

假如要fuzz gif,改成下面即可,其他图片库类似

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package gif 

import (
	"bytes"
	"image/gif"
)

func Fuzz(data []byte) int {
	gif.Decode(bytes.NewReader(data))
	return 0
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-11-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
libfuzzer 文档
就是变异,覆盖率那些都给你做好了,你只需要定义LLVMFuzzerTestOneInput,将编译的数据喂给要fuzz的目标函数就行
用户1423082
2024/12/31
2740
ClusterFuzz的bot源码(fuzz engine的选择与调度之libfuzzer)阅读
上一次我们选择了fuzz task的代码进行阅读,这次我们进一步深入,看看fuzz engine的选择
用户1423082
2024/12/31
1300
ClusterFuzz的bot源码(fuzz engine的选择与调度之libfuzzer)阅读
ClusterFuzz的bot源码(fuzz task)阅读
之后执行中的src/local/butler/run_bot.py中的execute
用户1423082
2024/12/31
1010
关于Fuzzing模糊测试入门原理及实践的讨论
"The best alternative to defense mechanisms is to find and fix the bugs."
王驭停
2021/09/19
3.8K0
关于Fuzzing模糊测试入门原理及实践的讨论
针对二维码解析库的 Fuzzing 测试
在四月份的时候出了那么一个新闻,说微信有一个打开图片就崩溃的 bug,当时微信群里都在传播导致手机各种闪退。
evilpan
2023/10/17
5410
针对二维码解析库的 Fuzzing 测试
selenium-ide 开发手册开发过程剪辑:
https://github.com/SeleniumHQ/selenium-ide
一个会写诗的程序员
2018/12/25
1.5K0
本地使用ClusterFuzz
修改./local/install_deps_linux.bash中的 bower install 为bower install --allow-root(因为bower install的时候默认不允许root用户)
用户1423082
2024/12/31
2230
本地使用ClusterFuzz
Kubernetes中资源限制的一些笔记整理
我们的痛苦来源于“夸父追日”一般的对“更好”的追求,也来自于自己的自卑与狂妄。--------duoduokk
山河已无恙
2023/01/30
6410
网站扫描与Fuzz测试之敏感信息收集
注意:本文分享给安全从业人员,网站开发人员和运维人员在日常工作中使用和防范恶意攻击,请勿恶意使用下面描述技术进行非法操作。
全栈工程师修炼指南
2020/10/23
3.9K0
网站扫描与Fuzz测试之敏感信息收集
进程管理利器-supervisor部署记录
一、简单介绍 supervisor是用来管理进程的一个工具,止于为什么要用supervisor,是因为相对于linux传统的进程管理方式来说,它有很多的优势: ----简单---- 通常管理linux进程的时候,一般来说都需要自己编写一个能够实现进程start/stop/restart/reload功能的脚本,然后丢到/etc/init.d/下面。这么做有很多不好的地方,第一我们要编写这个脚本,这就很耗时耗力了。 第二,当这个进程挂掉的时候,linux不会自动重启它的,想要自动重启的话,我们还要自己写一个监
洗尽了浮华
2018/01/23
1.9K0
技术分享 | 使用 pt-query-digest 分析慢日志
爱可生北京分公司 DBA 团队成员,负责 MySQL 日常问题处理和 DMP 产品维护。喜爱技术和开源数据库,喜爱运动、读书、电影,花草树木。
爱可生开源社区
2020/09/28
4.1K0
技术分享 | 使用 pt-query-digest 分析慢日志
libprotobuf-mutator学习
Protocol Buffers是一种序列化数据结构的协议。他是Google的开发的,而且与语言无关,与平台无关的可扩展机制,用于对结构化数据进行序列化(例如XML),但更小,更快,更简单。您定义要一次构造数据的方式,然后可以使用生成的特殊源代码轻松地使用各种语言在各种数据流中写入和读取结构化数据。
用户1423082
2024/12/31
1110
libprotobuf-mutator学习
TiDB 关联子查询及半连接的优化实践(上)
TiDB 针对子查询语句会执行多种子查询相关的优化 ( https://docs.pingcap.com/zh/tidb/stable/subquery-optimization ),以提升子查询的执行性能。半连接语句和关联子查询语句是常用的两类子查询,TiDB 优化器默认包含一些自动优化策略,同时 TiDB 也提供额外的 HINT 用于影响优化器在特定场景下可以选择更高效的执行计划。本文针对半连接及关联子查询语句在 TiDB 中的用法及优化技巧进行说明。
PingCAP
2024/11/28
2130
TiDB 关联子查询及半连接的优化实践(上)
Linux 服务器日常巡检脚本分享
Linux 系统日常巡检脚本,巡检内容包含了,磁盘,内存 cpu 进程 文件更改 用户登录等一系列的操作 直接用就行了。
杰哥的IT之旅
2021/11/10
2.7K0
使用supervisor管理消费队列等进程
使用supervisor管理消费进程 上面的方式一次只能处理一个任务,配合supervisor可以以守护进程的模式不断的处理任务
OwenZhang
2021/12/08
6910
Supervisor 进程管理
Supervisor是用Python开发的进程管理工具,可以很方便的用来启动、重启、关闭进程(不仅仅是 Python 进程)。能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。除了对单个进程的控制,还可以同时启动、关闭多个进程,比如很不幸的服务器出问题导致所有应用程序都被杀死,此时可以用 supervisor 同时启动所有应用程序而不是一个一个地敲命令启动。
chuchur
2022/11/14
6740
【Pod Terminating原因追踪系列之三】让docker事件处理罢工的cancel状态码
岳家瑞,腾讯云后台开发工程师,日常负责K8s生态和运行时相关工作,包括K8s插件开发和运行时问题排查。
腾讯云原生
2020/08/31
2.2K0
Log4j2 + SLF4j打造日志系统
java 界里有许多实现日志功能的工具,最早得到广泛使用的是 log4j,许多应用程序的日志部分都交给了 log4j,不过作为组件开发者,他们希望自己的组件不要紧紧依赖某一个工具,毕竟在同一个时候还有很多其他很多日志工具,假如一个应用程序用到了两个组件,恰好两个组件使用不同的日志工具,那么应用程序就会有两份日志输出了。
洋仔聊编程
2019/01/15
3.3K0
SpringBoot 实践系列-集成 RocketMQ
RocketMQ 目前没有提供集成 SpringBoot 的 starter,因此现在接入都是通过引入客户端进行编程。下面来看下 SpringBoot 集成 RocketMQ 的过程。
磊叔的技术博客
2025/06/07
1790
SpringBoot 实践系列-集成 RocketMQ
Flume监控之Ganglia安装与简单实践
写在前面: 博主是一名大数据的初学者,昵称来源于《爱丽丝梦游仙境》中的Alice和自己的昵称。作为一名互联网小白,写博客一方面是为了记录自己的学习历程,一方面是希望能够帮助到很多和自己一样处于起步阶段的萌新。由于水平有限,博客中难免会有一些错误,有纰漏之处恳请各位大佬不吝赐教!个人小站:http://alices.ibilibili.xyz/ , 博客主页:https://alice.blog.csdn.net/ 尽管当前水平可能不及各位大佬,但我还是希望自己能够做得更好,因为一天的生活就是一生的缩影。
大数据梦想家
2021/01/27
7640
Flume监控之Ganglia安装与简单实践
相关推荐
libfuzzer 文档
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验