DrFuzz mutator weird case
Describe the bug
Hello! I'm playing with the DrFuzz and looks like the mutator with default options avoids some obvious cases.
Here is the spaghetti-like program which crashes at input 13371337
#include <stdio.h>
#include <stdlib.h>
void printOnce(int idx){
static bool buf[8] = {0};
if (!buf[idx]) {
printf("Stage %d reached\n", idx);
buf[idx] = 1;
}
}
extern "C"
__declspec(dllexport)
void
DRFuzzMe1(const char* data, unsigned int len) {
static size_t i = 0;
i++;
if ((i % 1000000) == 0) {
printf("Fuzzing continues: %llu\n", i);
}
if (len != 8) {
printf("Len != 8");
return;
}
if (data[0] == '1') {
printOnce(1);
if (data[1] == '3') {
printOnce(2);
if (data[2] == '3') {
printOnce(3);
if (data[3] == '7') {
printOnce(4);
if (data[4] == '1') {
printOnce(5);
if (data[5] == '3') {
printOnce(6);
if (data[6] == '3') {
printOnce(7);
if (data[7] == '7') {
printOnce(8);
*(size_t*)0 = 0;
}
}
}
}
}
}
}
}
}
int main(int argc, char** argv) {
if (argc != 3) {
printf("Usage: %s <buffer> <buffer len>\n", argv[0]);
return 1;
}
DRFuzzMe1(argv[1], atoi(argv[2]));
return 0;
}
I'm running it with next options:
drrun.exe -t drmemory -fuzz_function DRFuzzMe1 -fuzz_module drbug-16.exe -fuzz_coverage -fuzz_num_iters 1000000000 -- drbug-16.exe 11111111 8
And I'm getting the log like this:
~~Dr.M~~ Dr. Memory version 2.3.18665
~~Dr.M~~ Running "c:\git\codespirit\build\RelWithDebInfo\drbug-16.exe 11111111 8"
~~Dr.M~~ Using system call file z:\dr\drmemory\drmemory\logs\symcache\syscalls_x64.txt
Stage 1 reached
Stage 2 reached
Stage 3 reached
Stage 4 reached
Stage 5 reached
Stage 6 reached
Stage 7 reached
Fuzzing continues: 1000000
Fuzzing continues: 2000000
Fuzzing continues: 3000000
Fuzzing continues: 4000000
Fuzzing continues: 5000000
Fuzzing continues: 6000000
Fuzzing continues: 7000000
Fuzzing continues: 8000000
Fuzzing continues: 9000000
Fuzzing continues: 10000000
Fuzzing continues: 11000000
Fuzzing continues: 12000000
Fuzzing continues: 13000000
...
So, first 7 bytes were matched almost instantly, but the last one is just not covered. Fuzzer is not producing such a sample.
It really depends on the input case itself, for example, we can feed:
...\drbug-16.exe 13111111 8
And the target sample will be discovered instantly, and at the same time we can run ...drbug-16.exe 11211111 8 for a significant amount of time without luck.
Expected behavior
The crashing path should be discovered for 11111111 input case
Versions
- What version of Dr. Memory are you using?
drrun version 8.0.18687 -- build 0 Dr. Memory version 2.3.18665 -- build 0
- What operating system version are you running on? ("Windows 10" is not sufficient: give the release number.)
Microsoft Windows [Version 10.0.19042.867]
- Is your application 32-bit or 64-bit?
64-bit