Exemple #1
0
def generate(grammar=None,
             num=1,
             output=sys.stdout,
             max_recursion=10,
             seed=None):
    """Load and generate ``num`` number of top-level rules from the specified grammar.

    :param list grammar: The grammar file to load and generate data from
    :param int num: The number of times to generate data
    :param output: The output destination (an open, writable stream-type object. default=``sys.stdout``)
    :param int max_recursion: The maximum reference-recursion when generating data (default=``10``)
    :param int seed: The seed to initialize the PRNG with. If None, will not initialize it.
    """
    if seed is not None:
        gramfuzz.rand.seed(seed)

    fuzzer = gramfuzz.GramFuzzer()
    fuzzer.load_grammar(grammar)

    cat_group = os.path.basename(grammar).replace(".py", "")

    results = fuzzer.gen(cat_group=cat_group,
                         num=num,
                         max_recursion=max_recursion)
    for res in results:
        output.write(res)
def test_gramfuzz(grammar, start_symbol, tries):
    grammar = "grammars/" + grammar + ".py"
    start = time.time()
    fuzzer = gramfuzz.GramFuzzer()
    fuzzer.load_grammar(grammar)
    result = fuzzer.gen(cat=start_symbol, num=tries, max_recursion=10)
    end = time.time()
    runtime = end - start
    return runtime
Exemple #3
0
def generate_json(path):
    grammar = gramfuzz.GramFuzzer()
    grammar.load_grammar(path)
    for x in grammar.gen(cat="json", num=10, max_recursion=10):
        if x not in ["{}", "[]"]:
            j = json.loads(x)
            del grammar
            return j
    return {"dummy": 1}
Exemple #4
0
 def generate(self):
     print('\nGenerating seeds...')
     fuzzer = gramfuzz.GramFuzzer()
     fuzzer.load_grammar(self._feed)
     for i in range(self._file_num):
         bc_inputs = fuzzer.gen(cat="bc_input", num=1)
         with open('input/input{}'.format(i), 'w') as f:
             for bc_input in bc_inputs:
                 f.write(bc_input.decode('utf-8') + '\n')
             f.write('quit')
     print('{} files generated. Start fuzzing...'.format(self._file_num))
def generate_input(file_path):
    fuzzer = gramfuzz.GramFuzzer()
    fuzzer.load_grammar(file_path)
    for i in range(file_number):
        print('Generating: input{}'.format(i))
        bc_inputs = fuzzer.gen(cat="bc_input", num=input_number)
        with open('input{}'.format(i), 'w') as f:
            for bc_input in bc_inputs:
                f.write(bc_input.decode('utf-8') + '\n')
            f.write('quit')
        #print('Finished: input{}'.format(i))
    print('Finished generated inputs')
Exemple #6
0
def generate_syntatically_valid_yaml():
    fuzzer = gramfuzz.GramFuzzer()
    fuzzer.load_grammar("yaml_grammar.py")
    yaml_dat = fuzzer.gen(cat="yamlfile", num=1)[0]

    # in theory, at this point, the YAML should survive 'netplan generate'.
    # now we expect netplan generate to make the checks around e.g. the
    # things NM can't render (e.g. bug 3, bug 4), so those sorts of things
    # should really be sorted out and the grammar level.

    if TEST_GENERATE:
        with open('/etc/netplan/fuzz.yaml', 'w') as f:
            f.write(yaml_dat)

        if os.system("netplan generate") != 0:
            exit(1)

    return yaml_dat
Exemple #7
0
def main():
    num_files = 50

    parser = argparse.ArgumentParser(description='YANG model grammar fuzzer')
    parser.add_argument('--num_files', '-N', help="number of models to generate", type=int)
    args = parser.parse_args()

    path = "./corpus/"

    if not os.path.isdir(path):
        os.makedirs(path)

    fuzzer = gramfuzz.GramFuzzer()
    
    fuzzer.load_grammar("container-grammar.py")
    for i in progressbar.progressbar(range(num_files)):
        configs = fuzzer.gen(cat="container", num=1)
        f = open(f"./{path}/{str(i)}.yang", "wb")
        f.write(configs[0])
        f.close()
