A bug uncovered by fuzzing is seldom the product of a single input. More often, it's a family of inputs that reliably triggers the same underlying flaw.
Validating a fix means testing against that entire family, not just the one input that happened to surface the problem. In this lecture, I'll show how to
capture these families as specialized grammars that encode specific program behaviors, particularly faulty ones. You'll learn how to extract and merge such
patterns into targeted grammars, and how to use them to focus your fuzzing efforts. These grammars compose naturally with smart fuzzers, giving you fine-
grained control over input generation and making tests consistent and reproducible.
A persistent challenge in fuzzing is that leveraging input structure requires accurate specifications, which aren't always on hand. I'll show how to
sidestep this by deriving input grammars directly from the program. When source code is available, static and dynamic analysis can trace input-handling
logic from first principles. Without it, we can infer structure by observing how the program responds to inputs and iteratively refining our model through
feedback.
Together, these techniques make specification-free fuzzing practical and lay the foundation for the behavior-driven strategies we'll develop throughout the
session.