/* american fuzzy lop++ - persistent mode example -------------------------------------------- Originally written by Michal Zalewski Copyright 2015 Google Inc. All rights reserved. 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 This file demonstrates the high-performance "persistent mode" that may be suitable for fuzzing certain fast and well-behaved libraries, provided that they are stateless or that their internal state can be easily reset across runs. To make this work, the library and this shim need to be compiled in LLVM mode using afl-clang-fast (other compiler wrappers will *not* work). */ #include #include #include #include #include __AFL_FUZZ_INIT(); /* Main entry point. */ int main(int argc, char **argv) { ssize_t len; /* how much input did we read? */ unsigned char *buf; /* test case buffer pointer */ /* The number passed to __AFL_LOOP() controls the maximum number of iterations before the loop exits and the program is allowed to terminate normally. This limits the impact of accidental memory leaks and similar hiccups. */ __AFL_INIT(); buf = __AFL_FUZZ_TESTCASE_BUF; while (__AFL_LOOP(1000)) { // increase if you have good stability len = __AFL_FUZZ_TESTCASE_LEN; /* do we have enough data? */ if (len < 8) continue; if (buf[0] == 'f') { printf("one\n"); if (buf[1] == 'o') { printf("two\n"); if (buf[2] == 'o') { printf("three\n"); if (buf[3] == '!') { printf("four\n"); if (buf[4] == '!') { printf("five\n"); if (buf[6] == '!') { printf("six\n"); abort(); } } } } } } /*** END PLACEHOLDER CODE ***/ } /* Once the loop is exited, terminate normally - AFL will restart the process when this happens, with a clean slate when it comes to allocated memory, leftover file descriptors, etc. */ return 0; }