about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--GNUmakefile6
-rw-r--r--docs/Changelog.md4
-rw-r--r--utils/afl_untracer/afl-untracer.c22
-rw-r--r--utils/argv_fuzzing/Makefile4
-rw-r--r--utils/argv_fuzzing/argv-fuzz-inl.h43
-rw-r--r--utils/argv_fuzzing/argv_fuzz_demo.c16
-rw-r--r--utils/argv_fuzzing/argv_fuzz_persistent_demo.c28
7 files changed, 113 insertions, 10 deletions
diff --git a/GNUmakefile b/GNUmakefile
index 6b55635f..43f96ffe 100644
--- a/GNUmakefile
+++ b/GNUmakefile
@@ -628,9 +628,9 @@ distrib: all
 	-$(MAKE) -j$(nproc) -f GNUmakefile.llvm
 ifneq "$(SYS)" "Darwin"
 	-$(MAKE) -f GNUmakefile.gcc_plugin
-endif
 	-$(MAKE) -C utils/libdislocator
 	-$(MAKE) -C utils/libtokencap
+endif
 	-$(MAKE) -C utils/afl_network_proxy
 	-$(MAKE) -C utils/socket_fuzzing
 	-$(MAKE) -C utils/argv_fuzzing
@@ -659,8 +659,10 @@ endif
 
 .PHONY: binary-only
 binary-only: test_shm test_python ready $(PROGS)
+ifneq "$(SYS)" "Darwin"
 	-$(MAKE) -C utils/libdislocator
 	-$(MAKE) -C utils/libtokencap
+#endif
 	-$(MAKE) -C utils/afl_network_proxy
 	-$(MAKE) -C utils/socket_fuzzing
 	-$(MAKE) -C utils/argv_fuzzing
@@ -717,9 +719,9 @@ source-only: all
 	-$(MAKE) -j$(nproc) -f GNUmakefile.llvm
 ifneq "$(SYS)" "Darwin"
 	-$(MAKE) -f GNUmakefile.gcc_plugin
-endif
 	-$(MAKE) -C utils/libdislocator
 	-$(MAKE) -C utils/libtokencap
+endif
 	# -$(MAKE) -C utils/plot_ui
 ifeq "$(SYS)" "Linux"
 ifndef NO_NYX
diff --git a/docs/Changelog.md b/docs/Changelog.md
index 4df47645..6bfb314d 100644
--- a/docs/Changelog.md
+++ b/docs/Changelog.md
@@ -4,6 +4,10 @@
   release of the tool. See README.md for the general instruction manual.
 
 ### Version ++4.05a (dev)
+  - MacOS: libdislocator, libtokencap etc. do not work with modern
+    MacOS anymore, but could be patched to work, see this issue if you
+    want to make the effort and send a PR:
+    https://github.com/AFLplusplus/AFLplusplus/issues/1594
   - afl-fuzz:
     - added afl_custom_fuzz_send custom mutator feature. Now your can
       send fuzz data to the target as you need, e.g. via IPC.