Exemple #8
0
def main():
    global num_files

    parser = argparse.ArgumentParser(description='YANG model grammar fuzzer')
    parser.add_argument('--num_files',
                        '-N',
                        help="number of models to generate",
                        type=int)
    args = parser.parse_args()

    if args.num_files:
        num_files = args.num_files

    fuzzer = gramfuzz.GramFuzzer()
    fuzzer.load_grammar("yang_grammar.py")
    for i in progressbar.progressbar(range(num_files)):
        configs = fuzzer.gen(cat="yang", num=1)
        f = open("./configs/" + str(i) + ".yang", "w")
        f.write(configs[0])
        f.close()
Exemple #9
0
def main():
    parser = ArgumentParser()
    parser.add_argument("-o",
                        "--out",
                        dest="out_dir",
                        default="output/",
                        help="the output directory for the fuzzed files")
    parser.add_argument("-n",
                        dest="num",
                        default="10",
                        type=int,
                        help="number of files that should be produced")
    parser.add_argument("--vim_format",
                        dest="vim_format",
                        action="store_true",
                        help="format the output files with vim")

    args = parser.parse_args()

    if not os.path.exists(args.out_dir):
        os.makedirs(args.out_dir)

    fuzzer = gramfuzz.GramFuzzer()
    fuzzer.load_grammar(
        os.path.join(os.path.dirname(os.path.abspath(__file__)),
                     "minijava_grammar.py"))
    minijava = fuzzer.gen(cat="minijava", num=args.num, auto_process=False)

    for i in range(0, args.num):
        filename = args.out_dir + "/" + uuid.uuid4().hex + ".java"
        with open(filename, "w") as file:
            file.write(minijava[i])

        if args.vim_format:
            os.system("""vim +"execute 'normal! =G' | :wq! """ + filename +
                      """" """ + filename)
Exemple #10
0
    new_c = chr(ord(c) ^ bit)
    # print("Flipping", bit, "in", repr(c) + ", giving", repr(new_c))
    return s[:pos] + new_c + s[pos + 1:]


def mutate(s):
    """Return s with a random mutation applied"""
    mutators = [
        delete_random_character, insert_random_character, flip_random_character
    ]
    mutator = random.choice(mutators)
    # print(mutator)
    return mutator(s)


fuzzer = gramfuzz.GramFuzzer()

fuzzer.load_grammar('./bin/jsonmgrammar.py')

strings = {}
estrings = {}
import sys


def dump_and_flush(f, s):
    sys.stdout.flush()
    pickle.dump(s, f)
    f.flush()


import pickle
Exemple #11
0
 def setUp(self):
     self.fuzzer = gramfuzz.GramFuzzer()
Exemple #12
0
def main():
    parser = ArgumentParser()
    parser.add_argument("-o",
                        "--out",
                        dest="out_dir",
                        default="output/",
                        help="the output directory for the fuzzed files")
    parser.add_argument("-n",
                        dest="num",
                        default="10",
                        type=int,
                        help="number of files that should be produced")
    parser.add_argument("--vim_format",
                        dest="vim_format",
                        action="store_true",
                        help="format the output files with vim")
    parser.add_argument("--token",
                        dest="token",
                        action="store_true",
                        help="generate token list file")
    parser.add_argument(
        "--lexer",
        dest="lexer",
        action="store_true",
        help="fuzz lexer test cases without caring about the syntax")

    args = parser.parse_args()

    if not os.path.exists(args.out_dir):
        os.makedirs(args.out_dir)

    fuzzer = gramfuzz.GramFuzzer()
    fuzzer.set_max_recursion(RECURSION_LIMIT)

    ROOT_DIR = os.path.dirname(os.path.abspath(__file__))
    grammar = "minijava_grammar.py"
    category = "minijava"
    if args.lexer:
        grammar = "lexer_grammar.py"
        category = "minijava_lex"
    fuzzer.load_grammar(os.path.join(ROOT_DIR, grammar))

    (tokens, minijava) = fuzzer.gen(
        cat=category,
        num=args.num,
        auto_process=False,
    )

    for i in range(0, args.num):
        filename = args.out_dir + "/" + uuid.uuid4().hex + ".mj"

        with open(filename, "w") as file:
            file.write(minijava[i])

        if args.token:
            with open(filename + ".out", "w") as file:
                file.write(tokens[i] + "\nEOF")

        if args.vim_format:
            os.system("""vim +"execute 'normal! =G' | :wq! """ + filename +
                      """.java" """ + filename + ".java")
Exemple #13
0
 def setUp(self):
     gramfuzz.GramFuzzer.__instance__ = None
     self.fuzzer = gramfuzz.GramFuzzer()