背景
在使用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的体验和测试上。