"Fossies" - the Fresh Open Source Software Archive  

Source code changes of the file "mangle.c" between
honggfuzz-2.1.tar.gz and honggfuzz-2.2.tar.gz

About: honggfuzz is a security oriented, feedback-driven, evolutionary, easy-to-use fuzzer with powerful analysis options.

mangle.c  (honggfuzz-2.1):mangle.c  (honggfuzz-2.2)
/* /*
* *
* honggfuzz - run->dynamicFilefer mangling routines * honggfuzz - run->dynfile->datafer mangling routines
* ----------------------------------------- * -----------------------------------------
* *
* Author: * Author:
* Robert Swiecki <swiecki@google.com> * Robert Swiecki <swiecki@google.com>
* *
* Copyright 2010-2018 by Google Inc. All Rights Reserved. * Copyright 2010-2018 by Google Inc. All Rights Reserved.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); you may * Licensed under the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License. You may obtain * not use this file except in compliance with the License. You may obtain
* a copy of the License at * a copy of the License at
skipping to change at line 27 skipping to change at line 27
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
* implied. See the License for the specific language governing * implied. See the License for the specific language governing
* permissions and limitations under the License. * permissions and limitations under the License.
* *
*/ */
#include "mangle.h" #include "mangle.h"
#include <ctype.h>
#include <inttypes.h> #include <inttypes.h>
#include <math.h> #include <math.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <sys/mman.h> #include <sys/mman.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/types.h> #include <sys/types.h>
#include <unistd.h> #include <unistd.h>
#include "input.h" #include "input.h"
#include "libhfcommon/common.h" #include "libhfcommon/common.h"
#include "libhfcommon/log.h" #include "libhfcommon/log.h"
#include "libhfcommon/util.h" #include "libhfcommon/util.h"
static inline void mangle_Overwrite(run_t* run, const uint8_t* src, size_t off, static inline size_t mangle_LenLeft(run_t* run, size_t off) {
size_t sz) { if (off >= run->dynfile->size) {
size_t maxToCopy = run->dynamicFileSz - off; LOG_F("Offset is too large: off:%zu >= len:%zu", off, run->dynfile->size
if (sz > maxToCopy) { );
sz = maxToCopy; }
return (run->dynfile->size - off - 1);
}
/* Get a random value between <1:max> with x^2 distribution */
static inline size_t mangle_getLen(size_t max) {
if (max > _HF_INPUT_MAX_SIZE) {
LOG_F("max (%zu) > _HF_INPUT_MAX_SIZE (%zu)", max, (size_t)_HF_INPUT_MAX
_SIZE);
}
if (max == 0) {
LOG_F("max == 0");
}
if (max == 1) {
return 1;
}
const uint64_t max2 = (uint64_t)max * max;
const uint64_t max3 = (uint64_t)max * max * max;
const uint64_t rnd = util_rndGet(1, max2 - 1);
uint64_t ret = rnd * rnd;
ret /= max3;
ret += 1;
if (ret < 1) {
LOG_F("ret (%" PRIu64 ") < 1, max:%zu, rnd:%" PRIu64, ret, max, rnd);
}
if (ret > max) {
LOG_F("ret (%" PRIu64 ") > max (%zu), rnd:%" PRIu64, ret, max, rnd);
} }
memmove(&run->dynamicFile[off], src, sz); return (size_t)ret;
}
/* Prefer smaller values here, so use mangle_getLen() */
static inline size_t mangle_getOffSet(run_t* run) {
return mangle_getLen(run->dynfile->size) - 1;
}
/* Offset which can be equal to the file size */
static inline size_t mangle_getOffSetPlus1(run_t* run) {
size_t reqlen = HF_MIN(run->dynfile->size + 1, _HF_INPUT_MAX_SIZE);
return mangle_getLen(reqlen) - 1;
} }
static inline void mangle_Move(run_t* run, size_t off_from, size_t off_to, size_ t len) { static inline void mangle_Move(run_t* run, size_t off_from, size_t off_to, size_ t len) {
if (off_from >= run->dynamicFileSz) { if (off_from >= run->dynfile->size) {
return; return;
} }
if (off_to >= run->dynamicFileSz) { if (off_to >= run->dynfile->size) {
return;
}
if (off_from == off_to) {
return; return;
} }
ssize_t len_from = (ssize_t)run->dynamicFileSz - off_from - 1; size_t len_from = run->dynfile->size - off_from;
ssize_t len_to = (ssize_t)run->dynamicFileSz - off_to - 1; len = HF_MIN(len, len_from);
if ((ssize_t)len > len_from) { size_t len_to = run->dynfile->size - off_to;
len = len_from; len = HF_MIN(len, len_to);
}
if ((ssize_t)len > len_to) {
len = len_to;
}
memmove(&run->dynamicFile[off_to], &run->dynamicFile[off_from], len); memmove(&run->dynfile->data[off_to], &run->dynfile->data[off_from], len);
} }
static void mangle_Inflate(run_t* run, size_t off, size_t len, bool printable) { static inline void mangle_Overwrite(
if (run->dynamicFileSz >= run->global->mutate.maxFileSz) { run_t* run, size_t off, const uint8_t* src, size_t len, bool printable) {
if (len == 0) {
return; return;
} }
if (len > (run->global->mutate.maxFileSz - run->dynamicFileSz)) { size_t maxToCopy = run->dynfile->size - off;
len = run->global->mutate.maxFileSz - run->dynamicFileSz; if (len > maxToCopy) {
len = maxToCopy;
} }
input_setSize(run, run->dynamicFileSz + len); memmove(&run->dynfile->data[off], src, len);
mangle_Move(run, off, off + len, run->dynamicFileSz);
if (printable) { if (printable) {
util_rndBufPrintable(&run->dynamicFile[off], len); util_turnToPrintable(&run->dynfile->data[off], len);
} else {
util_rndBuf(&run->dynamicFile[off], len);
} }
} }
static void mangle_MemMove(run_t* run, bool printable HF_ATTR_UNUSED) { static inline size_t mangle_Inflate(run_t* run, size_t off, size_t len, bool pri
size_t off_from = util_rndGet(0, run->dynamicFileSz - 1); ntable) {
size_t off_to = util_rndGet(0, run->dynamicFileSz - 1); if (run->dynfile->size >= run->global->mutate.maxInputSz) {
size_t len = util_rndGet(0, run->dynamicFileSz); return 0;
}
if (len > (run->global->mutate.maxInputSz - run->dynfile->size)) {
len = run->global->mutate.maxInputSz - run->dynfile->size;
}
input_setSize(run, run->dynfile->size + len);
mangle_Move(run, off, off + len, run->dynfile->size);
if (printable) {
memset(&run->dynfile->data[off], ' ', len);
}
mangle_Move(run, off_from, off_to, len); return len;
} }
static void mangle_Bytes(run_t* run, bool printable) { static inline void mangle_Insert(
size_t off = util_rndGet(0, run->dynamicFileSz - 1); run_t* run, size_t off, const uint8_t* val, size_t len, bool printable) {
len = mangle_Inflate(run, off, len, printable);
mangle_Overwrite(run, off, val, len, printable);
}
uint64_t buf; static inline void mangle_UseValue(run_t* run, const uint8_t* val, size_t len, b
if (printable) { ool printable) {
util_rndBufPrintable((uint8_t*)&buf, sizeof(buf)); if (util_rnd64() % 2) {
mangle_Insert(run, mangle_getOffSetPlus1(run), val, len, printable);
} else { } else {
util_rndBuf((uint8_t*)&buf, sizeof(buf)); mangle_Overwrite(run, mangle_getOffSet(run), val, len, printable);
} }
/* Overwrite with random 1-8-byte values */
size_t toCopy = util_rndGet(1, 8);
mangle_Overwrite(run, (uint8_t*)&buf, off, toCopy);
} }
static void mangle_Bit(run_t* run, bool printable) { static void mangle_MemSwap(run_t* run, bool printable HF_ATTR_UNUSED) {
size_t off = util_rndGet(0, run->dynamicFileSz - 1); size_t off1 = mangle_getOffSet(run);
run->dynamicFile[off] ^= (uint8_t)(1U << util_rndGet(0, 7)); size_t maxlen1 = run->dynfile->size - off1;
if (printable) {
util_turnToPrintable(&(run->dynamicFile[off]), 1); size_t off2 = mangle_getOffSet(run);
} size_t maxlen2 = run->dynfile->size - off2;
size_t len = mangle_getLen(HF_MIN(maxlen1, maxlen2));
uint8_t* tmpbuf = (uint8_t*)util_Malloc(len);
defer {
free(tmpbuf);
};
memcpy(tmpbuf, &run->dynfile->data[off1], len);
memmove(&run->dynfile->data[off1], &run->dynfile->data[off2], len);
memcpy(&run->dynfile->data[off2], tmpbuf, len);
} }
static void mangle_DictionaryInsertNoCheck(run_t* run, bool printable) { static void mangle_MemCopy(run_t* run, bool printable HF_ATTR_UNUSED) {
uint64_t choice = util_rndGet(0, run->global->mutate.dictionaryCnt - 1); size_t off = mangle_getOffSet(run);
struct strings_t* str = TAILQ_FIRST(&run->global->mutate.dictq); size_t len = mangle_getLen(run->dynfile->size - off);
for (uint64_t i = 0; i < choice; i++) {
str = TAILQ_NEXT(str, pointers); /* Use a temp buf, as Insert/Inflate can change source bytes */
} uint8_t* tmpbuf = (uint8_t*)util_Malloc(len);
defer {
free(tmpbuf);
};
memcpy(tmpbuf, &run->dynfile->data[off], len);
size_t off = util_rndGet(0, run->dynamicFileSz - 1); mangle_UseValue(run, tmpbuf, len, printable);
mangle_Inflate(run, off, str->len, printable);
mangle_Overwrite(run, (uint8_t*)str->s, off, str->len);
} }
static void mangle_DictionaryInsert(run_t* run, bool printable) { static void mangle_Bytes(run_t* run, bool printable) {
if (run->global->mutate.dictionaryCnt == 0) { uint16_t buf;
mangle_Bit(run, printable); if (printable) {
return; util_rndBufPrintable((uint8_t*)&buf, sizeof(buf));
} else {
buf = util_rnd64();
} }
mangle_DictionaryInsertNoCheck(run, printable);
/* Overwrite with random 1-2-byte values */
size_t toCopy = util_rndGet(1, 2);
mangle_UseValue(run, (const uint8_t*)&buf, toCopy, printable);
} }
static void mangle_DictionaryNoCheck(run_t* run) { static void mangle_ByteRepeatOverwrite(run_t* run, bool printable) {
size_t off = util_rndGet(0, run->dynamicFileSz - 1); size_t off = mangle_getOffSet(run);
size_t destOff = off + 1;
size_t maxSz = run->dynfile->size - destOff;
uint64_t choice = util_rndGet(0, run->global->mutate.dictionaryCnt - 1); /* No space to repeat */
struct strings_t* str = TAILQ_FIRST(&run->global->mutate.dictq); if (!maxSz) {
for (uint64_t i = 0; i < choice; i++) { mangle_Bytes(run, printable);
str = TAILQ_NEXT(str, pointers); return;
} }
mangle_Overwrite(run, (uint8_t*)str->s, off, str->len); size_t len = mangle_getLen(maxSz);
memset(&run->dynfile->data[destOff], run->dynfile->data[off], len);
} }
static void mangle_Dictionary(run_t* run, bool printable) { static void mangle_ByteRepeatInsert(run_t* run, bool printable) {
if (run->global->mutate.dictionaryCnt == 0) { size_t off = mangle_getOffSet(run);
mangle_Bit(run, printable); size_t destOff = off + 1;
size_t maxSz = run->dynfile->size - destOff;
/* No space to repeat */
if (!maxSz) {
mangle_Bytes(run, printable);
return; return;
} }
mangle_DictionaryNoCheck(run); size_t len = mangle_getLen(maxSz);
len = mangle_Inflate(run, destOff, len, printable);
memset(&run->dynfile->data[destOff], run->dynfile->data[off], len);
} }
static void mangle_Magic(run_t* run, bool printable) { static void mangle_Bit(run_t* run, bool printable) {
static const struct { size_t off = mangle_getOffSet(run);
const uint8_t val[8]; run->dynfile->data[off] ^= (uint8_t)(1U << util_rndGet(0, 7));
const size_t size; if (printable) {
} mangleMagicVals[] = { util_turnToPrintable(&(run->dynfile->data[off]), 1);
/* 1B - No endianness */ }
{"\x00\x00\x00\x00\x00\x00\x00\x00", 1}, }
{"\x01\x00\x00\x00\x00\x00\x00\x00", 1},
{"\x02\x00\x00\x00\x00\x00\x00\x00", 1}, static const struct {
{"\x03\x00\x00\x00\x00\x00\x00\x00", 1}, const uint8_t val[8];
{"\x04\x00\x00\x00\x00\x00\x00\x00", 1}, const size_t size;
{"\x05\x00\x00\x00\x00\x00\x00\x00", 1}, } mangleMagicVals[] = {
{"\x06\x00\x00\x00\x00\x00\x00\x00", 1}, /* 1B - No endianness */
{"\x07\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x00\x00\x00\x00\x00\x00\x00\x00", 1},
{"\x08\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x01\x00\x00\x00\x00\x00\x00\x00", 1},
{"\x09\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x02\x00\x00\x00\x00\x00\x00\x00", 1},
{"\x0A\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x03\x00\x00\x00\x00\x00\x00\x00", 1},
{"\x0B\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x04\x00\x00\x00\x00\x00\x00\x00", 1},
{"\x0C\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x05\x00\x00\x00\x00\x00\x00\x00", 1},
{"\x0D\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x06\x00\x00\x00\x00\x00\x00\x00", 1},
{"\x0E\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x07\x00\x00\x00\x00\x00\x00\x00", 1},
{"\x0F\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x08\x00\x00\x00\x00\x00\x00\x00", 1},
{"\x10\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x09\x00\x00\x00\x00\x00\x00\x00", 1},
{"\x20\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x0A\x00\x00\x00\x00\x00\x00\x00", 1},
{"\x40\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x0B\x00\x00\x00\x00\x00\x00\x00", 1},
{"\x7E\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x0C\x00\x00\x00\x00\x00\x00\x00", 1},
{"\x7F\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x0D\x00\x00\x00\x00\x00\x00\x00", 1},
{"\x80\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x0E\x00\x00\x00\x00\x00\x00\x00", 1},
{"\x81\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x0F\x00\x00\x00\x00\x00\x00\x00", 1},
{"\xC0\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x10\x00\x00\x00\x00\x00\x00\x00", 1},
{"\xFE\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x20\x00\x00\x00\x00\x00\x00\x00", 1},
{"\xFF\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x40\x00\x00\x00\x00\x00\x00\x00", 1},
/* 2B - NE */ {"\x7E\x00\x00\x00\x00\x00\x00\x00", 1},
{"\x00\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x7F\x00\x00\x00\x00\x00\x00\x00", 1},
{"\x01\x01\x00\x00\x00\x00\x00\x00", 2}, {"\x80\x00\x00\x00\x00\x00\x00\x00", 1},
{"\x80\x80\x00\x00\x00\x00\x00\x00", 2}, {"\x81\x00\x00\x00\x00\x00\x00\x00", 1},
{"\xFF\xFF\x00\x00\x00\x00\x00\x00", 2}, {"\xC0\x00\x00\x00\x00\x00\x00\x00", 1},
/* 2B - BE */ {"\xFE\x00\x00\x00\x00\x00\x00\x00", 1},
{"\x00\x01\x00\x00\x00\x00\x00\x00", 2}, {"\xFF\x00\x00\x00\x00\x00\x00\x00", 1},
{"\x00\x02\x00\x00\x00\x00\x00\x00", 2}, /* 2B - NE */
{"\x00\x03\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x00\x00\x00\x00\x00\x00\x00", 2},
{"\x00\x04\x00\x00\x00\x00\x00\x00", 2}, {"\x01\x01\x00\x00\x00\x00\x00\x00", 2},
{"\x00\x05\x00\x00\x00\x00\x00\x00", 2}, {"\x80\x80\x00\x00\x00\x00\x00\x00", 2},
{"\x00\x06\x00\x00\x00\x00\x00\x00", 2}, {"\xFF\xFF\x00\x00\x00\x00\x00\x00", 2},
{"\x00\x07\x00\x00\x00\x00\x00\x00", 2}, /* 2B - BE */
{"\x00\x08\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x01\x00\x00\x00\x00\x00\x00", 2},
{"\x00\x09\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x02\x00\x00\x00\x00\x00\x00", 2},
{"\x00\x0A\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x03\x00\x00\x00\x00\x00\x00", 2},
{"\x00\x0B\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x04\x00\x00\x00\x00\x00\x00", 2},
{"\x00\x0C\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x05\x00\x00\x00\x00\x00\x00", 2},
{"\x00\x0D\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x06\x00\x00\x00\x00\x00\x00", 2},
{"\x00\x0E\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x07\x00\x00\x00\x00\x00\x00", 2},
{"\x00\x0F\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x08\x00\x00\x00\x00\x00\x00", 2},
{"\x00\x10\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x09\x00\x00\x00\x00\x00\x00", 2},
{"\x00\x20\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x0A\x00\x00\x00\x00\x00\x00", 2},
{"\x00\x40\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x0B\x00\x00\x00\x00\x00\x00", 2},
{"\x00\x7E\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x0C\x00\x00\x00\x00\x00\x00", 2},
{"\x00\x7F\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x0D\x00\x00\x00\x00\x00\x00", 2},
{"\x00\x80\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x0E\x00\x00\x00\x00\x00\x00", 2},
{"\x00\x81\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x0F\x00\x00\x00\x00\x00\x00", 2},
{"\x00\xC0\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x10\x00\x00\x00\x00\x00\x00", 2},
{"\x00\xFE\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x20\x00\x00\x00\x00\x00\x00", 2},
{"\x00\xFF\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x40\x00\x00\x00\x00\x00\x00", 2},
{"\x7E\xFF\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x7E\x00\x00\x00\x00\x00\x00", 2},
{"\x7F\xFF\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x7F\x00\x00\x00\x00\x00\x00", 2},
{"\x80\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x80\x00\x00\x00\x00\x00\x00", 2},
{"\x80\x01\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x81\x00\x00\x00\x00\x00\x00", 2},
{"\xFF\xFE\x00\x00\x00\x00\x00\x00", 2}, {"\x00\xC0\x00\x00\x00\x00\x00\x00", 2},
/* 2B - LE */ {"\x00\xFE\x00\x00\x00\x00\x00\x00", 2},
{"\x00\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x00\xFF\x00\x00\x00\x00\x00\x00", 2},
{"\x01\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x7E\xFF\x00\x00\x00\x00\x00\x00", 2},
{"\x02\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x7F\xFF\x00\x00\x00\x00\x00\x00", 2},
{"\x03\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x80\x00\x00\x00\x00\x00\x00\x00", 2},
{"\x04\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x80\x01\x00\x00\x00\x00\x00\x00", 2},
{"\x05\x00\x00\x00\x00\x00\x00\x00", 2}, {"\xFF\xFE\x00\x00\x00\x00\x00\x00", 2},
{"\x06\x00\x00\x00\x00\x00\x00\x00", 2}, /* 2B - LE */
{"\x07\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x00\x00\x00\x00\x00\x00\x00", 2},
{"\x08\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x01\x00\x00\x00\x00\x00\x00\x00", 2},
{"\x09\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x02\x00\x00\x00\x00\x00\x00\x00", 2},
{"\x0A\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x03\x00\x00\x00\x00\x00\x00\x00", 2},
{"\x0B\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x04\x00\x00\x00\x00\x00\x00\x00", 2},
{"\x0C\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x05\x00\x00\x00\x00\x00\x00\x00", 2},
{"\x0D\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x06\x00\x00\x00\x00\x00\x00\x00", 2},
{"\x0E\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x07\x00\x00\x00\x00\x00\x00\x00", 2},
{"\x0F\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x08\x00\x00\x00\x00\x00\x00\x00", 2},
{"\x10\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x09\x00\x00\x00\x00\x00\x00\x00", 2},
{"\x20\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x0A\x00\x00\x00\x00\x00\x00\x00", 2},
{"\x40\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x0B\x00\x00\x00\x00\x00\x00\x00", 2},
{"\x7E\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x0C\x00\x00\x00\x00\x00\x00\x00", 2},
{"\x7F\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x0D\x00\x00\x00\x00\x00\x00\x00", 2},
{"\x80\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x0E\x00\x00\x00\x00\x00\x00\x00", 2},
{"\x81\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x0F\x00\x00\x00\x00\x00\x00\x00", 2},
{"\xC0\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x10\x00\x00\x00\x00\x00\x00\x00", 2},
{"\xFE\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x20\x00\x00\x00\x00\x00\x00\x00", 2},
{"\xFF\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x40\x00\x00\x00\x00\x00\x00\x00", 2},
{"\xFF\x7E\x00\x00\x00\x00\x00\x00", 2}, {"\x7E\x00\x00\x00\x00\x00\x00\x00", 2},
{"\xFF\x7F\x00\x00\x00\x00\x00\x00", 2}, {"\x7F\x00\x00\x00\x00\x00\x00\x00", 2},
{"\x00\x80\x00\x00\x00\x00\x00\x00", 2}, {"\x80\x00\x00\x00\x00\x00\x00\x00", 2},
{"\x01\x80\x00\x00\x00\x00\x00\x00", 2}, {"\x81\x00\x00\x00\x00\x00\x00\x00", 2},
{"\xFE\xFF\x00\x00\x00\x00\x00\x00", 2}, {"\xC0\x00\x00\x00\x00\x00\x00\x00", 2},
/* 4B - NE */ {"\xFE\x00\x00\x00\x00\x00\x00\x00", 2},
{"\x00\x00\x00\x00\x00\x00\x00\x00", 4}, {"\xFF\x00\x00\x00\x00\x00\x00\x00", 2},
{"\x01\x01\x01\x01\x00\x00\x00\x00", 4}, {"\xFF\x7E\x00\x00\x00\x00\x00\x00", 2},
{"\x80\x80\x80\x80\x00\x00\x00\x00", 4}, {"\xFF\x7F\x00\x00\x00\x00\x00\x00", 2},
{"\xFF\xFF\xFF\xFF\x00\x00\x00\x00", 4}, {"\x00\x80\x00\x00\x00\x00\x00\x00", 2},
/* 4B - BE */ {"\x01\x80\x00\x00\x00\x00\x00\x00", 2},
{"\x00\x00\x00\x01\x00\x00\x00\x00", 4}, {"\xFE\xFF\x00\x00\x00\x00\x00\x00", 2},
{"\x00\x00\x00\x02\x00\x00\x00\x00", 4}, /* 4B - NE */
{"\x00\x00\x00\x03\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x00\x00\x00\x00\x00", 4},
{"\x00\x00\x00\x04\x00\x00\x00\x00", 4}, {"\x01\x01\x01\x01\x00\x00\x00\x00", 4},
{"\x00\x00\x00\x05\x00\x00\x00\x00", 4}, {"\x80\x80\x80\x80\x00\x00\x00\x00", 4},
{"\x00\x00\x00\x06\x00\x00\x00\x00", 4}, {"\xFF\xFF\xFF\xFF\x00\x00\x00\x00", 4},
{"\x00\x00\x00\x07\x00\x00\x00\x00", 4}, /* 4B - BE */
{"\x00\x00\x00\x08\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x01\x00\x00\x00\x00", 4},
{"\x00\x00\x00\x09\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x02\x00\x00\x00\x00", 4},
{"\x00\x00\x00\x0A\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x03\x00\x00\x00\x00", 4},
{"\x00\x00\x00\x0B\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x04\x00\x00\x00\x00", 4},
{"\x00\x00\x00\x0C\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x05\x00\x00\x00\x00", 4},
{"\x00\x00\x00\x0D\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x06\x00\x00\x00\x00", 4},
{"\x00\x00\x00\x0E\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x07\x00\x00\x00\x00", 4},
{"\x00\x00\x00\x0F\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x08\x00\x00\x00\x00", 4},
{"\x00\x00\x00\x10\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x09\x00\x00\x00\x00", 4},
{"\x00\x00\x00\x20\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x0A\x00\x00\x00\x00", 4},
{"\x00\x00\x00\x40\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x0B\x00\x00\x00\x00", 4},
{"\x00\x00\x00\x7E\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x0C\x00\x00\x00\x00", 4},
{"\x00\x00\x00\x7F\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x0D\x00\x00\x00\x00", 4},
{"\x00\x00\x00\x80\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x0E\x00\x00\x00\x00", 4},
{"\x00\x00\x00\x81\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x0F\x00\x00\x00\x00", 4},
{"\x00\x00\x00\xC0\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x10\x00\x00\x00\x00", 4},
{"\x00\x00\x00\xFE\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x20\x00\x00\x00\x00", 4},
{"\x00\x00\x00\xFF\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x40\x00\x00\x00\x00", 4},
{"\x7E\xFF\xFF\xFF\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x7E\x00\x00\x00\x00", 4},
{"\x7F\xFF\xFF\xFF\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x7F\x00\x00\x00\x00", 4},
{"\x80\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x80\x00\x00\x00\x00", 4},
{"\x80\x00\x00\x01\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x81\x00\x00\x00\x00", 4},
{"\xFF\xFF\xFF\xFE\x00\x00\x00\x00", 4}, {"\x00\x00\x00\xC0\x00\x00\x00\x00", 4},
/* 4B - LE */ {"\x00\x00\x00\xFE\x00\x00\x00\x00", 4},
{"\x00\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x00\x00\x00\xFF\x00\x00\x00\x00", 4},
{"\x01\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x7E\xFF\xFF\xFF\x00\x00\x00\x00", 4},
{"\x02\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x7F\xFF\xFF\xFF\x00\x00\x00\x00", 4},
{"\x03\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x80\x00\x00\x00\x00\x00\x00\x00", 4},
{"\x04\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x80\x00\x00\x01\x00\x00\x00\x00", 4},
{"\x05\x00\x00\x00\x00\x00\x00\x00", 4}, {"\xFF\xFF\xFF\xFE\x00\x00\x00\x00", 4},
{"\x06\x00\x00\x00\x00\x00\x00\x00", 4}, /* 4B - LE */
{"\x07\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x00\x00\x00\x00\x00", 4},
{"\x08\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x01\x00\x00\x00\x00\x00\x00\x00", 4},
{"\x09\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x02\x00\x00\x00\x00\x00\x00\x00", 4},
{"\x0A\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x03\x00\x00\x00\x00\x00\x00\x00", 4},
{"\x0B\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x04\x00\x00\x00\x00\x00\x00\x00", 4},
{"\x0C\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x05\x00\x00\x00\x00\x00\x00\x00", 4},
{"\x0D\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x06\x00\x00\x00\x00\x00\x00\x00", 4},
{"\x0E\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x07\x00\x00\x00\x00\x00\x00\x00", 4},
{"\x0F\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x08\x00\x00\x00\x00\x00\x00\x00", 4},
{"\x10\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x09\x00\x00\x00\x00\x00\x00\x00", 4},
{"\x20\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x0A\x00\x00\x00\x00\x00\x00\x00", 4},
{"\x40\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x0B\x00\x00\x00\x00\x00\x00\x00", 4},
{"\x7E\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x0C\x00\x00\x00\x00\x00\x00\x00", 4},
{"\x7F\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x0D\x00\x00\x00\x00\x00\x00\x00", 4},
{"\x80\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x0E\x00\x00\x00\x00\x00\x00\x00", 4},
{"\x81\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x0F\x00\x00\x00\x00\x00\x00\x00", 4},
{"\xC0\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x10\x00\x00\x00\x00\x00\x00\x00", 4},
{"\xFE\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x20\x00\x00\x00\x00\x00\x00\x00", 4},
{"\xFF\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x40\x00\x00\x00\x00\x00\x00\x00", 4},
{"\xFF\xFF\xFF\x7E\x00\x00\x00\x00", 4}, {"\x7E\x00\x00\x00\x00\x00\x00\x00", 4},
{"\xFF\xFF\xFF\x7F\x00\x00\x00\x00", 4}, {"\x7F\x00\x00\x00\x00\x00\x00\x00", 4},
{"\x00\x00\x00\x80\x00\x00\x00\x00", 4}, {"\x80\x00\x00\x00\x00\x00\x00\x00", 4},
{"\x01\x00\x00\x80\x00\x00\x00\x00", 4}, {"\x81\x00\x00\x00\x00\x00\x00\x00", 4},
{"\xFE\xFF\xFF\xFF\x00\x00\x00\x00", 4}, {"\xC0\x00\x00\x00\x00\x00\x00\x00", 4},
/* 8B - NE */ {"\xFE\x00\x00\x00\x00\x00\x00\x00", 4},
{"\x00\x00\x00\x00\x00\x00\x00\x00", 8}, {"\xFF\x00\x00\x00\x00\x00\x00\x00", 4},
{"\x01\x01\x01\x01\x01\x01\x01\x01", 8}, {"\xFF\xFF\xFF\x7E\x00\x00\x00\x00", 4},
{"\x80\x80\x80\x80\x80\x80\x80\x80", 8}, {"\xFF\xFF\xFF\x7F\x00\x00\x00\x00", 4},
{"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 8}, {"\x00\x00\x00\x80\x00\x00\x00\x00", 4},
/* 8B - BE */ {"\x01\x00\x00\x80\x00\x00\x00\x00", 4},
{"\x00\x00\x00\x00\x00\x00\x00\x01", 8}, {"\xFE\xFF\xFF\xFF\x00\x00\x00\x00", 4},
{"\x00\x00\x00\x00\x00\x00\x00\x02", 8}, /* 8B - NE */
{"\x00\x00\x00\x00\x00\x00\x00\x03", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x00", 8},
{"\x00\x00\x00\x00\x00\x00\x00\x04", 8}, {"\x01\x01\x01\x01\x01\x01\x01\x01", 8},
{"\x00\x00\x00\x00\x00\x00\x00\x05", 8}, {"\x80\x80\x80\x80\x80\x80\x80\x80", 8},
{"\x00\x00\x00\x00\x00\x00\x00\x06", 8}, {"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 8},
{"\x00\x00\x00\x00\x00\x00\x00\x07", 8}, /* 8B - BE */
{"\x00\x00\x00\x00\x00\x00\x00\x08", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x01", 8},
{"\x00\x00\x00\x00\x00\x00\x00\x09", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x02", 8},
{"\x00\x00\x00\x00\x00\x00\x00\x0A", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x03", 8},
{"\x00\x00\x00\x00\x00\x00\x00\x0B", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x04", 8},
{"\x00\x00\x00\x00\x00\x00\x00\x0C", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x05", 8},
{"\x00\x00\x00\x00\x00\x00\x00\x0D", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x06", 8},
{"\x00\x00\x00\x00\x00\x00\x00\x0E", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x07", 8},
{"\x00\x00\x00\x00\x00\x00\x00\x0F", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x08", 8},
{"\x00\x00\x00\x00\x00\x00\x00\x10", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x09", 8},
{"\x00\x00\x00\x00\x00\x00\x00\x20", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x0A", 8},
{"\x00\x00\x00\x00\x00\x00\x00\x40", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x0B", 8},
{"\x00\x00\x00\x00\x00\x00\x00\x7E", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x0C", 8},
{"\x00\x00\x00\x00\x00\x00\x00\x7F", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x0D", 8},
{"\x00\x00\x00\x00\x00\x00\x00\x80", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x0E", 8},
{"\x00\x00\x00\x00\x00\x00\x00\x81", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x0F", 8},
{"\x00\x00\x00\x00\x00\x00\x00\xC0", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x10", 8},
{"\x00\x00\x00\x00\x00\x00\x00\xFE", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x20", 8},
{"\x00\x00\x00\x00\x00\x00\x00\xFF", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x40", 8},
{"\x7E\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x7E", 8},
{"\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x7F", 8},
{"\x80\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x80", 8},
{"\x80\x00\x00\x00\x00\x00\x00\x01", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x81", 8},
{"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFE", 8}, {"\x00\x00\x00\x00\x00\x00\x00\xC0", 8},
/* 8B - LE */ {"\x00\x00\x00\x00\x00\x00\x00\xFE", 8},
{"\x00\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x00\x00\x00\x00\x00\x00\x00\xFF", 8},
{"\x01\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x7E\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 8},
{"\x02\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 8},
{"\x03\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x80\x00\x00\x00\x00\x00\x00\x00", 8},
{"\x04\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x80\x00\x00\x00\x00\x00\x00\x01", 8},
{"\x05\x00\x00\x00\x00\x00\x00\x00", 8}, {"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFE", 8},
{"\x06\x00\x00\x00\x00\x00\x00\x00", 8}, /* 8B - LE */
{"\x07\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x00", 8},
{"\x08\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x01\x00\x00\x00\x00\x00\x00\x00", 8},
{"\x09\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x02\x00\x00\x00\x00\x00\x00\x00", 8},
{"\x0A\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x03\x00\x00\x00\x00\x00\x00\x00", 8},
{"\x0B\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x04\x00\x00\x00\x00\x00\x00\x00", 8},
{"\x0C\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x05\x00\x00\x00\x00\x00\x00\x00", 8},
{"\x0D\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x06\x00\x00\x00\x00\x00\x00\x00", 8},
{"\x0E\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x07\x00\x00\x00\x00\x00\x00\x00", 8},
{"\x0F\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x08\x00\x00\x00\x00\x00\x00\x00", 8},
{"\x10\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x09\x00\x00\x00\x00\x00\x00\x00", 8},
{"\x20\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x0A\x00\x00\x00\x00\x00\x00\x00", 8},
{"\x40\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x0B\x00\x00\x00\x00\x00\x00\x00", 8},
{"\x7E\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x0C\x00\x00\x00\x00\x00\x00\x00", 8},
{"\x7F\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x0D\x00\x00\x00\x00\x00\x00\x00", 8},
{"\x80\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x0E\x00\x00\x00\x00\x00\x00\x00", 8},
{"\x81\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x0F\x00\x00\x00\x00\x00\x00\x00", 8},
{"\xC0\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x10\x00\x00\x00\x00\x00\x00\x00", 8},
{"\xFE\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x20\x00\x00\x00\x00\x00\x00\x00", 8},
{"\xFF\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x40\x00\x00\x00\x00\x00\x00\x00", 8},
{"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7E", 8}, {"\x7E\x00\x00\x00\x00\x00\x00\x00", 8},
{"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7F", 8}, {"\x7F\x00\x00\x00\x00\x00\x00\x00", 8},
{"\x00\x00\x00\x00\x00\x00\x00\x80", 8}, {"\x80\x00\x00\x00\x00\x00\x00\x00", 8},
{"\x01\x00\x00\x00\x00\x00\x00\x80", 8}, {"\x81\x00\x00\x00\x00\x00\x00\x00", 8},
{"\xFE\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 8}, {"\xC0\x00\x00\x00\x00\x00\x00\x00", 8},
}; {"\xFE\x00\x00\x00\x00\x00\x00\x00", 8},
{"\xFF\x00\x00\x00\x00\x00\x00\x00", 8},
{"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7E", 8},
{"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7F", 8},
{"\x00\x00\x00\x00\x00\x00\x00\x80", 8},
{"\x01\x00\x00\x00\x00\x00\x00\x80", 8},
{"\xFE\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 8},
};
size_t off = util_rndGet(0, run->dynamicFileSz - 1); static void mangle_Magic(run_t* run, bool printable) {
uint64_t choice = util_rndGet(0, ARRAYSIZE(mangleMagicVals) - 1); uint64_t choice = util_rndGet(0, ARRAYSIZE(mangleMagicVals) - 1);
mangle_Overwrite(run, mangleMagicVals[choice].val, off, mangleMagicVals[choi mangle_UseValue(run, mangleMagicVals[choice].val, mangleMagicVals[choice].si
ce].size); ze, printable);
}
if (printable) { static void mangle_StaticDict(run_t* run, bool printable) {
util_turnToPrintable(&run->dynamicFile[off], mangleMagicVals[choice].siz if (run->global->mutate.dictionaryCnt == 0) {
e); mangle_Bytes(run, printable);
return;
} }
uint64_t choice = util_rndGet(0, run->global->mutate.dictionaryCnt - 1);
mangle_UseValue(run, run->global->mutate.dictionary[choice].val,
run->global->mutate.dictionary[choice].len, printable);
} }
static void mangle_ConstCmpFeedback(run_t* run, bool printable) { static inline const uint8_t* mangle_FeedbackDict(run_t* run, size_t* len) {
if (!run->global->feedback.cmpFeedback) { if (!run->global->feedback.cmpFeedback) {
mangle_Magic(run, printable); return NULL;
return;
} }
cmpfeedback_t* cmpf = run->global->feedback.cmpFeedbackMap; cmpfeedback_t* cmpf = run->global->feedback.cmpFeedbackMap;
uint32_t cnt = ATOMIC_GET(cmpf->cnt); uint32_t cnt = ATOMIC_GET(cmpf->cnt);
if (cnt == 0) { if (cnt == 0) {
mangle_Magic(run, printable); return NULL;
return;
} }
if (cnt > ARRAYSIZE(cmpf->valArr)) { if (cnt > ARRAYSIZE(cmpf->valArr)) {
cnt = ARRAYSIZE(cmpf->valArr); cnt = ARRAYSIZE(cmpf->valArr);
} }
size_t off = util_rndGet(0, run->dynamicFileSz - 1);
uint32_t choice = util_rndGet(0, cnt - 1); uint32_t choice = util_rndGet(0, cnt - 1);
uint32_t len = ATOMIC_GET(cmpf->valArr[choice].len); *len = (size_t)ATOMIC_GET(cmpf->valArr[choice].len);
if (len == 0) { if (*len == 0) {
mangle_Magic(run, printable); return NULL;
}
return cmpf->valArr[choice].val;
}
static void mangle_ConstFeedbackDict(run_t* run, bool printable) {
size_t len;
const uint8_t* val = mangle_FeedbackDict(run, &len);
if (val == NULL) {
mangle_Bytes(run, printable);
return; return;
} }
mangle_UseValue(run, val, len, printable);
}
mangle_Overwrite(run, cmpf->valArr[choice].val, off, len); static void mangle_MemSet(run_t* run, bool printable) {
size_t off = mangle_getOffSet(run);
size_t len = mangle_getLen(run->dynfile->size - off);
int val = printable ? (int)util_rndPrintable() : (int)util_rndGet(0, UINT8_M
AX);
memset(&run->dynfile->data[off], val, len);
}
static void mangle_RandomOverwrite(run_t* run, bool printable) {
size_t off = mangle_getOffSet(run);
size_t len = mangle_getLen(run->dynfile->size - off);
if (printable) { if (printable) {
util_turnToPrintable(&run->dynamicFile[off], len); util_rndBufPrintable(&run->dynfile->data[off], len);
} else {
util_rndBuf(&run->dynfile->data[off], len);
} }
} }
static void mangle_MemSetWithVal(run_t* run, int val) { static void mangle_RandomInsert(run_t* run, bool printable) {
size_t off = util_rndGet(0, run->dynamicFileSz - 1); size_t off = mangle_getOffSet(run);
size_t sz = util_rndGet(1, run->dynamicFileSz - off); size_t len = mangle_getLen(run->dynfile->size - off);
memset(&run->dynamicFile[off], val, sz); len = mangle_Inflate(run, off, len, printable);
}
static void mangle_MemSet(run_t* run, bool printable) {
mangle_MemSetWithVal(
run, printable ? (int)util_rndPrintable() : (int)util_rndGet(0, UINT8_MA
X));
}
static void mangle_Random(run_t* run, bool printable) {
size_t off = util_rndGet(0, run->dynamicFileSz - 1);
size_t len = util_rndGet(1, run->dynamicFileSz - off);
if (printable) { if (printable) {
util_rndBufPrintable(&run->dynamicFile[off], len); util_rndBufPrintable(&run->dynfile->data[off], len);
} else { } else {
util_rndBuf(&run->dynamicFile[off], len); util_rndBuf(&run->dynfile->data[off], len);
} }
} }
static void mangle_AddSubWithRange(run_t* run, size_t off, uint64_t varLen) { static inline void mangle_AddSubWithRange(
int delta = (int)util_rndGet(0, 8192); run_t* run, size_t off, size_t varLen, uint64_t range, bool printable) {
delta -= 4096; int64_t delta = (int64_t)util_rndGet(0, range * 2) - (int64_t)range;
switch (varLen) { switch (varLen) {
case 1: { case 1: {
run->dynamicFile[off] += delta; run->dynfile->data[off] += delta;
return;
break; break;
} }
case 2: { case 2: {
int16_t val; int16_t val;
memcpy(&val, &run->dynamicFile[off], sizeof(val)); memcpy(&val, &run->dynfile->data[off], sizeof(val));
if (util_rnd64() & 0x1) { if (util_rnd64() & 0x1) {
val += delta; val += delta;
} else { } else {
/* Foreign endianess */ /* Foreign endianess */
val = __builtin_bswap16(val); val = __builtin_bswap16(val);
val += delta; val += delta;
val = __builtin_bswap16(val); val = __builtin_bswap16(val);
} }
mangle_Overwrite(run, (uint8_t*)&val, off, varLen); mangle_Overwrite(run, off, (uint8_t*)&val, varLen, printable);
return;
break; break;
} }
case 4: { case 4: {
int32_t val; int32_t val;
memcpy(&val, &run->dynamicFile[off], sizeof(val)); memcpy(&val, &run->dynfile->data[off], sizeof(val));
if (util_rnd64() & 0x1) { if (util_rnd64() & 0x1) {
val += delta; val += delta;
} else { } else {
/* Foreign endianess */ /* Foreign endianess */
val = __builtin_bswap32(val); val = __builtin_bswap32(val);
val += delta; val += delta;
val = __builtin_bswap32(val); val = __builtin_bswap32(val);
} }
mangle_Overwrite(run, (uint8_t*)&val, off, varLen); mangle_Overwrite(run, off, (uint8_t*)&val, varLen, printable);
return;
break; break;
} }
case 8: { case 8: {
int64_t val; int64_t val;
memcpy(&val, &run->dynamicFile[off], sizeof(val)); memcpy(&val, &run->dynfile->data[off], sizeof(val));
if (util_rnd64() & 0x1) { if (util_rnd64() & 0x1) {
val += delta; val += delta;
} else { } else {
/* Foreign endianess */ /* Foreign endianess */
val = __builtin_bswap64(val); val = __builtin_bswap64(val);
val += delta; val += delta;
val = __builtin_bswap64(val); val = __builtin_bswap64(val);
} }
mangle_Overwrite(run, (uint8_t*)&val, off, varLen); mangle_Overwrite(run, off, (uint8_t*)&val, varLen, printable);
return;
break; break;
} }
default: { default: {
LOG_F("Unknown variable length size: %" PRIu64, varLen); LOG_F("Unknown variable length size: %zu", varLen);
break;
} }
} }
} }
static void mangle_AddSub(run_t* run, bool printable) { static void mangle_AddSub(run_t* run, bool printable) {
size_t off = util_rndGet(0, run->dynamicFileSz - 1); size_t off = mangle_getOffSet(run);
/* 1,2,4,8 */ /* 1,2,4,8 */
uint64_t varLen = 1U << util_rndGet(0, 3); size_t varLen = 1U << util_rndGet(0, 3);
if ((run->dynamicFileSz - off) < varLen) { if ((run->dynfile->size - off) < varLen) {
varLen = 1; varLen = 1;
} }
mangle_AddSubWithRange(run, off, varLen); uint64_t range;
if (printable) { switch (varLen) {
util_turnToPrintable((uint8_t*)&run->dynamicFile[off], varLen); case 1:
range = 16;
break;
case 2:
range = 4096;
break;
case 4:
range = 1048576;
break;
case 8:
range = 268435456;
break;
default:
LOG_F("Invalid operand size: %zu", varLen);
} }
mangle_AddSubWithRange(run, off, varLen, range, printable);
} }
static void mangle_IncByte(run_t* run, bool printable) { static void mangle_IncByte(run_t* run, bool printable) {
size_t off = util_rndGet(0, run->dynamicFileSz - 1); size_t off = mangle_getOffSet(run);
if (printable) { if (printable) {
run->dynamicFile[off] = (run->dynamicFile[off] - 32 + 1) % 95 + 32; run->dynfile->data[off] = (run->dynfile->data[off] - 32 + 1) % 95 + 32;
} else { } else {
run->dynamicFile[off] += (uint8_t)1UL; run->dynfile->data[off] += (uint8_t)1UL;
} }
} }
static void mangle_DecByte(run_t* run, bool printable) { static void mangle_DecByte(run_t* run, bool printable) {
size_t off = util_rndGet(0, run->dynamicFileSz - 1); size_t off = mangle_getOffSet(run);
if (printable) { if (printable) {
run->dynamicFile[off] = (run->dynamicFile[off] - 32 + 94) % 95 + 32; run->dynfile->data[off] = (run->dynfile->data[off] - 32 + 94) % 95 + 32;
} else { } else {
run->dynamicFile[off] -= (uint8_t)1UL; run->dynfile->data[off] -= (uint8_t)1UL;
} }
} }
static void mangle_NegByte(run_t* run, bool printable) { static void mangle_NegByte(run_t* run, bool printable) {
size_t off = util_rndGet(0, run->dynamicFileSz - 1); size_t off = mangle_getOffSet(run);
if (printable) { if (printable) {
run->dynamicFile[off] = 94 - (run->dynamicFile[off] - 32) + 32; run->dynfile->data[off] = 94 - (run->dynfile->data[off] - 32) + 32;
} else { } else {
run->dynamicFile[off] = ~(run->dynamicFile[off]); run->dynfile->data[off] = ~(run->dynfile->data[off]);
} }
} }
static void mangle_CloneByte(run_t* run, bool printable HF_ATTR_UNUSED) {
size_t off1 = util_rndGet(0, run->dynamicFileSz - 1);
size_t off2 = util_rndGet(0, run->dynamicFileSz - 1);
uint8_t tmp = run->dynamicFile[off1];
run->dynamicFile[off1] = run->dynamicFile[off2];
run->dynamicFile[off2] = tmp;
}
static void mangle_Expand(run_t* run, bool printable) { static void mangle_Expand(run_t* run, bool printable) {
size_t off = util_rndGet(0, run->dynamicFileSz - 1); size_t off = mangle_getOffSet(run);
size_t len = util_rndGet(1, run->dynamicFileSz - off); size_t len;
if (util_rnd64() % 16) {
len = mangle_getLen(HF_MIN(16, run->global->mutate.maxInputSz - off));
} else {
len = mangle_getLen(run->global->mutate.maxInputSz - off);
}
mangle_Inflate(run, off, len, printable); mangle_Inflate(run, off, len, printable);
} }
static void mangle_Shrink(run_t* run, bool printable HF_ATTR_UNUSED) { static void mangle_Shrink(run_t* run, bool printable HF_ATTR_UNUSED) {
if (run->dynamicFileSz <= 1U) { if (run->dynfile->size <= 2U) {
return;
}
size_t off_start = mangle_getOffSet(run);
size_t len = mangle_LenLeft(run, off_start);
if (len == 0) {
return; return;
} }
if (util_rnd64() % 16) {
len = mangle_getLen(HF_MIN(16, len));
} else {
len = mangle_getLen(len);
}
size_t off_end = off_start + len;
size_t len_to_move = run->dynfile->size - off_end;
mangle_Move(run, off_end, off_start, len_to_move);
input_setSize(run, run->dynfile->size - len);
}
static void mangle_ASCIINum(run_t* run, bool printable) {
size_t len = util_rndGet(2, 8);
size_t len = util_rndGet(1, run->dynamicFileSz - 1); char buf[20];
size_t off = util_rndGet(0, len); snprintf(buf, sizeof(buf), "%-19" PRId64, (int64_t)util_rnd64());
input_setSize(run, run->dynamicFileSz - len); mangle_UseValue(run, (const uint8_t*)buf, len, printable);
mangle_Move(run, off + len, off, run->dynamicFileSz); }
static void mangle_ASCIINumChange(run_t* run, bool printable) {
size_t off = mangle_getOffSet(run);
/* Find a digit */
for (; off < run->dynfile->size; off++) {
if (isdigit(run->dynfile->data[off])) {
break;
}
}
if (off == run->dynfile->size) {
mangle_Bytes(run, printable);
return;
}
size_t len = HF_MIN(20, run->dynfile->size - off);
char numbuf[21] = {};
strncpy(numbuf, (const char*)&run->dynfile->data[off], len);
uint64_t val = (uint64_t)strtoull(numbuf, NULL, 10);
switch (util_rndGet(0, 5)) {
case 0:
val += util_rndGet(1, 256);
break;
case 1:
val -= util_rndGet(1, 256);
break;
case 2:
val *= util_rndGet(1, 256);
break;
case 3:
val /= util_rndGet(1, 256);
break;
case 4:
val = ~(val);
break;
case 5:
val = util_rnd64();
break;
default:
LOG_F("Invalid choice");
};
len = HF_MIN((size_t)snprintf(numbuf, sizeof(numbuf), "%" PRIu64, val), len)
;
mangle_Overwrite(run, off, (const uint8_t*)numbuf, len, printable);
}
static void mangle_Splice(run_t* run, bool printable) {
const uint8_t* buf;
size_t sz = input_getRandomInputAsBuf(run, &buf);
if (!sz) {
mangle_Bytes(run, printable);
return;
}
size_t remoteOff = mangle_getLen(sz) - 1;
size_t len = mangle_getLen(sz - remoteOff);
mangle_UseValue(run, &buf[remoteOff], len, printable);
} }
static void mangle_Resize(run_t* run, bool printable) { static void mangle_Resize(run_t* run, bool printable) {
ssize_t oldsz = run->dynamicFileSz; ssize_t oldsz = run->dynfile->size;
ssize_t newsz = 0; ssize_t newsz = 0;
uint64_t choice = util_rndGet(0, 12); uint64_t choice = util_rndGet(0, 32);
switch (choice) { switch (choice) {
case 0 ... 7: /* Do nothing */ case 0: /* Set new size arbitrarily */
newsz = oldsz; newsz = (ssize_t)util_rndGet(1, run->global->mutate.maxInputSz);
break;
case 8: /* Set new size arbitrarily */
newsz = (ssize_t)util_rndGet(1, run->global->mutate.maxFileSz);
break; break;
case 9: /* Increase size by a small value */ case 1 ... 4: /* Increase size by a small value */
newsz = oldsz + (ssize_t)util_rndGet(1, 8); newsz = oldsz + (ssize_t)util_rndGet(0, 8);
break; break;
case 10: /* Increase size by a larger value */ case 5: /* Increase size by a larger value */
newsz = oldsz + (ssize_t)util_rndGet(9, 128); newsz = oldsz + (ssize_t)util_rndGet(9, 128);
break; break;
case 11: /* Decrease size by a small value */ case 6 ... 9: /* Decrease size by a small value */
newsz = oldsz - (ssize_t)util_rndGet(1, 8); newsz = oldsz - (ssize_t)util_rndGet(0, 8);
break; break;
case 12: /* Decrease size by a larger value */ case 10: /* Decrease size by a larger value */
newsz = oldsz - (ssize_t)util_rndGet(9, 128); newsz = oldsz - (ssize_t)util_rndGet(9, 128);
break; break;
case 11 ... 32: /* Do nothing */
newsz = oldsz;
break;
default: default:
LOG_F("Illegal value from util_rndGet: %" PRIu64, choice); LOG_F("Illegal value from util_rndGet: %" PRIu64, choice);
break; break;
} }
if (newsz < 1) { if (newsz < 1) {
newsz = 1; newsz = 1;
} }
if (newsz > (ssize_t)run->global->mutate.maxFileSz) { if (newsz > (ssize_t)run->global->mutate.maxInputSz) {
newsz = run->global->mutate.maxFileSz; newsz = run->global->mutate.maxInputSz;
} }
input_setSize(run, (size_t)newsz); input_setSize(run, (size_t)newsz);
if (newsz > oldsz) { if (newsz > oldsz) {
if (printable) { if (printable) {
util_rndBufPrintable(&run->dynamicFile[oldsz], newsz - oldsz); memset(&run->dynfile->data[oldsz], ' ', newsz - oldsz);
} else {
util_rndBuf(&run->dynamicFile[oldsz], newsz - oldsz);
} }
} }
} }
static void mangle_ASCIIVal(run_t* run, bool printable HF_ATTR_UNUSED) { void mangle_mangleContent(run_t* run, int speed_factor) {
char buf[32];
snprintf(buf, sizeof(buf), "%" PRId64, (int64_t)util_rnd64());
size_t off = util_rndGet(0, run->dynamicFileSz - 1);
mangle_Overwrite(run, (uint8_t*)buf, off, strlen(buf));
}
void mangle_mangleContent(run_t* run) {
static void (*const mangleFuncs[])(run_t * run, bool printable) = { static void (*const mangleFuncs[])(run_t * run, bool printable) = {
/* Every *Insert or Expand expands file, so add more Shrink's */
mangle_Shrink,
mangle_Shrink,
mangle_Shrink,
mangle_Shrink,
mangle_Expand,
mangle_Bit, mangle_Bit,
mangle_Bytes,
mangle_Magic,
mangle_ConstCmpFeedback,
mangle_IncByte, mangle_IncByte,
mangle_DecByte, mangle_DecByte,
mangle_NegByte, mangle_NegByte,
mangle_AddSub, mangle_AddSub,
mangle_Dictionary,
mangle_DictionaryInsert,
mangle_MemMove,
mangle_MemSet, mangle_MemSet,
mangle_Random, mangle_MemSwap,
mangle_CloneByte, mangle_MemCopy,
mangle_Expand, mangle_Bytes,
mangle_Shrink, mangle_ASCIINum,
mangle_ASCIIVal, mangle_ASCIINumChange,
mangle_ByteRepeatOverwrite,
mangle_ByteRepeatInsert,
mangle_Magic,
mangle_StaticDict,
mangle_ConstFeedbackDict,
mangle_RandomOverwrite,
mangle_RandomInsert,
mangle_Splice,
}; };
if (run->mutationsPerRun == 0U) { if (run->mutationsPerRun == 0U) {
return; return;
} }
if (run->dynfile->size == 0U) {
mangle_Resize(run, /* printable= */ run->global->cfg.only_printable);
}
uint64_t changesCnt = run->global->mutate.mutationsPerRun;
mangle_Resize(run, /* printable= */ run->global->cfg.only_printable); if (speed_factor < 5) {
changesCnt = util_rndGet(1, run->global->mutate.mutationsPerRun);
} else if (speed_factor < 10) {
changesCnt = run->global->mutate.mutationsPerRun;
} else {
changesCnt = HF_MIN(speed_factor, 12);
changesCnt = HF_MAX(changesCnt, run->global->mutate.mutationsPerRun);
}
/* If last coverage acquisition was mroe than 5 secs ago, use splicing more
frequently */
if ((time(NULL) - ATOMIC_GET(run->global->timing.lastCovUpdate)) > 5) {
if (util_rnd64() % 2) {
mangle_Splice(run, run->global->cfg.only_printable);
}
}
/* Max number of stacked changes is, by default, 6 */
uint64_t changesCnt = util_rndGet(1, run->global->mutate.mutationsPerRun);
for (uint64_t x = 0; x < changesCnt; x++) { for (uint64_t x = 0; x < changesCnt; x++) {
uint64_t choice = util_rndGet(0, ARRAYSIZE(mangleFuncs) - 1); uint64_t choice = util_rndGet(0, ARRAYSIZE(mangleFuncs) - 1);
mangleFuncs[choice](run, /* printable= */ run->global->cfg.only_printabl e); mangleFuncs[choice](run, /* printable= */ run->global->cfg.only_printabl e);
} }
wmb();
} }
 End of changes. 96 change blocks. 
433 lines changed or deleted 631 lines changed or added

Home  |  About  |  Features  |  All  |  Newest  |  Dox  |  Diffs  |  RSS Feeds  |  Screenshots  |  Comments  |  Imprint  |  Privacy  |  HTTP(S)