| 1 | .TH zzuf 1 "2010-01-06" "zzuf @PACKAGE_VERSION@" |
|---|
| 2 | .SH NAME |
|---|
| 3 | zzuf \- multiple purpose fuzzer |
|---|
| 4 | .SH SYNOPSIS |
|---|
| 5 | \fBzzuf\fR [\fB\-AcdimnqSvx\fR] [\fB\-s\fR \fIseed\fR|\fB\-s\fR \fIstart:stop\fR] [\fB\-r\fR \fIratio\fR|\fB\-r\fR \fImin:max\fR] |
|---|
| 6 | .br |
|---|
| 7 | [\fB\-f\fR \fIfuzzing\fR] [\fB\-D\fR \fIdelay\fR] [\fB\-j\fR \fIjobs\fR] [\fB\-C\fR \fIcrashes\fR] [\fB\-B\fR \fIbytes\fR] |
|---|
| 8 | .br |
|---|
| 9 | [\fB\-t\fR \fIseconds\fR] [\fB\-T\fR \fIseconds\fR] [\fB\-M\fR \fImebibytes\fR] [\fB\-b\fR \fIranges\fR] [\fB\-p\fR \fIports\fR] |
|---|
| 10 | .br |
|---|
| 11 | [\fB\-P\fR \fIprotect\fR] [\fB\-R\fR \fIrefuse\fR] [\fB\-l\fR \fIlist\fR] [\fB\-I\fR \fIinclude\fR] [\fB\-E\fR \fIexclude\fR] |
|---|
| 12 | .br |
|---|
| 13 | [\fIPROGRAM\fR [\fIARGS\fR]...] |
|---|
| 14 | .br |
|---|
| 15 | \fBzzuf \-h\fR | \fB\-\-help\fR |
|---|
| 16 | .br |
|---|
| 17 | \fBzzuf \-V\fR | \fB\-\-version\fR |
|---|
| 18 | .SH DESCRIPTION |
|---|
| 19 | .PP |
|---|
| 20 | \fBzzuf\fR is a transparent application input fuzzer. It works by intercepting |
|---|
| 21 | file and network operations and changing random bits in the program's input. |
|---|
| 22 | \fBzzuf\fR's behaviour is deterministic, making it easy to reproduce bugs. |
|---|
| 23 | .SH USAGE |
|---|
| 24 | .PP |
|---|
| 25 | \fBzzuf\fR will run an application specified on its command line, one or |
|---|
| 26 | several times, with optional arguments, and will report the application's |
|---|
| 27 | relevant behaviour on the standard error channel, eg: |
|---|
| 28 | .PP |
|---|
| 29 | \fB zzuf cat /dev/zero\fR |
|---|
| 30 | .PP |
|---|
| 31 | Flags found after the application name are considered arguments for the |
|---|
| 32 | application, not for \fBzzuf\fR. For instance, \fB\-v\fR below is an |
|---|
| 33 | argument for \fBcat\fR: |
|---|
| 34 | .PP |
|---|
| 35 | \fB zzuf \-B 1000 cat \-v /dev/zero\fR |
|---|
| 36 | .PP |
|---|
| 37 | When no program is specified, \fBzzuf\fR simply fuzzes the standard input, as |
|---|
| 38 | if the \fBcat\fR utility had been called: |
|---|
| 39 | .PP |
|---|
| 40 | \fB zzuf < /dev/zero\fR |
|---|
| 41 | .SH OPTIONS |
|---|
| 42 | .TP |
|---|
| 43 | \fB\-A\fR, \fB\-\-autoinc\fR |
|---|
| 44 | Increment random seed each time a new file is opened. This is only required |
|---|
| 45 | if one instance of the application is expected to open the same file several |
|---|
| 46 | times and you want to test a different seed each time. |
|---|
| 47 | .TP |
|---|
| 48 | \fB\-b\fR, \fB\-\-bytes\fR=\fIranges\fR |
|---|
| 49 | Restrict fuzzing to bytes whose offsets in the file are within \fIranges\fR. |
|---|
| 50 | |
|---|
| 51 | Range values start at zero and are inclusive. Use dashes between range values |
|---|
| 52 | and commas between ranges. If the right-hand part of a range is ommited, it |
|---|
| 53 | means end of file. For instance, to restrict fuzzing to bytes 0, 3, 4, 5 and |
|---|
| 54 | all bytes after offset 31, use \(oq\fB\-b0,3\-5,31\-\fR\(cq. |
|---|
| 55 | |
|---|
| 56 | This option is useful to preserve file headers or corrupt only a specific |
|---|
| 57 | portion of a file. |
|---|
| 58 | .TP |
|---|
| 59 | \fB\-B\fR, \fB\-\-max\-bytes\fR=\fIn\fR |
|---|
| 60 | Automatically stop after \fIn\fR bytes have been output. |
|---|
| 61 | |
|---|
| 62 | This either terminates child processes that output more than \fIn\fR bytes |
|---|
| 63 | on the standard output and standard error channels, or stop reading from |
|---|
| 64 | standard input if no program is being fuzzed. |
|---|
| 65 | |
|---|
| 66 | This is useful to detect infinite loops. See also the \fB\-t\fR and \fB\-T\fR |
|---|
| 67 | flags. |
|---|
| 68 | .TP |
|---|
| 69 | \fB\-c\fR, \fB\-\-cmdline\fR |
|---|
| 70 | Only fuzz files whose name is specified in the target application's command |
|---|
| 71 | line. This is mostly a shortcut to avoid specifying twice the argument: |
|---|
| 72 | |
|---|
| 73 | \fB zzuf \-c cat file.txt\fR |
|---|
| 74 | |
|---|
| 75 | has the same effect as |
|---|
| 76 | |
|---|
| 77 | \fB zzuf \-I \(aq^file\\.txt$\(aq cat file.txt\fR |
|---|
| 78 | |
|---|
| 79 | See the \fB\-I\fR flag for more information on restricting fuzzing to |
|---|
| 80 | specific files. |
|---|
| 81 | .TP |
|---|
| 82 | \fB\-C\fR, \fB\-\-max\-crashes\fR=\fIn\fR |
|---|
| 83 | Stop forking when at least \fIn\fR children have crashed. The default value |
|---|
| 84 | is 1, meaning \fBzzuf\fR will stop as soon as one child has crashed. A value |
|---|
| 85 | of 0 tells \fBzzuf\fR to never stop. |
|---|
| 86 | |
|---|
| 87 | A process is considered to have crashed if any signal (such as, but not limited |
|---|
| 88 | to, \fBSIGSEGV\fR) caused it to exit. If the \fB\-x\fR flag is used, this will |
|---|
| 89 | also include processes that exit with a non-zero status. |
|---|
| 90 | |
|---|
| 91 | This option is only relevant if the \fB\-s\fR flag is used with a range |
|---|
| 92 | argument. |
|---|
| 93 | .TP |
|---|
| 94 | \fB\-d\fR, \fB\-\-debug\fR |
|---|
| 95 | Activate the display of debug messages. Can be specified multiple times for |
|---|
| 96 | increased verbosity. |
|---|
| 97 | .TP |
|---|
| 98 | \fB\-D\fR, \fB\-\-delay\fR=\fIdelay\fR |
|---|
| 99 | Do not launch more than one process every \fIdelay\fR seconds. This option |
|---|
| 100 | should be used together with \fB\-j\fR to avoid fork bombs. |
|---|
| 101 | .TP |
|---|
| 102 | \fB\-E\fR, \fB\-\-exclude\fR=\fIregex\fR |
|---|
| 103 | Do not fuzz files whose name matches the \fIregex\fR regular expression. This |
|---|
| 104 | option supersedes anything that is specified by the \fB\-I\fR flag. Use this |
|---|
| 105 | for instance if you are unsure of what files your application is going to read |
|---|
| 106 | and do not want it to fuzz files in the \fB/etc\fR directory. |
|---|
| 107 | |
|---|
| 108 | Multiple \fB\-E\fR flags can be specified, in which case files matching any one |
|---|
| 109 | of the regular expressions will be ignored. |
|---|
| 110 | .TP |
|---|
| 111 | \fB\-f\fR, \fB\-\-fuzzing\fR=\fImode\fR |
|---|
| 112 | Select how the input is fuzzed. Valid values for \fImode\fR are: |
|---|
| 113 | .RS |
|---|
| 114 | .TP |
|---|
| 115 | \fBxor\fR |
|---|
| 116 | randomly set and unset bits |
|---|
| 117 | .TP |
|---|
| 118 | \fBset\fR |
|---|
| 119 | only set bits |
|---|
| 120 | .TP |
|---|
| 121 | \fBunset\fR |
|---|
| 122 | only unset bits |
|---|
| 123 | .RE |
|---|
| 124 | .IP |
|---|
| 125 | The default value for \fImode\fR is \fBxor\fR. |
|---|
| 126 | .TP |
|---|
| 127 | \fB\-j\fR, \fB\-\-jobs\fR=\fIjobs\fR |
|---|
| 128 | Specify the number of simultaneous children that can be run. By default, |
|---|
| 129 | \fBzzuf\fR only launches one process at a time. |
|---|
| 130 | |
|---|
| 131 | This option is only relevant if the \fB\-s\fR flag is used with a range |
|---|
| 132 | argument. See also the \fB\-D\fR flag. |
|---|
| 133 | .TP |
|---|
| 134 | \fB\-i\fR, \fB\-\-stdin\fR |
|---|
| 135 | Fuzz the application's standard input. By default \fBzzuf\fR only fuzzes files. |
|---|
| 136 | .TP |
|---|
| 137 | \fB\-I\fR, \fB\-\-include\fR=\fIregex\fR |
|---|
| 138 | Only fuzz files whose name matches the \fIregex\fR regular expression. Use |
|---|
| 139 | this for instance if your application reads configuration files at startup |
|---|
| 140 | and you only want specific files to be fuzzed. |
|---|
| 141 | |
|---|
| 142 | Multiple \fB\-I\fR flags can be specified, in which case files matching any one |
|---|
| 143 | of the regular expressions will be fuzzed. See also the \fB\-c\fR flag. |
|---|
| 144 | .TP |
|---|
| 145 | \fB\-l\fR, \fB\-\-list\fR=\fIlist\fR |
|---|
| 146 | Cherry-pick the list of file descriptors that get fuzzed. The Nth descriptor |
|---|
| 147 | will really be fuzzed only if N is in \fIlist\fR. |
|---|
| 148 | |
|---|
| 149 | Values start at 1 and ranges are inclusive. Use dashes between values and |
|---|
| 150 | commas between ranges. If the right-hand part of a range is ommited, it means |
|---|
| 151 | all subsequent file descriptors. For instance, to restrict fuzzing to the |
|---|
| 152 | first opened descriptor and all descriptors starting from the 10th, use |
|---|
| 153 | \(oq\fB\-l1,10\-\fR\(cq. |
|---|
| 154 | |
|---|
| 155 | Note that this option only affects file descriptors that would otherwise be |
|---|
| 156 | fuzzed. Even if 10 write-only descriptors are opened at the beginning of the |
|---|
| 157 | program, only the next descriptor with a read flag will be the first one |
|---|
| 158 | considered by the \fB\-l\fR flag. |
|---|
| 159 | .TP |
|---|
| 160 | \fB\-m\fR, \fB\-\-md5\fR |
|---|
| 161 | Instead of displaying the program's \fIstandard output\fR, just print its MD5 |
|---|
| 162 | digest to \fBzzuf\fR's standard output. The standard error channel is left |
|---|
| 163 | untouched. |
|---|
| 164 | .TP |
|---|
| 165 | \fB\-M\fR, \fB\-\-max\-memory\fR=\fImebibytes\fR |
|---|
| 166 | Specify the maximum amount of memory, in mebibytes (1 MiB = 1,048,576 bytes), |
|---|
| 167 | that children are allowed to allocate. This is useful to detect infinite loops |
|---|
| 168 | that eat up a lot of memory. |
|---|
| 169 | |
|---|
| 170 | The value should be set reasonably high so as not to interfer with normal |
|---|
| 171 | program operation. By default, it is set to 1024 MiB in order to avoid |
|---|
| 172 | accidental excessive swapping. To disable the limitation, set the maximum |
|---|
| 173 | memory usage to -1 instead. |
|---|
| 174 | |
|---|
| 175 | \fBzzuf\fR uses the \fBsetrlimit\fR() call to set memory usage limitations and |
|---|
| 176 | relies on the operating system's ability to enforce such limitations. |
|---|
| 177 | .TP |
|---|
| 178 | \fB\-n\fR, \fB\-\-network\fR |
|---|
| 179 | Fuzz the application's network input. By default \fBzzuf\fR only fuzzes files. |
|---|
| 180 | |
|---|
| 181 | Only INET (IPv4) and INET6 (IPv6) connections are fuzzed. Other protocol |
|---|
| 182 | families are not yet supported. |
|---|
| 183 | .TP |
|---|
| 184 | \fB\-p\fR, \fB\-\-ports\fR=\fIranges\fR |
|---|
| 185 | Only fuzz network ports that are in \fIranges\fR. By default \fBzzuf\fR |
|---|
| 186 | fuzzes all ports. The port considered is the listening port if the socket |
|---|
| 187 | is listening and the destination port if the socket is connecting, because |
|---|
| 188 | most of the time the source port cannot be predicted. |
|---|
| 189 | |
|---|
| 190 | Range values start at zero and are inclusive. Use dashes between range values |
|---|
| 191 | and commas between ranges. If the right-hand part of a range is ommited, it |
|---|
| 192 | means end of file. For instance, to restrict fuzzing to the HTTP and HTTPS |
|---|
| 193 | ports and to all unprivileged ports, use \(oq\fB\-p80,443,1024\-\fR\(cq. |
|---|
| 194 | |
|---|
| 195 | This option requires network fuzzing to be activated using \fB\-n\fR. |
|---|
| 196 | .TP |
|---|
| 197 | \fB\-P\fR, \fB\-\-protect\fR=\fIlist\fR |
|---|
| 198 | Protect a list of characters so that if they appear in input data that would |
|---|
| 199 | normally be fuzzed, they are left unmodified instead. |
|---|
| 200 | |
|---|
| 201 | Characters in \fIlist\fR can be expressed verbatim or through escape sequences. |
|---|
| 202 | The sequences interpreted by \fBzzuf\fR are: |
|---|
| 203 | .RS |
|---|
| 204 | .TP |
|---|
| 205 | \fB\\n\fR |
|---|
| 206 | new line |
|---|
| 207 | .TP |
|---|
| 208 | \fB\\r\fR |
|---|
| 209 | return |
|---|
| 210 | .TP |
|---|
| 211 | \fB\\t\fR |
|---|
| 212 | tabulation |
|---|
| 213 | .TP |
|---|
| 214 | \fB\\\fR\fINNN\fR |
|---|
| 215 | the byte whose octal value is \fINNN\fR |
|---|
| 216 | .TP |
|---|
| 217 | \fB\\x\fR\fINN\fR |
|---|
| 218 | the byte whose hexadecimal value is \fINN\fR |
|---|
| 219 | .TP |
|---|
| 220 | \fB\\\\\fR |
|---|
| 221 | backslash (\(oq\\\(cq) |
|---|
| 222 | .RE |
|---|
| 223 | .IP |
|---|
| 224 | You can use \(oq\fB\-\fR\(cq to specify ranges. For instance, to protect all |
|---|
| 225 | bytes from \(oq\\001\(cq to \(oq/\(cq, use \(oq\fB\-P\ \(aq\\001\-/\(aq\fR\(cq. |
|---|
| 226 | |
|---|
| 227 | The statistical outcome of this option should not be overlooked: if characters |
|---|
| 228 | are protected, the effect of the \(oq\fB\-r\fR\(cq flag will vary depending |
|---|
| 229 | on the data being fuzzed. For instance, asking to fuzz 1% of input bits |
|---|
| 230 | (\fB\-r0.01\fR) and to protect lowercase characters (\fB\-P\ a\-z\fR) will |
|---|
| 231 | result in an actual average fuzzing ratio of 0.9% with truly random data, |
|---|
| 232 | 0.3% with random ASCII data and 0.2% with standard English text. |
|---|
| 233 | |
|---|
| 234 | See also the \fB\-R\fR flag. |
|---|
| 235 | .TP |
|---|
| 236 | \fB\-q\fR, \fB\-\-quiet\fR |
|---|
| 237 | Hide the output of the fuzzed application. This is useful if the application |
|---|
| 238 | is very verbose but only its exit code or signaled status is really useful to |
|---|
| 239 | you. |
|---|
| 240 | .TP |
|---|
| 241 | \fB\-r\fR, \fB\-\-ratio\fR=\fIratio\fR |
|---|
| 242 | .PD 0 |
|---|
| 243 | .TP |
|---|
| 244 | \fB\-r\fR, \fB\-\-ratio\fR=\fImin:max\fR |
|---|
| 245 | .PD |
|---|
| 246 | Specify the proportion of bits that will be randomly fuzzed. A value of 0 |
|---|
| 247 | will not fuzz anything. A value of 0.05 will fuzz 5% of the open files' |
|---|
| 248 | bits. A value of 1.0 or more will fuzz all the bytes, theoretically making |
|---|
| 249 | the input files undiscernible from random data. The default fuzzing ratio |
|---|
| 250 | is 0.004 (fuzz 0.4% of the files' bits). |
|---|
| 251 | |
|---|
| 252 | A range can also be specified. When doing so, \fBzzuf\fR will pick ratio |
|---|
| 253 | values from the interval. The choice is deterministic and only depends on |
|---|
| 254 | the interval bounds and the current seed. |
|---|
| 255 | .TP |
|---|
| 256 | \fB\-R\fR, \fB\-\-refuse\fR=\fIlist\fR |
|---|
| 257 | Refuse a list of characters by not fuzzing bytes that would otherwise be |
|---|
| 258 | changed to a character that is in \fIlist\fR. This does not prevent characters |
|---|
| 259 | from appearing in the output if the original byte was already in \fIlist\fR. |
|---|
| 260 | |
|---|
| 261 | See the \fB\-P\fR option for a description of \fIlist\fR. |
|---|
| 262 | .TP |
|---|
| 263 | \fB\-s\fR, \fB\-\-seed\fR=\fIseed\fR |
|---|
| 264 | .PD 0 |
|---|
| 265 | .TP |
|---|
| 266 | \fB\-s\fR, \fB\-\-seed\fR=\fIstart:stop\fR |
|---|
| 267 | .PD |
|---|
| 268 | Specify the random seed to use for fuzzing, or a range of random seeds. |
|---|
| 269 | Running \fBzzuf\fR twice with the same random seed will fuzz the files exactly |
|---|
| 270 | the same way, even with a different target application. The purpose of this is |
|---|
| 271 | to use simple utilities such as \fBcat\fR or \fBcp\fR to generate a file that |
|---|
| 272 | causes the target application to crash. |
|---|
| 273 | |
|---|
| 274 | If a range is specified, \fBzzuf\fR will run the application several times, |
|---|
| 275 | each time with a different seed, and report the behaviour of each run. If the |
|---|
| 276 | \(oq:\(cq character is used but the second part of the range is omitted, |
|---|
| 277 | \fBzzuf\fR will increment the seed value indefinitely. |
|---|
| 278 | .TP |
|---|
| 279 | \fB\-S\fR, \fB\-\-signal\fR |
|---|
| 280 | Prevent children from installing signal handlers for signals that usually |
|---|
| 281 | cause coredumps. These signals are \fBSIGABRT\fR, \fBSIGFPE\fR, \fBSIGILL\fR, |
|---|
| 282 | \fBSIGQUIT\fR, \fBSIGSEGV\fR, \fBSIGTRAP\fR and, if available on the running |
|---|
| 283 | platform, \fBSIGSYS\fR, \fBSIGEMT\fR, \fBSIGBUS\fR, \fBSIGXCPU\fR and |
|---|
| 284 | \fBSIGXFSZ\fR. Instead of calling the signal handler, the application will |
|---|
| 285 | simply crash. If you do not want core dumps, you should set appropriate limits |
|---|
| 286 | with the \fBlimit coredumpsize\fR command. See your shell's documentation on |
|---|
| 287 | how to set such limits. |
|---|
| 288 | .TP |
|---|
| 289 | \fB\-t\fR, \fB\-\-max\-time\fR=\fIn\fR |
|---|
| 290 | Automatically terminate child processes that run for more than \fIn\fR |
|---|
| 291 | seconds. This is useful to detect infinite loops or processes stuck in other |
|---|
| 292 | situations. See also the \fB\-B\fR and \fB\-T\fR flags. |
|---|
| 293 | .TP |
|---|
| 294 | \fB\-T\fR, \fB\-\-max\-cputime\fR=\fIn\fR |
|---|
| 295 | Automatically terminate child processes that use more than \fIn\fR seconds |
|---|
| 296 | of CPU time. |
|---|
| 297 | |
|---|
| 298 | \fBzzuf\fR uses the \fBsetrlimit\fR() call to set CPU usage limitations and |
|---|
| 299 | relies on the operating system's ability to enforce such limitations. If the |
|---|
| 300 | system sends \fBSIGXCPU\fR signals and the application catches that signal, |
|---|
| 301 | it will receive a \fBSIGKILL\fR signal after 5 seconds. |
|---|
| 302 | |
|---|
| 303 | This is more accurate than \fB\-t\fR because the behaviour should be |
|---|
| 304 | independent from the system load, but it does not detect processes stuck into |
|---|
| 305 | infinite \fBselect\fR() calls because they use very little CPU time. See also |
|---|
| 306 | the \fB\-B\fR and \fB\-t\fR flags. |
|---|
| 307 | .TP |
|---|
| 308 | \fB\-v\fR, \fB\-\-verbose\fR |
|---|
| 309 | Print information during the run, such as the current seed, what processes |
|---|
| 310 | get run, their exit status, etc. |
|---|
| 311 | .TP |
|---|
| 312 | \fB\-x\fR, \fB\-\-check\-exit\fR |
|---|
| 313 | Report processes that exit with a non-zero status. By default only processes |
|---|
| 314 | that crash due to a signal are reported. |
|---|
| 315 | .TP |
|---|
| 316 | \fB\-h\fR, \fB\-\-help\fR |
|---|
| 317 | Display a short help message and exit. |
|---|
| 318 | .TP |
|---|
| 319 | \fB\-V\fR, \fB\-\-version\fR |
|---|
| 320 | Output version information and exit. |
|---|
| 321 | .SH DIAGNOSTICS |
|---|
| 322 | .PP |
|---|
| 323 | Exit status is zero if no child process crashed. If one or several children |
|---|
| 324 | crashed, \fBzzuf\fR exits with status 1. |
|---|
| 325 | .SH EXAMPLES |
|---|
| 326 | .PP |
|---|
| 327 | Fuzz the input of the \fBcat\fR program using default settings: |
|---|
| 328 | .PP |
|---|
| 329 | \fB zzuf cat /etc/motd\fR |
|---|
| 330 | .PP |
|---|
| 331 | Fuzz 1% of the input bits of the \fBcat\fR program using seed 94324: |
|---|
| 332 | .PP |
|---|
| 333 | \fB zzuf \-s94324 \-r0.01 cat /etc/motd\fR |
|---|
| 334 | .PP |
|---|
| 335 | Fuzz the input of the \fBcat\fR program but do not fuzz newline characters |
|---|
| 336 | and prevent non-ASCII characters from appearing in the output: |
|---|
| 337 | .PP |
|---|
| 338 | \fB zzuf \-P \(aq\\n\(aq \-R \(aq\\x00\-\\x1f\\x7f\-\\xff\(aq cat /etc/motd\fR |
|---|
| 339 | .PP |
|---|
| 340 | Fuzz the input of the \fBconvert\fR program, using file \fBfoo.jpeg\fR as the |
|---|
| 341 | original input and excluding \fB.xml\fR files from fuzzing (because |
|---|
| 342 | \fBconvert\fR will also open its own XML configuration files and we do not |
|---|
| 343 | want \fBzzuf\fR to fuzz them): |
|---|
| 344 | .PP |
|---|
| 345 | \fB zzuf \-E \(aq\\.xml$\(aq convert foo.jpeg \-format tga /dev/null\fR |
|---|
| 346 | .PP |
|---|
| 347 | Fuzz the input of VLC, using file \fBmovie.avi\fR as the original input |
|---|
| 348 | and restricting fuzzing to filenames that appear on the command line |
|---|
| 349 | (\fB\-c\fR), then generate \fBfuzzy\-movie.avi\fR which is a file that |
|---|
| 350 | can be read by VLC to reproduce the same behaviour without using |
|---|
| 351 | \fBzzuf\fR: |
|---|
| 352 | .PP |
|---|
| 353 | \fB zzuf \-c \-s87423 \-r0.01 vlc movie.avi\fR |
|---|
| 354 | .br |
|---|
| 355 | \fB zzuf \-c \-s87423 \-r0.01 <movie.avi >fuzzy\-movie.avi\fR |
|---|
| 356 | .br |
|---|
| 357 | \fB vlc fuzzy\-movie.avi\fR |
|---|
| 358 | .PP |
|---|
| 359 | Fuzz between 0.1% and 2% of MPlayer's input bits (\fB\-r0.001:0.02\fR) |
|---|
| 360 | with seeds 0 to 9999 (\fB\-s0:10000\fR), preserving the AVI 4-byte header |
|---|
| 361 | by restricting fuzzing to offsets after 4 (\fB\-b4\-\fR), disabling its |
|---|
| 362 | standard output messages (\fB\-q\fR), launching up to five simultaneous child |
|---|
| 363 | processes (\fB\-j5\fR) but waiting at least half a second between launches |
|---|
| 364 | (\fB\-D0.5\fR), killing MPlayer if it takes more than one minute to |
|---|
| 365 | read the file (\fB\-T60\fR) and disabling its \fBSIGSEGV\fR signal handler |
|---|
| 366 | (\fB\-S\fR): |
|---|
| 367 | .PP |
|---|
| 368 | \fB zzuf \-c \-r0.001:0.02 \-s0:10000 \-b4\- \-q \-j5 \-D0.5 \-T60 \-S \\\fR |
|---|
| 369 | .br |
|---|
| 370 | \fB mplayer \-benchmark \-vo null \-fps 1000 movie.avi\fR |
|---|
| 371 | .PP |
|---|
| 372 | A more advanced VLC fuzzing example, stopping only at the first crash: |
|---|
| 373 | .PP |
|---|
| 374 | \fB zzuf \-j4 \-vqc \-r0.000001:0.01 \-s0: vlc \-v \-I dummy movie.avi \\\fR |
|---|
| 375 | .br |
|---|
| 376 | \fB \-\-sout \(aq#transcode{acodec=s16l,vcodec=I420}:dummy\(aq vlc:quit |
|---|
| 377 | .PP |
|---|
| 378 | Create an HTML-like file that loads 200 times the same \fBhello.jpg\fR image |
|---|
| 379 | and open it in Firefox\(tm in auto-increment mode (\fB\-A\fR): |
|---|
| 380 | .PP |
|---|
| 381 | \fB seq \-f \(aq<img src="hello.jpg#%g">\(aq 1 200 > hello.html\fR |
|---|
| 382 | .br |
|---|
| 383 | (or: \fBjot \-w \(aq<img src="hello.jpg#%d">\(aq 200 1 > hello.html\fR) |
|---|
| 384 | .br |
|---|
| 385 | \fB zzuf \-A \-I \(aqhello[.]jpg\(aq \-r0.001 firefox hello.html\fR |
|---|
| 386 | .PP |
|---|
| 387 | Run a simple HTTP redirector on the local host using \fBsocat\fR and |
|---|
| 388 | corrupt each network connection (\fB\-n\fR) in a different way (\fB\-A\fR) |
|---|
| 389 | after one megabyte of data was received on it (\fB\-b1000000\-\fR): |
|---|
| 390 | .PP |
|---|
| 391 | \fB zzuf \-n \-A \-b1000000\- \\\fR |
|---|
| 392 | \fB socat TCP4\-LISTEN:8080,reuseaddr,fork TCP4:192.168.1.42:80\fR |
|---|
| 393 | .PP |
|---|
| 394 | Browse the intarweb (\fB\-n\fR) using Firefox\(tm without fuzzing local files |
|---|
| 395 | (\fB\-E.\fR) or non-HTTP connections (\fB\-p80,8010,8080\fR), preserving |
|---|
| 396 | the beginning of the data sent with each HTTP response (\fB\-b4000\-\fR) |
|---|
| 397 | and using another seed on each connection (\fB\-A\fR): |
|---|
| 398 | .PP |
|---|
| 399 | \fB zzuf \-r 0.0001 \-n \-E. \-p80,8010,8080 \-b4000\- \-A firefox\fR |
|---|
| 400 | .SH RESTRICTIONS |
|---|
| 401 | .PP |
|---|
| 402 | Due to \fBzzuf\fR using shared object preloading (\fBLD_PRELOAD\fR, |
|---|
| 403 | \fB_RLD_LIST\fB, \fBDYLD_INSERT_LIBRARIES\fR, etc.) to run its child |
|---|
| 404 | processes, it will fail in the presence of any mechanism that disables |
|---|
| 405 | preloading. For instance setuid root binaries will not be fuzzed when run |
|---|
| 406 | as an unprivileged user. |
|---|
| 407 | .PP |
|---|
| 408 | For the same reasons, \fBzzuf\fR will also not work with statically linked |
|---|
| 409 | binaries. Bear this in mind when using \fBzzuf\fR on the OpenBSD platform, |
|---|
| 410 | where \fBcat\fR, \fBcp\fR and \fBdd\fR are static binaries. |
|---|
| 411 | .PP |
|---|
| 412 | Though best efforts are made, identical behaviour for different versions of |
|---|
| 413 | \fBzzuf\fR is not guaranteed. The reproducibility for subsequent calls on |
|---|
| 414 | different operating systems and with different target programs is only |
|---|
| 415 | guaranteed when the same version of \fBzzuf\fR is being used. |
|---|
| 416 | .SH BUGS |
|---|
| 417 | .PP |
|---|
| 418 | \fBzzuf\fR probably does not behave correctly with 64-bit offsets. |
|---|
| 419 | .PP |
|---|
| 420 | It is not yet possible to insert or drop bytes from the input, to fuzz |
|---|
| 421 | according to the file format, to swap bytes, etc. More advanced fuzzing |
|---|
| 422 | methods are planned. |
|---|
| 423 | .PP |
|---|
| 424 | As of now, \fBzzuf\fR does not really support multithreaded applications. The |
|---|
| 425 | behaviour with multithreaded applications where more than one thread does file |
|---|
| 426 | descriptor operations is undefined. |
|---|
| 427 | .SH HISTORY |
|---|
| 428 | .PP |
|---|
| 429 | \fBzzuf\fR started its life in 2002 as the \fBstreamfucker\fR tool, a small |
|---|
| 430 | multimedia stream corrupter used to find bugs in the VLC media player. |
|---|
| 431 | .SH SEE ALSO |
|---|
| 432 | .PP |
|---|
| 433 | \fBlibzzuf(3)\fR, \fBzzcat(1)\fR |
|---|
| 434 | .SH AUTHOR |
|---|
| 435 | .PP |
|---|
| 436 | Copyright \(co 2002\-2010 Sam Hocevar <sam@hocevar.net>. |
|---|
| 437 | .PP |
|---|
| 438 | \fBzzuf\fR and this manual page are free software. They come without any |
|---|
| 439 | warranty, to the extent permitted by applicable law. You can redistribute |
|---|
| 440 | them and/or modify them under the terms of the Do What The Fuck You Want |
|---|
| 441 | To Public License, Version 2, as published by Sam Hocevar. See |
|---|
| 442 | \fBhttp://sam.zoy.org/wtfpl/COPYING\fR for more details. |
|---|
| 443 | .PP |
|---|
| 444 | \fBzzuf\fR's webpage can be found at \fBhttp://caca.zoy.org/wiki/zzuf\fR. |
|---|
| 445 | An overview of the architecture and inner works is at |
|---|
| 446 | \fBhttp://caca.zoy.org/wiki/zzuf/internals\fR. |
|---|