aboutsummaryrefslogtreecommitdiff
path: root/examples/custom_mutators/example.py
diff options
context:
space:
mode:
authorh1994st <h1994st@gmail.com>2020-03-04 01:09:37 -0500
committerh1994st <h1994st@gmail.com>2020-03-04 01:09:37 -0500
commit38e7dd2b9efbd9c6cda47774630a82660d3156b3 (patch)
treeb889bbc0c5c07f5f84b50253d675390305953c0b /examples/custom_mutators/example.py
parent42ce48db39ba487caeb9477535364170fccf956a (diff)
downloadafl++-38e7dd2b9efbd9c6cda47774630a82660d3156b3.tar.gz
Update examples of the custom mutator
- Merge `examples/python_mutators` into `examples/custom_mutators` - Remove `examples/python_mutators` - Update existing examples to demonstrate new APIs
Diffstat (limited to 'examples/custom_mutators/example.py')
-rw-r--r--examples/custom_mutators/example.py122
1 files changed, 122 insertions, 0 deletions
diff --git a/examples/custom_mutators/example.py b/examples/custom_mutators/example.py
new file mode 100644
index 00000000..a68f2ee5
--- /dev/null
+++ b/examples/custom_mutators/example.py
@@ -0,0 +1,122 @@
+#!/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)
+
+
+def fuzz(buf, add_buf, max_size):
+ '''
+ 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.
+
+ @type max_size: int
+ @param max_size: Maximum size of the mutated output. The mutation must not
+ produce data larger than max_size.
+
+ @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
+#
+# def pre_save(buf):
+# '''
+# Called just before the execution to write the test case in the format
+# expected by the target
+#
+# @type buf: bytearray
+# @param buf: The buffer containing the test case to be executed
+#
+# @rtype: bytearray
+# @return: The buffer containing the test case after
+# '''
+# return buf
+#