X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=docs%2FLibFuzzer.rst;h=84adff3616f7da2cba8591095b9986ab7a54c664;hb=7ecd92d75cda45668b6b5fdbcdd2142826514e66;hp=74845c546369e307213e018ed70ce166ccfeef5d;hpb=e8d7ae6209f89e7ad2f5b22f48960a1def2c69c1;p=oota-llvm.git diff --git a/docs/LibFuzzer.rst b/docs/LibFuzzer.rst index 74845c54636..84adff3616f 100644 --- a/docs/LibFuzzer.rst +++ b/docs/LibFuzzer.rst @@ -63,7 +63,6 @@ The most important flags are:: timeout 1200 Timeout in seconds (if positive). If one unit runs more than this number of seconds the process will abort. max_total_time 0 If positive, indicates the maximal total time in seconds to run the fuzzer. help 0 Print help. - save_minimized_corpus 0 If 1, the minimized corpus is saved into the first input directory. Example: ./fuzzer -save_minimized_corpus=1 NEW_EMPTY_DIR OLD_CORPUS merge 0 If 1, the 2-nd, 3-rd, etc corpora will be merged into the 1-st corpus. Only interesting units will be taken. jobs 0 Number of jobs to run. If jobs >= 1 we spawn this number of jobs in separate worker processes with stdout/stderr redirected to fuzz-JOB.log. workers 0 Number of simultaneous worker processes to run the jobs. If zero, "min(jobs,NumberOfCpuCores()/2)" is used. @@ -86,7 +85,9 @@ Toy example A simple function that does something interesting if it receives the input "HI!":: cat << EOF >> test_fuzzer.cc - extern "C" int LLVMFuzzerTestOneInput(const unsigned char *data, unsigned long size) { + #include + #include + extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { if (size > 0 && data[0] == 'H') if (size > 1 && data[1] == 'I') if (size > 2 && data[2] == '!') @@ -122,8 +123,9 @@ Here we show how to use lib/Fuzzer on something real, yet simple: pcre2_:: # Build the actual function that does something interesting with PCRE2. cat << EOF > pcre_fuzzer.cc #include + #include #include "pcre2posix.h" - extern "C" int LLVMFuzzerTestOneInput(const unsigned char *data, size_t size) { + extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { if (size < 1) return 0; char *str = new char[size+1]; memcpy(str, data, size); @@ -221,6 +223,9 @@ to find Heartbleed with LibFuzzer:: #include #include #include + #include + #include + SSL_CTX *sctx; int Init() { SSL_library_init(); @@ -232,7 +237,7 @@ to find Heartbleed with LibFuzzer:: assert (SSL_CTX_use_PrivateKey_file(sctx, "server.key", SSL_FILETYPE_PEM)); return 0; } - extern "C" int LLVMFuzzerTestOneInput(unsigned char *Data, size_t Size) { + extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { static int unused = Init(); SSL *server = SSL_new(sctx); BIO *sinbio = BIO_new(BIO_s_mem()); @@ -261,6 +266,9 @@ Voila:: #1 0x4db504 in tls1_process_heartbeat openssl-1.0.1f/ssl/t1_lib.c:2586:3 #2 0x580be3 in ssl3_read_bytes openssl-1.0.1f/ssl/s3_pkt.c:1092:4 +Note: a `similar fuzzer `_ +is now a part of the boringssl source tree. + Advanced features ================= @@ -474,6 +482,8 @@ Trophies * `Python `_ +* OpenSSL/BoringSSL: `[1] `_ + * `Libxml2 `_