Changeset 1623


Ignore:
Timestamp:
Jan 8, 2007, 6:50:34 PM (14 years ago)
Author:
Sam Hocevar
Message:
  • Implemented -M/--md5 flag.
Location:
zzuf/trunk
Files:
2 added
3 edited

Legend:

Unmodified
Added
Removed
  • zzuf/trunk/doc/zzuf.1

    r1620 r1623  
    33zzuf \- multiple purpose fuzzer
    44.SH SYNOPSIS
    5 \fBzzuf\fR [\fB\-cdinqS\fR] [\fB\-r\fR \fIratio\fR] [\fB\-s\fR \fIseed\fR | \fB\-s\fR \fIstart:stop\fR]
    6 .br
    7                [\fB\-F\fR \fIforks\fR] [\fB\-C\fR \fIcrashes\fR] [\fB\-B\fR \fIbytes\fR] [\fB\-T\fR \fIseconds\fR]
    8 .br
    9                [\fB\-P\fR \fIprotect\fR] [\fB\-R\fR \fIrefuse\fR]
    10 .br
    11                [\fB\-I\fR \fIinclude\fR] [\fB\-E\fR \fIexclude\fR] [\fIPROGRAM\fR [\fIARGS\fR]...]
     5\fBzzuf\fR [\fB\-cdiMnqS\fR] [\fB\-r\fR \fIratio\fR] [\fB\-s\fR \fIseed\fR | \fB\-s\fR \fIstart:stop\fR]
     6.br
     7                [\fB\-F\fR \fIforks\fR] [\fB\-C\fR \fIcrashes\fR] [\fB\-B\fR \fIbytes\fR] [\fB\-T\fR \fIseconds\fR]
     8.br
     9                [\fB\-P\fR \fIprotect\fR] [\fB\-R\fR \fIrefuse\fR]
     10.br
     11                [\fB\-I\fR \fIinclude\fR] [\fB\-E\fR \fIexclude\fR] [\fIPROGRAM\fR [\fIARGS\fR]...]
    1212.br
    1313\fBzzuf \-h\fR | \fB\-\-help\fR
     
    9494Multiple \fB\-I\fR flags can be specified, in which case files matching any one
    9595of the regular expressions will be fuzzed. See also the \fB\-c\fR flag.
     96.TP
     97\fB\-M\fR, \fB\-\-md5\fR
     98Instead of displaying the program's output, just print the MD5 digest of that
     99output.
    96100.TP
    97101\fB\-n\fR, \fB\-\-network\fR
  • zzuf/trunk/src/Makefile.am

    r1615 r1623  
    22
    33bin_PROGRAMS = zzuf
    4 zzuf_SOURCES = zzuf.c $(COMMON)
     4zzuf_SOURCES = zzuf.c $(COMMON) md5.c md5.h
    55zzuf_CFLAGS = -DLIBDIR=\"$(libdir)/zzuf\"
    66
  • zzuf/trunk/src/zzuf.c

    r1616 r1623  
    4242#include "fd.h"
    4343#include "fuzz.h"
     44#include "md5.h"
    4445
    4546static void spawn_child(char **);
     
    7071    int bytes, seed;
    7172    time_t date;
     73    struct md5 *ctx;
    7274} *child_list;
    7375static int maxforks = 1, child_count = 0, maxcrashes = 1, crashes = 0;
     
    7779static int quiet = 0;
    7880static int maxbytes = -1;
     81static int md5 = 0;
    7982static double maxtime = -1.0;
    8083
     
    115118            { "stdin",       0, NULL, 'i' },
    116119            { "include",     1, NULL, 'I' },
     120            { "md5",         0, NULL, 'M' },
    117121            { "network",     0, NULL, 'n' },
    118122            { "protect",     1, NULL, 'P' },
     
    126130            { "version",     0, NULL, 'v' },
    127131        };
    128         int c = getopt_long(argc, argv, "B:cC:dE:F:iI:nP:qr:R:s:ST:hv",
     132        int c = getopt_long(argc, argv, "B:cC:dE:F:iI:MnP:qr:R:s:ST:hv",
    129133                            long_options, &option_index);
    130134#   else
    131135#       define MOREINFO "Try `%s -h' for more information.\n"
    132         int c = getopt(argc, argv, "B:cC:dE:F:iI:nP:qr:R:s:ST:hv");
     136        int c = getopt(argc, argv, "B:cC:dE:F:iI:MnP:qr:R:s:ST:hv");
    133137#   endif
    134138        if(c == -1)
     
    172176                return EXIT_FAILURE;
    173177            }
     178            break;
     179        case 'M': /* --md5 */
     180            md5 = 1;
    174181            break;
    175182        case 'n': /* --network */
     
    220227    if(optind >= argc)
    221228    {
     229        uint8_t md5sum[16];
     230        struct md5 *ctx = NULL;
     231
     232        if(md5)
     233            ctx = _zz_md5_init();
     234
    222235        if(endseed != seed + 1)
    223236        {
     
    246259            _zz_addpos(0, ret);
    247260
    248             fwrite(buf, 1, ret, stdout);
     261            if(md5)
     262                _zz_md5_add(ctx, buf, ret);
     263            else
     264                fwrite(buf, 1, ret, stdout);
     265        }
     266
     267        if(md5)
     268        {
     269            _zz_md5_fini(md5sum, ctx);
     270            fprintf(stdout, "zzuf[seed=%i]: %.02x%.02x%.02x%.02x%.02x%.02x"
     271                    "%.02x%.02x%.02x%.02x%.02x%.02x%.02x%.02x%.02x%.02x\n",
     272                    seed, md5sum[0], md5sum[1], md5sum[2], md5sum[3],
     273                    md5sum[4], md5sum[5], md5sum[6], md5sum[7],
     274                    md5sum[8], md5sum[9], md5sum[10], md5sum[11],
     275                    md5sum[12], md5sum[13], md5sum[14], md5sum[15]);
     276            fflush(stdout);
    249277        }
    250278
     
    370398    int i, j;
    371399
    372     /* Find an empty slot */
     400    /* Find the empty slot */
    373401    for(i = 0; i < maxforks; i++)
    374402        if(child_list[i].status == STATUS_FREE)
     
    409437                exit(EXIT_FAILURE);
    410438            }
    411             break;
    412         default:
    413             /* We’re the parent, acknowledge spawn */
    414             child_list[i].date = time(NULL);
    415             child_list[i].pid = pid;
    416             for(j = 0; j < 3; j++)
    417             {
    418                 close(fd[j][1]);
    419                 child_list[i].fd[j] = fd[j][0];
    420             }
    421             child_list[i].bytes = 0;
    422             child_list[i].seed = seed;
    423             child_list[i].status = STATUS_RUNNING;
    424             child_count++;
    425             seed++;
    426             break;
    427     }
     439            return;
     440    }
     441
     442    /* We’re the parent, acknowledge spawn */
     443    child_list[i].date = time(NULL);
     444    child_list[i].pid = pid;
     445    for(j = 0; j < 3; j++)
     446    {
     447        close(fd[j][1]);
     448        child_list[i].fd[j] = fd[j][0];
     449    }
     450    child_list[i].bytes = 0;
     451    child_list[i].seed = seed;
     452    child_list[i].status = STATUS_RUNNING;
     453    if(md5)
     454        child_list[i].ctx = _zz_md5_init();
     455    child_count++;
     456    seed++;
    428457}
    429458
     
    474503    for(i = 0; i < maxforks; i++)
    475504    {
     505        uint8_t md5sum[16];
    476506        int status;
    477507        pid_t pid;
     
    503533                close(child_list[i].fd[j]);
    504534
     535        if(md5)
     536        {
     537            _zz_md5_fini(md5sum, child_list[i].ctx);
     538            fprintf(stdout, "zzuf[seed=%i]: %.02x%.02x%.02x%.02x%.02x%.02x"
     539                    "%.02x%.02x%.02x%.02x%.02x%.02x%.02x%.02x%.02x%.02x\n",
     540                    child_list[i].seed, md5sum[0], md5sum[1], md5sum[2],
     541                    md5sum[3], md5sum[4], md5sum[5], md5sum[6], md5sum[7],
     542                    md5sum[8], md5sum[9], md5sum[10], md5sum[11], md5sum[12],
     543                    md5sum[13], md5sum[14], md5sum[15]);
     544        }
    505545        child_list[i].status = STATUS_FREE;
    506546        child_count--;
     
    538578    for(i = 0, j = 0; i < maxforks; i += (j == 2), j = (j + 1) % 3)
    539579    {
    540         char buf[BUFSIZ];
     580        uint8_t buf[BUFSIZ];
    541581
    542582        if(child_list[i].status != STATUS_RUNNING)
     
    552592            if(j != 0)
    553593                child_list[i].bytes += ret;
    554             if(!quiet || j == 0)
     594
     595            if(md5 && j > 0)
     596                _zz_md5_add(child_list[i].ctx, buf, ret);
     597            else if(!quiet || j == 0)
    555598                write((j < 2) ? STDERR_FILENO : STDOUT_FILENO, buf, ret);
    556599        }
     
    607650static void usage(void)
    608651{
    609     printf("Usage: zzuf [-cdinqS] [-r ratio] [-s seed | -s start:stop]\n");
    610     printf("                      [-F forks] [-C crashes] [-B bytes] [-T seconds]\n");
    611     printf("                      [-P protect] [-R refuse]\n");
    612     printf("                      [-I include] [-E exclude] [PROGRAM [ARGS]...]\n");
     652    printf("Usage: zzuf [-cdiMnqS] [-r ratio] [-s seed | -s start:stop]\n");
     653    printf("                       [-F forks] [-C crashes] [-B bytes] [-T seconds]\n");
     654    printf("                       [-P protect] [-R refuse]\n");
     655    printf("                       [-I include] [-E exclude] [PROGRAM [ARGS]...]\n");
    613656#   ifdef HAVE_GETOPT_LONG
    614657    printf("       zzuf -h | --help\n");
     
    630673    printf("  -i, --stdin              fuzz standard input\n");
    631674    printf("  -I, --include <regex>    only fuzz files matching <regex>\n");
     675    printf("  -M, --md5                compute the output's MD5 hash\n");
    632676    printf("  -n, --network            fuzz network input\n");
    633677    printf("  -P, --protect <list>     protect bytes and characters in <list>\n");
     
    650694    printf("  -i               fuzz standard input\n");
    651695    printf("  -I <regex>       only fuzz files matching <regex>\n");
     696    printf("  -M               compute the output's MD5 hash\n");
    652697    printf("  -n               fuzz network input\n");
    653698    printf("  -P <list>        protect bytes and characters in <list>\n");
Note: See TracChangeset for help on using the changeset viewer.