-
Notifications
You must be signed in to change notification settings - Fork 113
/
custom_mutator_example.py
72 lines (57 loc) · 1.97 KB
/
custom_mutator_example.py
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
#!/usr/bin/python3
# Copyright 2021 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""An example of fuzzing with a custom mutator in Python.
This is a Python translation of the example at:
https://github.com/google/fuzzing/blob/master/docs/structure-aware-fuzzing.md#example-compression.
"""
import atheris
with atheris.instrument_imports():
import sys
import zlib
def CustomMutator(data, max_size, seed):
try:
decompressed = zlib.decompress(data)
except zlib.error:
decompressed = b'Hi'
else:
decompressed = atheris.Mutate(decompressed, len(decompressed))
return zlib.compress(decompressed)
@atheris.instrument_func # Instrument the TestOneInput function itself
def TestOneInput(data):
"""The entry point for our fuzzer.
This is a callback that will be repeatedly invoked with different arguments
after Fuzz() is called.
We translate the arbitrary byte string into a format our function being fuzzed
can understand, then call it.
Args:
data: Bytestring coming from the fuzzing engine.
"""
try:
decompressed = zlib.decompress(data)
except zlib.error:
return
if len(decompressed) < 2:
return
try:
if decompressed.decode() == 'FU':
raise RuntimeError('Boom')
except UnicodeDecodeError:
pass
if __name__ == '__main__':
if len(sys.argv) > 1 and sys.argv[1] == '--no_mutator':
atheris.Setup(sys.argv, TestOneInput)
else:
atheris.Setup(sys.argv, TestOneInput, custom_mutator=CustomMutator)
atheris.Fuzz()