diff --git a/utils/afl_untracer/afl-untracer.c b/utils/afl_untracer/afl-untracer.c
index ed7047a4..6bee067c 100644
--- a/utils/afl_untracer/afl-untracer.c
+++ b/utils/afl_untracer/afl-untracer.c
@@ -156,7 +156,7 @@ void read_library_information(void) {
         *e = 0;
         if (n[strlen(n) - 1] == '\n') n[strlen(n) - 1] = 0;
 
-        liblist[liblist_cnt].name = strdup(n);
+        liblist[liblist_cnt].name = (u8 *)strdup((char *)n);
         liblist[liblist_cnt].addr_start = strtoull(b, NULL, 16);
         liblist[liblist_cnt].addr_end = strtoull(m, NULL, 16);
         if (debug)
@@ -210,16 +210,16 @@ void read_library_information(void) {
         !(region->kve_protection & KVME_PROT_EXEC)) {
 
       liblist[liblist_cnt].name =
-          region->kve_path[0] != '\0' ? strdup(region->kve_path) : 0;
+          region->kve_path[0] != '\0' ? (u8 *)strdup(region->kve_path) : 0;
       liblist[liblist_cnt].addr_start = region->kve_start;
       liblist[liblist_cnt].addr_end = region->kve_end;
 
       if (debug) {
 
-        fprintf(stderr, "%s:%x (%lx-%lx)\n", liblist[liblist_cnt].name,
-                liblist[liblist_cnt].addr_end - liblist[liblist_cnt].addr_start,
-                liblist[liblist_cnt].addr_start,
-                liblist[liblist_cnt].addr_end - 1);
+        fprintf(stderr, "%s:%lx (%lx-%lx)\n", liblist[liblist_cnt].name,
+                (unsigned long)(liblist[liblist_cnt].addr_end - liblist[liblist_cnt].addr_start),
+                (unsigned long)liblist[liblist_cnt].addr_start,
+                (unsigned long)(liblist[liblist_cnt].addr_end - 1));
 
       }
 
@@ -488,6 +488,12 @@ void setup_trap_instrumentation(void) {
   uint32_t bitmap_index = 0;
 #endif
 
+#if defined(__FreeBSD__) && __FreeBSD_version >= 1301000
+  // We try to allow W/X pages despite kern.elf32/64.allow_wx system settings
+  int allow_wx = PROC_WX_MAPPINGS_PERMIT;
+  (void)procctl(P_PID, 0, PROC_WXMAP_CTL, &allow_wx);
+#endif
+
   while ((nread = getline(&line, &len, patches)) != -1) {
 
     char *end = line + len;
@@ -699,7 +705,7 @@ int main(int argc, char *argv[]) {
   if (argc > 1) {
 
     use_stdin = 0;
-    inputfile = argv[1];
+    inputfile = (u8 *)argv[1];
 
   }
 
@@ -732,7 +738,7 @@ int main(int argc, char *argv[]) {
     if (pid) {
 
       u32 status;
-      if (waitpid(pid, &status, 0) < 0) exit(1);
+      if (waitpid(pid, (int *)&status, 0) < 0) exit(1);
       /* report the test case is done and wait for the next */
       __afl_end_testcase(status);
 
diff --git a/utils/argv_fuzzing/Makefile b/utils/argv_fuzzing/Makefile
index 183f6bf8..dfdd0f8e 100644
--- a/utils/argv_fuzzing/Makefile
+++ b/utils/argv_fuzzing/Makefile
@@ -56,3 +56,7 @@ install: argvfuzz32.so argvfuzz64.so
 
 clean:
 	rm -f argvfuzz32.so argvfuzz64.so
+
+demo:
+	../../afl-clang-fast -o argv_fuzz_demo argv_fuzz.c
+	../../afl-clang-fast -o argv_fuzz_persistent_demo argv_fuzz_persistent_demo.c
\ No newline at end of file
diff --git a/utils/argv_fuzzing/argv-fuzz-inl.h b/utils/argv_fuzzing/argv-fuzz-inl.h
index ec22c53b..d3440799 100644
--- a/utils/argv_fuzzing/argv-fuzz-inl.h
+++ b/utils/argv_fuzzing/argv-fuzz-inl.h
@@ -29,6 +29,10 @@
    If you would like to always preserve argv[0], use this instead:
    AFL_INIT_SET0("prog_name");
 
+  To enable persistent fuzzing, use the AFL_INIT_ARGV_PERSISTENT macro with
+  buf as argument, or use AFL_INIT_SET0_PERSISTENT("prog_name", buf)
+  to preserver argv[0]. buf should be defined as:
+  unsigned char *buf = __AFL_FUZZ_TESTCASE_BUF;
 */
 
 #ifndef _HAVE_ARGV_FUZZ_INL
@@ -53,6 +57,20 @@
                                  \
   } while (0)
 
+#define AFL_INIT_ARGV_PERSISTENT(persistent_buff)                \
+    do {                                                         \
+        argv = afl_init_argv_persistent(&argc, persistent_buff); \
+     } while (0)
+
+#define AFL_INIT_SET0_PERSISTENT(_p, persistent_buff)            \
+  do {                                                           \
+                                                                 \
+    argv = afl_init_argv_persistent(&argc, persistent_buff);     \
+    argv[0] = (_p);                                              \
+    if (!argc) argc = 1;                                         \
+                                                                 \
+  } while (0)
+
 #define MAX_CMDLINE_LEN 100000
 #define MAX_CMDLINE_PAR 50000
 
@@ -87,6 +105,31 @@ static char **afl_init_argv(int *argc) {
 
 }
 
+static char **afl_init_argv_persistent(int *argc, unsigned char *persistent_buff) {
+
+  static char *ret[MAX_CMDLINE_PAR];
+
+  unsigned char *ptr = persistent_buff;
+  int   rc = 0;
+
+  while (*ptr && rc < MAX_CMDLINE_PAR) {
+
+    ret[rc] = (char *)ptr;
+    if (ret[rc][0] == 0x02 && !ret[rc][1]) ret[rc]++;
+    rc++;
+
+    while (*ptr)
+      ptr++;
+    ptr++;
+
+  }
+
+  *argc = rc;
+
+  return ret;
+
+}
+
 #undef MAX_CMDLINE_LEN
 #undef MAX_CMDLINE_PAR
 
diff --git a/utils/argv_fuzzing/argv_fuzz_demo.c b/utils/argv_fuzzing/argv_fuzz_demo.c
new file mode 100644
index 00000000..f4375316
--- /dev/null
+++ b/utils/argv_fuzzing/argv_fuzz_demo.c
@@ -0,0 +1,16 @@
+#include <stdio.h>
+#include <string.h>
+#include "argv-fuzz-inl.h"
+
+int main(int argc, char **argv) {
+AFL_INIT_ARGV();
+  if (argc > 1 && strcmp(argv[1], "XYZ") == 0) {
+    if (strcmp(argv[2], "TEST2") == 0) {
+      abort();
+    }
+  } else {
+    printf("Bad number of arguments!\n");
+  }
+
+  return 0;
+}
\ No newline at end of file
diff --git a/utils/argv_fuzzing/argv_fuzz_persistent_demo.c b/utils/argv_fuzzing/argv_fuzz_persistent_demo.c
new file mode 100644
index 00000000..5ecda22b
--- /dev/null
+++ b/utils/argv_fuzzing/argv_fuzz_persistent_demo.c
@@ -0,0 +1,28 @@
+#include <stdio.h>
+#include <string.h>
+#include "argv-fuzz-inl.h"
+
+__AFL_FUZZ_INIT();
+
+int main(int argc, char **argv) {
+#ifdef __AFL_HAVE_MANUAL_CONTROL
+  __AFL_INIT();
+#endif
+  unsigned char *buf = __AFL_FUZZ_TESTCASE_BUF;
+
+  while (__AFL_LOOP(100000)) {
+    int len = __AFL_FUZZ_TESTCASE_LEN;
+
+    if (len < 8) continue;
+
+    AFL_INIT_ARGV_P(buf);
+
+    if (argc > 1 && strcmp(argv[1], "XYZ") == 0) {
+      if (strcmp(argv[2], "TEST2") == 0) { abort(); }
+    } else {
+      printf("Bad number of arguments!\n");
+    }
+  }
+
+  return 0;
+}
\ No newline at end of file