commit:     67f3ba64c91b5e1ac9fbbd0bc039fb8ca653cae1
Author:     Mike Frysinger <vapier <AT> gentoo <DOT> org>
AuthorDate: Sat Mar  4 23:46:33 2017 +0000
Commit:     Mike Frysinger <vapier <AT> gentoo <DOT> org>
CommitDate: Fri Apr 16 19:22:01 2021 +0000
URL:        https://gitweb.gentoo.org/proj/pax-utils.git/commit/?id=67f3ba64

dumpelf: add libFuzzer support

Now you can build dumpelf with libFuzzer and beat the hell out of it.

Signed-off-by: Mike Frysinger <vapier <AT> gentoo.org>

 Makefile  |  2 +-
 dumpelf.c | 43 ++++++++++++++++++++++++++++++++++---------
 2 files changed, 35 insertions(+), 10 deletions(-)

diff --git a/Makefile b/Makefile
index 8e7b183..9a2c07c 100644
--- a/Makefile
+++ b/Makefile
@@ -115,7 +115,7 @@ afl-fuzz: clean
                "afl-fuzz -t 100 -i tests/fuzz/small/ -o findings/ ./scanelf -s 
'*' -axetrnibSDIYZB @@"
 
 # Not all objects support libfuzzer.
-LIBFUZZER_TARGETS =
+LIBFUZZER_TARGETS = dumpelf
 LIBFUZZER_FLAGS = \
        -fsanitize=fuzzer \
        -fsanitize-coverage=edge

diff --git a/dumpelf.c b/dumpelf.c
index bc634f0..342251f 100644
--- a/dumpelf.c
+++ b/dumpelf.c
@@ -11,7 +11,6 @@ const char argv0[] = "dumpelf";
 #include "paxinc.h"
 
 /* prototypes */
-static void dumpelf(const char *filename, size_t file_cnt);
 static void dump_ehdr(elfobj *elf, const void *ehdr);
 static void dump_phdr(elfobj *elf, const void *phdr, size_t phdr_cnt);
 static void dump_shdr(elfobj *elf, const void *shdr, size_t shdr_cnt, const 
char *section_name);
@@ -31,15 +30,10 @@ static char be_verbose = 0;
 static const void *phdr_dynamic_void;
 
 /* dump all internal elf info */
-static void dumpelf(const char *filename, size_t file_cnt)
+static void dumpelf(elfobj *elf, size_t file_cnt)
 {
-       elfobj *elf;
        size_t i, b;
 
-       /* verify this is real ELF */
-       if ((elf = readelf(filename)) == NULL)
-               return;
-
        phdr_dynamic_void = NULL;
 
        printf("#include <elf.h>\n");
@@ -50,7 +44,7 @@ static void dumpelf(const char *filename, size_t file_cnt)
                " * ELF dump of '%s'\n"
                " *     %ji (0x%jX) bytes\n"
                " */\n\n",
-               filename, elf->len, elf->len);
+               elf->filename, elf->len, elf->len);
 
        /* setup the struct to namespace this elf */
 #define MAKE_STRUCT(B) \
@@ -148,6 +142,17 @@ static void dumpelf(const char *filename, size_t file_cnt)
                printf(" /* no dynamic tags ! */ ");
        }
        printf("};\n");
+}
+
+static void dumpelf_file(const char *filename, size_t file_cnt)
+{
+       elfobj *elf = readelf(filename);
+
+       /* verify this is real ELF */
+       if (elf == NULL)
+               return;
+
+       dumpelf(elf, file_cnt);
 
        /* get out of here */
        unreadelf(elf);
@@ -570,10 +575,29 @@ static void parseargs(int argc, char *argv[])
        size_t file_cnt = 0;
 
        while (optind < argc)
-               dumpelf(argv[optind++], file_cnt++);
+               dumpelf_file(argv[optind++], file_cnt++);
        }
 }
 
+#if PAX_UTILS_LIBFUZZ
+int LLVMFuzzerInitialize(int *argc, char ***argv)
+{
+       (void)argc;
+       (void)argv;
+       (void)parseargs;
+       security_init(false);
+       return 0;
+}
+
+int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
+{
+       elfobj *elf = readelf_buffer("libFuzzer", data, size);
+       if (elf == NULL)
+               return 0;
+       dumpelf(elf, 0);
+       return 0;
+}
+#else
 int main(int argc, char *argv[])
 {
        security_init(false);
@@ -582,3 +606,4 @@ int main(int argc, char *argv[])
        parseargs(argc, argv);
        return EXIT_SUCCESS;
 }
+#endif

Reply via email to