about summary refs log tree commit diff
path: root/examples/python_mutators/example.py
blob: d32a7eb20db08c890fcc46aae2e3dd75cc93305e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#!/usr/bin/env python
# encoding: utf-8
'''
Example Python Module for AFLFuzz

@author:     Christian Holler (:decoder)

@license:

This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this
file, You can obtain one at http://mozilla.org/MPL/2.0/.

@contact:    choller@mozilla.com
'''

import random

def init(seed):
    '''
    Called once when AFLFuzz starts up. Used to seed our RNG.
    
    @type seed: int
    @param seed: A 32-bit random value
    '''
    random.seed(seed)
    return 0

def fuzz(buf, add_buf):
    '''
    Called per fuzzing iteration.
    
    @type buf: bytearray
    @param buf: The buffer that should be mutated.
    
    @type add_buf: bytearray
    @param add_buf: A second buffer that can be used as mutation source.
    
    @rtype: bytearray
    @return: A new bytearray containing the mutated data
    '''
    ret = bytearray(buf)
    # Do something interesting with ret

    return ret

# Uncomment and implement the following methods if you want to use a custom
# trimming algorithm. See also the documentation for a better API description.

# def init_trim(buf):
#     '''
#     Called per trimming iteration.
#     
#     @type buf: bytearray
#     @param buf: The buffer that should be trimmed.
#     
#     @rtype: int
#     @return: The maximum number of trimming steps.
#     '''
#     global ...
#     
#     # Initialize global variables
#     
#     # Figure out how many trimming steps are possible.
#     # If this is not possible for your trimming, you can
#     # return 1 instead and always return 0 in post_trim
#     # until you are done (then you return 1).
#         
#     return steps
# 
# def trim():
#     '''
#     Called per trimming iteration.
# 
#     @rtype: bytearray
#     @return: A new bytearray containing the trimmed data.
#     '''
#     global ...
#     
#     # Implement the actual trimming here
#     
#     return bytearray(...)
# 
# def post_trim(success):
#     '''
#     Called after each trimming operation.
#     
#     @type success: bool
#     @param success: Indicates if the last trim operation was successful.
#     
#     @rtype: int
#     @return: The next trim index (0 to max number of steps) where max
#              number of steps indicates the trimming is done.
#     '''
#     global ...
# 
#     if not success:
#         # Restore last known successful input, determine next index
#     else:
#         # Just determine the next index, based on what was successfully
#         # removed in the last step
#     
#     return next_index