# Nautilus 2.0 Nautilus is a coverage-guided, grammar-based fuzzer. You can use it to improve your test coverage and find more bugs. By specifying the grammar of semi-valid inputs, Nautilus is able to perform complex mutations and uncover more interesting test cases. Many of the ideas behind this fuzzer are documented in the Paper published at NDSS 2019.
Version 2.0 has added many improvements to this early prototype and is now 100% compatible with AFL++. Besides general usability improvements, Version 2.0 includes lots of shiny new features: * Support for AFL-Qemu mode * Support for grammars specified in python * Support for non-context free grammars using python scripts to generate inputs from the structure * Support for specifying binary protocols/formats * Support for specifying regex based terminals that aren't part of the directed mutations * Better ability to avoid generating the same very short inputs over and over * Massive cleanup of the code base * Helpful error output on invalid grammars * Fixed a bug in the timeout code that occasionally deadlocked the fuzzer ## How Does Nautilus Work? You specify a grammar using rules such as `EXPR -> EXPR + EXPR` or `EXPR -> NUM` and `NUM -> 1`. From these rules, the fuzzer constructs a tree. This internal representation allows to apply much more complex mutations than raw bytes. This tree is then turned into a real input for the target application. In normal Context Free Grammars, this process is straightforward: all leaves are concatenated. The left tree in the example below would unparse to the input `a=1+2` and the right one to `a=1+1+1+2`. To increase the expressiveness of your grammars, using Nautilus you are able to provide python functions for the unparsing process to allow much more complex specifications.## Setup ```bash # checkout the git git clone 'git@github.com:nautilus-fuzz/nautilus.git' cd nautilus /path/to/AFLplusplus/afl-clang-fast test.c -o test #afl-clang-fast as provided by AFL mkdir /tmp/workdir # all arguments can also be set using the config.ron file cargo run --release -- -g test_cases/grammar_regex_root.py -o /tmp/workdir -- ./test @@ # or if you want to use QEMU mode: cargo run /path/to/AFLplusplus/afl-qemu-trace -- ./test_bin @@ ``` ## Examples Here, we use python to generate a grammar for valid xml-like inputs. Notice the use of a script rule to ensure the opening and closing tags match. ```python #ctx.rule(NONTERM: string, RHS: string|bytes) adds a rule NONTERM->RHS. We can use {NONTERM} in the RHS to request a recursion. ctx.rule("START","