背景
在使用gofuzz的过程中,发现自己输入的corpus好像没有被执行。
遂审计一下代码,追踪一下输入的corpus的处理流程。
正文
在一次测试过程中,我输入的初始语料如下
{"Name":"AjWwhT","Symbol":"HctcuA","TotalSupply":100}
但进化出的可崩溃语料却是这些
":"
"{\"\"1"
"{1"
"{:"
"\"\","
"\"\":"
"{0"
"{,"
","
"{2"
"{\"\":0\"0"
"{\"\"T"
"0T"
"0\"0"
"{\"\"2"
"{\"\"\""
"{T"
"{\"\"}"
"{\"\":\"\":"
"{\"\":\"\"T"
"{\"\","
"02"
"{}"
"}"
"T"
"{\"\":00"
"01"
"0}"
"00"
"{\"\"0"
这都是嘛玩意儿,根本看不出跟我的初始输入有啥血缘关系。
于是跟进一下代码,来学习一下corpus的处理流程。
文件输入
go-fuzz
命令的入口为main
函数。
其中,调用了coordinatorMain
和hub.connect
函数。
coordinatorMain
函数从/corpus/
文件目录下读取用户生成的自定义初始语料集合。hub.connect
函数将这些语料集合载入到变量hub.triageQueue
中。
工作进程包含两个循环:
hub.loop
: 该循环将hub.triageQueue
中的语料载入到triageC
变量中。worker.loop
:该循环调用triageInput
函数来处理triageC
变量。
流程图如下:
结尾
所以说gofuzz还是运行了我给的初始corpus,只是由于某种原因没有输出crash…
可能是没有当作模糊测试的重点?
这些都只是猜测
我不想花太多时间在研究如何优雅的使用gofuzz上了。
于是直接到gofuzz仓库的issue中寻找答案。
在issue#289中,找到了类似的思考。
官方给出的更优解是fzgo,一个集成了go-fuzz和go test的工具。
后面我会把研究精力,从gofuzz的原理研究 转移到 fzgo的体验和测试上。