| 154 | | This may be useful if a given application is not supported by `zzuf`, but it is especially useful to generate files that reproduce `zzuf`’s behaviour without requiring `zzuf`. |
| 155 | | |
| | 154 | This may be used if a given application is not supported by `zzuf`, but it is especially useful to generate files that reproduce `zzuf`’s behaviour without requiring `zzuf` at all. |
| | 155 | |
| | 156 | = `zzuf` as a batch testing tool = |
| | 157 | |
| | 158 | The most useful aspect of `zzuf` is its use as an automated tool, testing thousands of different fuzzing combinations and analysing the fuzzed application’s behaviour in each situation. |
| | 159 | |
| | 160 | == Debug mode == |
| | 161 | |
| | 162 | Consider this invocation of `zzuf` with the `file` utility: |
| | 163 | |
| | 164 | {{{ |
| | 165 | % zzuf file /bin/ls |
| | 166 | /etc/magic, 4: Warning: using regular magic file `/usr/share/file/magic' |
| | 167 | /usr/share/file/magic, 33: Warning: Printf format `d' is not valid for type `string' in description `RISC OS outline font data,>5 byte x varsion %d' |
| | 168 | /usr/share/file/magic, 47: Warning: type `stri?g \x02\x01\x13\x13\x13\x01\x0d\x10 Digital Symphony sound sample (RISC OS),' invalid |
| | 169 | [...] |
| | 170 | }}} |
| | 171 | |
| | 172 | This is not the expected behaviour at all. What happens exactly? The problem is that `file` also opens its own configuration files to gather information about file formats, and of course `zzuf` fuzzes these files, since no one told it that they were special. |
| | 173 | |
| | 174 | We may use the '''debug mode''' to learn more about what happens, using the '''`-d` flag''': |
| | 175 | |
| | 176 | {{{ |
| | 177 | % zzuf -d file /bin/ls |
| | 178 | ** zzuf debug ** libzzuf initialised for PID 29526 |
| | 179 | ** zzuf debug ** fopen("/etc/magic", "r") = [3] |
| | 180 | ** zzuf debug ** fgets(0x7fffc46e04b0, 8192, [3]) = 0x7fffc46e04b0 |
| | 181 | ** zzuf debug ** fgets(0x7fffc46e04b0, 8192, [3]) = 0x7fffc46e04b0 |
| | 182 | ** zzuf debug ** fgets(0x7fffc46e04b0, 8192, [3]) = 0x7fffc46e04b0 |
| | 183 | ** zzuf debug ** fgets(0x7fffc46e04b0, 8192, [3]) = NULL |
| | 184 | ** zzuf debug ** fclose([3]) = 0 |
| | 185 | ** zzuf debug ** open("/usr/share/file/magic.mgc", 0) = 3 |
| | 186 | ** zzuf debug ** mmap(NULL, 1636608, 3, 2, 3, 0) = 0x2acce776e000 "\x1c\x04\x1c\xf1... |
| | 187 | ** zzuf debug ** close(3) = 0 |
| | 188 | ** zzuf debug ** fopen("/usr/share/file/magic", "r") = [3] |
| | 189 | ** zzuf debug ** fgets(0x7fffc46e04b0, 8192, [3]) = 0x7fffc46e04b0 |
| | 190 | ** zzuf debug ** fgets(0x7fffc46e04b0, 8192, [3]) = 0x7fffc46e04b0 |
| | 191 | ** zzuf debug ** fgets(0x7fffc46e04b0, 8192, [3]) = 0x7fffc46e04b0 |
| | 192 | [...] |
| | 193 | }}} |
| | 194 | |
| | 195 | We see that `file` opens at least `/etc/magic`, `/usr/share/file/magic.mgc` and `/usr/share/file/magic`. Since they are installed in trusted directories, it is useless to fuzz these files, unless of course we wish to test `file`’s robustness against corruption of these files. |
| | 196 | |
| | 197 | One way to ignore these files is to '''exclude''' them, using the '''`-E` flag'''. This flag specifies that files matching a given regular expression should not be fuzzed: |
| | 198 | |
| | 199 | {{{ |
| | 200 | % zzuf -d -E /etc/ -E /usr/share/ file /bin/ls |
| | 201 | ** zzuf debug ** libzzuf initialised for PID 30541 |
| | 202 | ** zzuf debug ** open("/bin/ls", 0) = 3 |
| | 203 | ** zzuf debug ** read(3, 0x60a590, 98304) = 98304 "\x7fENF... |
| | 204 | ** zzuf debug ** close(3) = 0 |
| | 205 | /bin/ls: data |
| | 206 | % |
| | 207 | }}} |
| | 208 | |
| | 209 | Another way to avoid the issue is to only '''include''' the file or directories we want to fuzz, using the '''`-I` flag''': |
| | 210 | |
| | 211 | {{{ |
| | 212 | % zzuf -d -I /bin/ file /bin/ls |
| | 213 | ** zzuf debug ** libzzuf initialised for PID 30550 |
| | 214 | ** zzuf debug ** open("/bin/ls", 0) = 3 |
| | 215 | ** zzuf debug ** read(3, 0x606c20, 98304) = 98304 "\x7fENF... |
| | 216 | ** zzuf debug ** close(3) = 0 |
| | 217 | /bin/ls: data |
| | 218 | % |
| | 219 | }}} |
| | 220 | |
| | 221 | Yet another way is to tell `zzuf` to only fuzz files that appear on the fuzzed application’s '''commandline''', using the '''`-c` flag''': |
| | 222 | |
| | 223 | {{{ |
| | 224 | % zzuf -d -c file /bin/ls |
| | 225 | ** zzuf debug ** libzzuf initialised for PID 30555 |
| | 226 | ** zzuf debug ** open("/bin/ls", 0) = 3 |
| | 227 | ** zzuf debug ** read(3, 0x608de0, 98304) = 98304 "\x7fENF... |
| | 228 | ** zzuf debug ** close(3) = 0 |
| | 229 | /bin/ls: data |
| | 230 | % |
| | 231 | }}} |
| | 232 | |
| | 233 | We can now properly fuzz the `file` application. |