I. Introduction
With the outbreak of many attack events such as Heartbleed attack [1], WanaCry ransomware [2], people’s property and privacy have been greatly threatened. The reason behind them is that vulnerabilities existed in the related software can lead to control flow hijacking or information leakage. Therefore, eliminating software vulnerabilities becomes critical. Fuzzing is currently the most popular and effective technology for discovering software vulnerabilities and bugs. It has been used to discover a large number of high-impact security vulnerabilities, such as CVE-2014-0160 [3], CVE-2017-7668 [4] and so on. Its idea is to generate some semi-valid input to trigger some anomalous behavior in software by mutating a set of initial inputs according to some specified strategies. In terms of ways of sample generation, it is divided into generation-based fuzzing and mutation-based fuzzing. The generation-based fuzzer (eg. Peach [5]) relies on the syntax for describing the input structure to generate test cases. Its advantage is that it can generate correctly formatted samples, to avoid being discarded early in the parsing stage of the program, which can guarantee to trigger some deep code. But it needs to manually write a syntax file such as Peach Pit, which is time consuming and error-prone, and it has no coverage feedback mechanism, which also limits its ability to explore code. Mutation-based fuzzing (eg. AFL [6]) does not rely on input syntax and randomly mutate the initial seed inputs to generate new test cases. This method is convenient and easy to use, but because it is lack of the input structure awareness, resulting in generating a lot of invalid input and wasting a lot of time.