aboutsummaryrefslogtreecommitdiff
path: root/custom_mutators/aflpp_tritondse
diff options
context:
space:
mode:
authorvan Hauser <vh@thc.org>2023-05-23 15:16:27 +0300
committerGitHub <noreply@github.com>2023-05-23 15:16:27 +0300
commit8e1df8e53d359f2858168a276c46d1113d4102f2 (patch)
treed319dd82c99e1abf16131c9893a5106bf9b562e0 /custom_mutators/aflpp_tritondse
parentc4b1566ba35c697cda7822bd0cf30e2e3eeee0c7 (diff)
parent8985524d3a7e9991ededcd2e7f01a112b3107871 (diff)
downloadAFLplusplus-8e1df8e53d359f2858168a276c46d1113d4102f2.tar.gz
Merge pull request #1740 from AFLplusplus/dev
push to stable
Diffstat (limited to 'custom_mutators/aflpp_tritondse')
-rw-r--r--custom_mutators/aflpp_tritondse/README.md9
-rw-r--r--custom_mutators/aflpp_tritondse/aflpp_tritondse.py78
2 files changed, 82 insertions, 5 deletions
diff --git a/custom_mutators/aflpp_tritondse/README.md b/custom_mutators/aflpp_tritondse/README.md
index 8a5dd02b..033655d2 100644
--- a/custom_mutators/aflpp_tritondse/README.md
+++ b/custom_mutators/aflpp_tritondse/README.md
@@ -10,8 +10,13 @@
../../afl-cc -o ../../test-instr ../../test-instr.c
mkdir -p in
echo aaaa > in/in
-TRITON_DSE_TARGET=../../test-instr AFL_CUSTOM_MUTATOR_ONLY=1 AFL_SYNC_TIME=1 AFL_PYTHON_MODULE=aflpp_tritondse PYTHONPATH=. ../../afl-fuzz -i in -o out -- ../../test-instr
+AFL_DISABLE_TRIM=1 AFL_CUSTOM_MUTATOR_ONLY=1 AFL_SYNC_TIME=1 AFL_PYTHON_MODULE=aflpp_tritondse PYTHONPATH=. ../../afl-fuzz -i in -o out -- ../../test-instr
```
Note that this custom mutator works differently, new finds are synced
-after 10-60 seconds to the fuzzing instance.
+after 10-60 seconds to the fuzzing instance. This is necessary because only
+C/C++ custom mutators have access to the internal AFL++ state.
+
+Note that you should run first with `AFL_DEBUG` for 5-10 minutes and see if
+all important libraries and syscalls are hooked (look at `WARNING` and `CRITICAL`
+output during the run, best use with `AFL_NO_UI=1`)
diff --git a/custom_mutators/aflpp_tritondse/aflpp_tritondse.py b/custom_mutators/aflpp_tritondse/aflpp_tritondse.py
index e0219f0b..58b506b6 100644
--- a/custom_mutators/aflpp_tritondse/aflpp_tritondse.py
+++ b/custom_mutators/aflpp_tritondse/aflpp_tritondse.py
@@ -22,14 +22,17 @@ config = None
dse = None
cycle = 0
count = 0
+finding = 0
hashes = set()
format = SeedFormat.RAW
def pre_exec_hook(se: SymbolicExecutor, state: ProcessState):
global count
global hashes
+ global finding
if se.seed.hash not in hashes:
hashes.add(se.seed.hash)
+ finding = 1
filename = out_path + "/id:" + f"{count:06}" + "," + se.seed.hash
if not os.path.exists(filename):
if is_debug:
@@ -47,6 +50,59 @@ def pre_exec_hook(se: SymbolicExecutor, state: ProcessState):
# file.write(se.seed.content)
+#def rtn_open(se: SymbolicExecutor, pstate: ProcessState, pc):
+# """
+# The open behavior.
+# """
+# logging.debug('open hooked')
+#
+# # Get arguments
+# arg0 = pstate.get_argument_value(0) # const char *pathname
+# flags = pstate.get_argument_value(1) # int flags
+# mode = pstate.get_argument_value(2) # int mode
+# arg0s = pstate.memory.read_string(arg0)
+#
+# # Concretize the whole path name
+# pstate.concretize_memory_bytes(arg0, len(arg0s)+1) # Concretize the whole string + \0
+#
+# # We use flags as concrete value
+# pstate.concretize_argument(1)
+#
+# # Use the flags to open the file in the write mode.
+# mode = ""
+# if (flags & 0xFF) == 0x00: # O_RDONLY
+# mode = "r"
+# elif (flags & 0xFF) == 0x01: # O_WRONLY
+# mode = "w"
+# elif (flags & 0xFF) == 0x02: # O_RDWR
+# mode = "r+"
+#
+# if (flags & 0x0100): # O_CREAT
+# mode += "x"
+# if (flags & 0x0200): # O_APPEND
+# mode = "a" # replace completely value
+#
+# if se.seed.is_file_defined(arg0s) and "r" in mode: # input file and opened in reading
+# logging.info(f"opening an input file: {arg0s}")
+# # Program is opening an input
+# data = se.seed.get_file_input(arg0s)
+# filedesc = pstate.create_file_descriptor(arg0s, io.BytesIO(data))
+# fd = filedesc.id
+# else:
+# # Try to open it as a regular file
+# try:
+# fd = open(arg0s, mode) # use the mode here
+# filedesc = pstate.create_file_descriptor(arg0s, fd)
+# fd = filedesc.id
+# except Exception as e:
+# logging.debug(f"Failed to open {arg0s} {e}")
+# fd = pstate.minus_one
+#
+# pstate.write_register("rax", fd) # write the return value
+# pstate.cpu.program_counter = pstate.pop_stack_value() # pop the return value
+# se.skip_instruction() # skip the current instruction so that the engine go straight fetching the next instruction
+
+
def init(seed):
global config
global dse
@@ -64,6 +120,10 @@ def init(seed):
is_debug = True
except KeyError:
pass
+ if is_debug:
+ logging.basicConfig(level=logging.WARNING)
+ else:
+ logging.basicConfig(level=logging.CRITICAL)
try:
foo = os.environ['AFL_CUSTOM_INFO_OUT']
out_path = foo + '/../tritondse/queue'
@@ -115,10 +175,16 @@ def init(seed):
dse = SymbolicExplorator(config, prog)
# Add callbacks.
dse.callback_manager.register_pre_execution_callback(pre_exec_hook)
+ #dse.callback_manager.register_function_callback("open", rtn_open)
-#def fuzz(buf, add_buf, max_size):
-# return b""
+def fuzz(buf, add_buf, max_size):
+ global finding
+ finding = 1
+ while finding == 1:
+ finding = 0
+ dse.step()
+ return b""
def queue_new_entry(filename_new_queue, filename_orig_queue):
@@ -141,8 +207,14 @@ def queue_new_entry(filename_new_queue, filename_orig_queue):
dse.add_input_seed(seed)
# Start exploration!
#dse.step()
- dse.explore()
+ #dse.explore()
pass
+
+# we simulate just doing one single fuzz in the custom mutator
+def fuzz_count(buf):
+ return 1
+
+
def splice_optout():
pass