/* * * honggfuzz - run->dynamicFilefer mangling routines * ----------------------------------------- * * Author: * Robert Swiecki * * Copyright 2010-2018 by Google Inc. All Rights Reserved. * * 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 * a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or * implied. See the License for the specific language governing * permissions and limitations under the License. * */ #include "mangle.h" #include #include #include #include #include #include #include #include #include #include "input.h" #include "libhfcommon/common.h" #include "libhfcommon/log.h" #include "libhfcommon/util.h" static inline void mangle_Overwrite(run_t* run, const uint8_t* src, size_t off, size_t sz) { size_t maxToCopy = run->dynamicFileSz - off; if (sz > maxToCopy) { sz = maxToCopy; } memmove(&run->dynamicFile[off], src, sz); } static inline void mangle_Move(run_t* run, size_t off_from, size_t off_to, size_t len) { if (off_from >= run->dynamicFileSz) { return; } if (off_to >= run->dynamicFileSz) { return; } ssize_t len_from = (ssize_t)run->dynamicFileSz - off_from - 1; ssize_t len_to = (ssize_t)run->dynamicFileSz - off_to - 1; if ((ssize_t)len > len_from) { len = len_from; } if ((ssize_t)len > len_to) { len = len_to; } memmove(&run->dynamicFile[off_to], &run->dynamicFile[off_from], len); } static void mangle_Inflate(run_t* run, size_t off, size_t len) { if (run->dynamicFileSz >= run->global->mutate.maxFileSz) { return; } if (len > (run->global->mutate.maxFileSz - run->dynamicFileSz)) { len = run->global->mutate.maxFileSz - run->dynamicFileSz; } input_setSize(run, run->dynamicFileSz + len); mangle_Move(run, off, off + len, run->dynamicFileSz); } static void mangle_MemMove(run_t* run) { size_t off_from = util_rndGet(0, run->dynamicFileSz - 1); size_t off_to = util_rndGet(0, run->dynamicFileSz - 1); size_t len = util_rndGet(0, run->dynamicFileSz); mangle_Move(run, off_from, off_to, len); } static void mangle_Byte(run_t* run) { size_t off = util_rndGet(0, run->dynamicFileSz - 1); run->dynamicFile[off] = (uint8_t)util_rnd64(); } static void mangle_PrintableByte(run_t* run) { size_t off = util_rndGet(0, run->dynamicFileSz - 1); run->dynamicFile[off] = util_rndPrintable(); } static void mangle_Bytes(run_t* run) { size_t off = util_rndGet(0, run->dynamicFileSz - 1); uint32_t val = (uint32_t)util_rnd64(); /* Overwrite with random 2,3,4-byte values */ size_t toCopy = util_rndGet(2, 4); mangle_Overwrite(run, (uint8_t*)&val, off, toCopy); } static void mangle_PrintableBytes(run_t* run) { size_t off = util_rndGet(0, run->dynamicFileSz - 1); uint32_t val; util_rndBufPrintable((uint8_t*)&val, sizeof(val)); /* Overwrite with random 2,3,4-byte values */ size_t toCopy = util_rndGet(2, 4); mangle_Overwrite(run, (uint8_t*)&val, off, toCopy); } static void mangle_Bit(run_t* run) { size_t off = util_rndGet(0, run->dynamicFileSz - 1); run->dynamicFile[off] ^= (uint8_t)(1U << util_rndGet(0, 7)); } static void mangle_BitPrintable(run_t* run) { size_t off = util_rndGet(0, run->dynamicFileSz - 1); run->dynamicFile[off] ^= (uint8_t)(1U << util_rndGet(0, 7)); util_turnToPrintable(&(run->dynamicFile[off]), 1); } static void mangle_DictionaryInsertNoCheck(run_t* run) { uint64_t choice = util_rndGet(0, run->global->mutate.dictionaryCnt - 1); struct strings_t* str = TAILQ_FIRST(&run->global->mutate.dictq); for (uint64_t i = 0; i < choice; i++) { str = TAILQ_NEXT(str, pointers); } size_t off = util_rndGet(0, run->dynamicFileSz - 1); mangle_Inflate(run, off, str->len); mangle_Move(run, off, off + str->len, str->len); mangle_Overwrite(run, (uint8_t*)str->s, off, str->len); } static void mangle_DictionaryInsert(run_t* run) { if (run->global->mutate.dictionaryCnt == 0) { mangle_Bit(run); return; } mangle_DictionaryInsertNoCheck(run); } static void mangle_DictionaryInsertPrintable(run_t* run) { if (run->global->mutate.dictionaryCnt == 0) { mangle_BitPrintable(run); return; } mangle_DictionaryInsertNoCheck(run); } static void mangle_DictionaryNoCheck(run_t* run) { size_t off = util_rndGet(0, run->dynamicFileSz - 1); uint64_t choice = util_rndGet(0, run->global->mutate.dictionaryCnt - 1); struct strings_t* str = TAILQ_FIRST(&run->global->mutate.dictq); for (uint64_t i = 0; i < choice; i++) { str = TAILQ_NEXT(str, pointers); } mangle_Overwrite(run, (uint8_t*)str->s, off, str->len); } static void mangle_Dictionary(run_t* run) { if (run->global->mutate.dictionaryCnt == 0) { mangle_Bit(run); return; } mangle_DictionaryNoCheck(run); } static void mangle_DictionaryPrintable(run_t* run) { if (run->global->mutate.dictionaryCnt == 0) { mangle_BitPrintable(run); return; } mangle_DictionaryNoCheck(run); } static void mangle_Magic(run_t* run) { static const struct { const uint8_t val[8]; const size_t size; } mangleMagicVals[] = { /* 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}, {"\x03\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x04\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x05\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x06\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x07\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x08\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x09\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x0A\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x0B\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x0C\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x0D\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x0E\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x0F\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x10\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x20\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x40\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x7E\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x7F\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x80\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x81\x00\x00\x00\x00\x00\x00\x00", 1}, {"\xC0\x00\x00\x00\x00\x00\x00\x00", 1}, {"\xFE\x00\x00\x00\x00\x00\x00\x00", 1}, {"\xFF\x00\x00\x00\x00\x00\x00\x00", 1}, /* 2B - NE */ {"\x00\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x01\x01\x00\x00\x00\x00\x00\x00", 2}, {"\x80\x80\x00\x00\x00\x00\x00\x00", 2}, {"\xFF\xFF\x00\x00\x00\x00\x00\x00", 2}, /* 2B - BE */ {"\x00\x01\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x02\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x03\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x04\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x05\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x06\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x07\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x08\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x09\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x0A\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x0B\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x0C\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x0D\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x0E\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x0F\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x10\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x20\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x40\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x7E\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x7F\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x80\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x81\x00\x00\x00\x00\x00\x00", 2}, {"\x00\xC0\x00\x00\x00\x00\x00\x00", 2}, {"\x00\xFE\x00\x00\x00\x00\x00\x00", 2}, {"\x00\xFF\x00\x00\x00\x00\x00\x00", 2}, {"\x7E\xFF\x00\x00\x00\x00\x00\x00", 2}, {"\x7F\xFF\x00\x00\x00\x00\x00\x00", 2}, {"\x80\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x80\x01\x00\x00\x00\x00\x00\x00", 2}, {"\xFF\xFE\x00\x00\x00\x00\x00\x00", 2}, /* 2B - LE */ {"\x00\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x01\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x02\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x03\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x04\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x05\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x06\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x07\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x08\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x09\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x0A\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x0B\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x0C\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x0D\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x0E\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x0F\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x10\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x20\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x40\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x7E\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x7F\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x80\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x81\x00\x00\x00\x00\x00\x00\x00", 2}, {"\xC0\x00\x00\x00\x00\x00\x00\x00", 2}, {"\xFE\x00\x00\x00\x00\x00\x00\x00", 2}, {"\xFF\x00\x00\x00\x00\x00\x00\x00", 2}, {"\xFF\x7E\x00\x00\x00\x00\x00\x00", 2}, {"\xFF\x7F\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x80\x00\x00\x00\x00\x00\x00", 2}, {"\x01\x80\x00\x00\x00\x00\x00\x00", 2}, {"\xFE\xFF\x00\x00\x00\x00\x00\x00", 2}, /* 4B - NE */ {"\x00\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x01\x01\x01\x01\x00\x00\x00\x00", 4}, {"\x80\x80\x80\x80\x00\x00\x00\x00", 4}, {"\xFF\xFF\xFF\xFF\x00\x00\x00\x00", 4}, /* 4B - BE */ {"\x00\x00\x00\x01\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x02\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x03\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x04\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x05\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x06\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x07\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x08\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x09\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x0A\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x0B\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x0C\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x0D\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x0E\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x0F\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x10\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x20\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x40\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x7E\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x7F\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x80\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x81\x00\x00\x00\x00", 4}, {"\x00\x00\x00\xC0\x00\x00\x00\x00", 4}, {"\x00\x00\x00\xFE\x00\x00\x00\x00", 4}, {"\x00\x00\x00\xFF\x00\x00\x00\x00", 4}, {"\x7E\xFF\xFF\xFF\x00\x00\x00\x00", 4}, {"\x7F\xFF\xFF\xFF\x00\x00\x00\x00", 4}, {"\x80\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x80\x00\x00\x01\x00\x00\x00\x00", 4}, {"\xFF\xFF\xFF\xFE\x00\x00\x00\x00", 4}, /* 4B - LE */ {"\x00\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x01\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x02\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x03\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x04\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x05\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x06\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x07\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x08\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x09\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x0A\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x0B\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x0C\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x0D\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x0E\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x0F\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x10\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x20\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x40\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x7E\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x7F\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x80\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x81\x00\x00\x00\x00\x00\x00\x00", 4}, {"\xC0\x00\x00\x00\x00\x00\x00\x00", 4}, {"\xFE\x00\x00\x00\x00\x00\x00\x00", 4}, {"\xFF\x00\x00\x00\x00\x00\x00\x00", 4}, {"\xFF\xFF\xFF\x7E\x00\x00\x00\x00", 4}, {"\xFF\xFF\xFF\x7F\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x80\x00\x00\x00\x00", 4}, {"\x01\x00\x00\x80\x00\x00\x00\x00", 4}, {"\xFE\xFF\xFF\xFF\x00\x00\x00\x00", 4}, /* 8B - NE */ {"\x00\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x01\x01\x01\x01\x01\x01\x01\x01", 8}, {"\x80\x80\x80\x80\x80\x80\x80\x80", 8}, {"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 8}, /* 8B - BE */ {"\x00\x00\x00\x00\x00\x00\x00\x01", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x02", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x03", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x04", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x05", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x06", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x07", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x08", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x09", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x0A", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x0B", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x0C", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x0D", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x0E", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x0F", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x10", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x20", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x40", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x7E", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x7F", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x80", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x81", 8}, {"\x00\x00\x00\x00\x00\x00\x00\xC0", 8}, {"\x00\x00\x00\x00\x00\x00\x00\xFE", 8}, {"\x00\x00\x00\x00\x00\x00\x00\xFF", 8}, {"\x7E\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 8}, {"\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 8}, {"\x80\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x80\x00\x00\x00\x00\x00\x00\x01", 8}, {"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFE", 8}, /* 8B - LE */ {"\x00\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x01\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x02\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x03\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x04\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x05\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x06\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x07\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x08\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x09\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x0A\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x0B\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x0C\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x0D\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x0E\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x0F\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x10\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x20\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x40\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x7E\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x7F\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x80\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x81\x00\x00\x00\x00\x00\x00\x00", 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); uint64_t choice = util_rndGet(0, ARRAYSIZE(mangleMagicVals) - 1); mangle_Overwrite(run, mangleMagicVals[choice].val, off, mangleMagicVals[choice].size); } static void mangle_MagicPrintable(run_t* run) { static const struct { const uint8_t val[8]; const size_t size; } mangleMagicVals[] = { /* 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}, {"\x03\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x04\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x05\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x06\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x07\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x08\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x09\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x0A\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x0B\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x0C\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x0D\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x0E\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x0F\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x10\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x20\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x40\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x7E\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x7F\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x80\x00\x00\x00\x00\x00\x00\x00", 1}, {"\x81\x00\x00\x00\x00\x00\x00\x00", 1}, {"\xC0\x00\x00\x00\x00\x00\x00\x00", 1}, {"\xFE\x00\x00\x00\x00\x00\x00\x00", 1}, {"\xFF\x00\x00\x00\x00\x00\x00\x00", 1}, /* 2B - NE */ {"\x00\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x01\x01\x00\x00\x00\x00\x00\x00", 2}, {"\x80\x80\x00\x00\x00\x00\x00\x00", 2}, {"\xFF\xFF\x00\x00\x00\x00\x00\x00", 2}, /* 2B - BE */ {"\x00\x01\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x02\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x03\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x04\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x05\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x06\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x07\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x08\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x09\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x0A\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x0B\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x0C\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x0D\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x0E\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x0F\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x10\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x20\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x40\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x7E\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x7F\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x80\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x81\x00\x00\x00\x00\x00\x00", 2}, {"\x00\xC0\x00\x00\x00\x00\x00\x00", 2}, {"\x00\xFE\x00\x00\x00\x00\x00\x00", 2}, {"\x00\xFF\x00\x00\x00\x00\x00\x00", 2}, {"\x7E\xFF\x00\x00\x00\x00\x00\x00", 2}, {"\x7F\xFF\x00\x00\x00\x00\x00\x00", 2}, {"\x80\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x80\x01\x00\x00\x00\x00\x00\x00", 2}, {"\xFF\xFE\x00\x00\x00\x00\x00\x00", 2}, /* 2B - LE */ {"\x00\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x01\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x02\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x03\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x04\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x05\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x06\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x07\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x08\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x09\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x0A\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x0B\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x0C\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x0D\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x0E\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x0F\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x10\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x20\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x40\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x7E\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x7F\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x80\x00\x00\x00\x00\x00\x00\x00", 2}, {"\x81\x00\x00\x00\x00\x00\x00\x00", 2}, {"\xC0\x00\x00\x00\x00\x00\x00\x00", 2}, {"\xFE\x00\x00\x00\x00\x00\x00\x00", 2}, {"\xFF\x00\x00\x00\x00\x00\x00\x00", 2}, {"\xFF\x7E\x00\x00\x00\x00\x00\x00", 2}, {"\xFF\x7F\x00\x00\x00\x00\x00\x00", 2}, {"\x00\x80\x00\x00\x00\x00\x00\x00", 2}, {"\x01\x80\x00\x00\x00\x00\x00\x00", 2}, {"\xFE\xFF\x00\x00\x00\x00\x00\x00", 2}, /* 4B - NE */ {"\x00\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x01\x01\x01\x01\x00\x00\x00\x00", 4}, {"\x80\x80\x80\x80\x00\x00\x00\x00", 4}, {"\xFF\xFF\xFF\xFF\x00\x00\x00\x00", 4}, /* 4B - BE */ {"\x00\x00\x00\x01\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x02\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x03\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x04\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x05\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x06\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x07\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x08\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x09\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x0A\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x0B\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x0C\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x0D\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x0E\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x0F\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x10\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x20\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x40\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x7E\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x7F\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x80\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x81\x00\x00\x00\x00", 4}, {"\x00\x00\x00\xC0\x00\x00\x00\x00", 4}, {"\x00\x00\x00\xFE\x00\x00\x00\x00", 4}, {"\x00\x00\x00\xFF\x00\x00\x00\x00", 4}, {"\x7E\xFF\xFF\xFF\x00\x00\x00\x00", 4}, {"\x7F\xFF\xFF\xFF\x00\x00\x00\x00", 4}, {"\x80\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x80\x00\x00\x01\x00\x00\x00\x00", 4}, {"\xFF\xFF\xFF\xFE\x00\x00\x00\x00", 4}, /* 4B - LE */ {"\x00\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x01\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x02\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x03\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x04\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x05\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x06\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x07\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x08\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x09\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x0A\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x0B\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x0C\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x0D\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x0E\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x0F\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x10\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x20\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x40\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x7E\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x7F\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x80\x00\x00\x00\x00\x00\x00\x00", 4}, {"\x81\x00\x00\x00\x00\x00\x00\x00", 4}, {"\xC0\x00\x00\x00\x00\x00\x00\x00", 4}, {"\xFE\x00\x00\x00\x00\x00\x00\x00", 4}, {"\xFF\x00\x00\x00\x00\x00\x00\x00", 4}, {"\xFF\xFF\xFF\x7E\x00\x00\x00\x00", 4}, {"\xFF\xFF\xFF\x7F\x00\x00\x00\x00", 4}, {"\x00\x00\x00\x80\x00\x00\x00\x00", 4}, {"\x01\x00\x00\x80\x00\x00\x00\x00", 4}, {"\xFE\xFF\xFF\xFF\x00\x00\x00\x00", 4}, /* 8B - NE */ {"\x00\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x01\x01\x01\x01\x01\x01\x01\x01", 8}, {"\x80\x80\x80\x80\x80\x80\x80\x80", 8}, {"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 8}, /* 8B - BE */ {"\x00\x00\x00\x00\x00\x00\x00\x01", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x02", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x03", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x04", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x05", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x06", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x07", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x08", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x09", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x0A", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x0B", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x0C", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x0D", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x0E", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x0F", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x10", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x20", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x40", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x7E", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x7F", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x80", 8}, {"\x00\x00\x00\x00\x00\x00\x00\x81", 8}, {"\x00\x00\x00\x00\x00\x00\x00\xC0", 8}, {"\x00\x00\x00\x00\x00\x00\x00\xFE", 8}, {"\x00\x00\x00\x00\x00\x00\x00\xFF", 8}, {"\x7E\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 8}, {"\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 8}, {"\x80\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x80\x00\x00\x00\x00\x00\x00\x01", 8}, {"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFE", 8}, /* 8B - LE */ {"\x00\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x01\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x02\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x03\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x04\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x05\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x06\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x07\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x08\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x09\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x0A\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x0B\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x0C\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x0D\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x0E\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x0F\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x10\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x20\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x40\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x7E\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x7F\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x80\x00\x00\x00\x00\x00\x00\x00", 8}, {"\x81\x00\x00\x00\x00\x00\x00\x00", 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); uint64_t choice = util_rndGet(0, ARRAYSIZE(mangleMagicVals) - 1); mangle_Overwrite(run, mangleMagicVals[choice].val, off, mangleMagicVals[choice].size); util_turnToPrintable(&run->dynamicFile[off], mangleMagicVals[choice].size); } static void mangle_MemSetWithVal(run_t* run, int val) { size_t off = util_rndGet(0, run->dynamicFileSz - 1); size_t sz = util_rndGet(1, run->dynamicFileSz - off); memset(&run->dynamicFile[off], val, sz); } static void mangle_MemSet(run_t* run) { mangle_MemSetWithVal(run, (int)util_rndGet(0, UINT8_MAX)); } static void mangle_MemSetPrintable(run_t* run) { mangle_MemSetWithVal(run, (int)util_rndPrintable()); } static void mangle_Random(run_t* run) { size_t off = util_rndGet(0, run->dynamicFileSz - 1); size_t len = util_rndGet(1, run->dynamicFileSz - off); util_rndBuf(&run->dynamicFile[off], len); } static void mangle_RandomPrintable(run_t* run) { size_t off = util_rndGet(0, run->dynamicFileSz - 1); size_t len = util_rndGet(1, run->dynamicFileSz - off); util_rndBufPrintable(&run->dynamicFile[off], len); } static void mangle_AddSubWithRange(run_t* run, size_t off, uint64_t varLen) { int delta = (int)util_rndGet(0, 8192); delta -= 4096; switch (varLen) { case 1: { run->dynamicFile[off] += delta; return; break; } case 2: { int16_t val; memcpy(&val, &run->dynamicFile[off], sizeof(val)); if (util_rnd64() & 0x1) { val += delta; } else { /* Foreign endianess */ val = __builtin_bswap16(val); val += delta; val = __builtin_bswap16(val); } mangle_Overwrite(run, (uint8_t*)&val, off, varLen); return; break; } case 4: { int32_t val; memcpy(&val, &run->dynamicFile[off], sizeof(val)); if (util_rnd64() & 0x1) { val += delta; } else { /* Foreign endianess */ val = __builtin_bswap32(val); val += delta; val = __builtin_bswap32(val); } mangle_Overwrite(run, (uint8_t*)&val, off, varLen); return; break; } case 8: { int64_t val; memcpy(&val, &run->dynamicFile[off], sizeof(val)); if (util_rnd64() & 0x1) { val += delta; } else { /* Foreign endianess */ val = __builtin_bswap64(val); val += delta; val = __builtin_bswap64(val); } mangle_Overwrite(run, (uint8_t*)&val, off, varLen); return; break; } default: { LOG_F("Unknown variable length size: %" PRIu64, varLen); break; } } } static void mangle_AddSub(run_t* run) { size_t off = util_rndGet(0, run->dynamicFileSz - 1); /* 1,2,4,8 */ uint64_t varLen = 1U << util_rndGet(0, 3); if ((run->dynamicFileSz - off) < varLen) { varLen = 1; } mangle_AddSubWithRange(run, off, varLen); } static void mangle_AddSubPrintable(run_t* run) { size_t off = util_rndGet(0, run->dynamicFileSz - 1); /* 1,2,4,8 */ uint64_t varLen = 1U << util_rndGet(0, 3); if ((run->dynamicFileSz - off) < varLen) { varLen = 1; } mangle_AddSubWithRange(run, off, varLen); util_turnToPrintable((uint8_t*)&run->dynamicFile[off], varLen); } static void mangle_IncByte(run_t* run) { size_t off = util_rndGet(0, run->dynamicFileSz - 1); run->dynamicFile[off] += (uint8_t)1UL; } static void mangle_IncBytePrintable(run_t* run) { size_t off = util_rndGet(0, run->dynamicFileSz - 1); run->dynamicFile[off] = (run->dynamicFile[off] - 32 + 1) % 95 + 32; } static void mangle_DecByte(run_t* run) { size_t off = util_rndGet(0, run->dynamicFileSz - 1); run->dynamicFile[off] -= (uint8_t)1UL; } static void mangle_DecBytePrintable(run_t* run) { size_t off = util_rndGet(0, run->dynamicFileSz - 1); run->dynamicFile[off] = (run->dynamicFile[off] - 32 + 94) % 95 + 32; } static void mangle_NegByte(run_t* run) { size_t off = util_rndGet(0, run->dynamicFileSz - 1); run->dynamicFile[off] = ~(run->dynamicFile[off]); } static void mangle_NegBytePrintable(run_t* run) { size_t off = util_rndGet(0, run->dynamicFileSz - 1); run->dynamicFile[off] = 94 - (run->dynamicFile[off] - 32) + 32; } static void mangle_CloneByte(run_t* run) { 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_Resize(run_t* run) { size_t sz = util_rndGet(1, run->global->mutate.maxFileSz); input_setSize(run, sz); } static void mangle_Expand(run_t* run) { size_t off = util_rndGet(0, run->dynamicFileSz - 1); size_t len = util_rndGet(1, run->dynamicFileSz - off); mangle_Inflate(run, off, len); mangle_Move(run, off, off + len, run->dynamicFileSz); } static void mangle_Shrink(run_t* run) { if (run->dynamicFileSz <= 1U) { return; } size_t len = util_rndGet(1, run->dynamicFileSz - 1); size_t off = util_rndGet(0, len); input_setSize(run, run->dynamicFileSz - len); mangle_Move(run, off + len, off, run->dynamicFileSz); } static void mangle_InsertRnd(run_t* run) { size_t off = util_rndGet(0, run->dynamicFileSz - 1); size_t len = util_rndGet(1, run->dynamicFileSz - off); mangle_Inflate(run, off, len); mangle_Move(run, off, off + len, run->dynamicFileSz); util_rndBuf(&run->dynamicFile[off], len); } static void mangle_InsertRndPrintable(run_t* run) { size_t off = util_rndGet(0, run->dynamicFileSz - 1); size_t len = util_rndGet(1, run->dynamicFileSz - off); mangle_Inflate(run, off, len); mangle_Move(run, off, off + len, run->dynamicFileSz); util_rndBufPrintable(&run->dynamicFile[off], len); } static void mangle_ASCIIVal(run_t* run) { 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) = { mangle_Resize, mangle_Byte, mangle_Bit, mangle_Bytes, mangle_Magic, mangle_IncByte, mangle_DecByte, mangle_NegByte, mangle_AddSub, mangle_Dictionary, mangle_DictionaryInsert, mangle_MemMove, mangle_MemSet, mangle_Random, mangle_CloneByte, mangle_Expand, mangle_Shrink, mangle_InsertRnd, mangle_ASCIIVal, }; static void (*const manglePrintableFuncs[])(run_t * run) = { mangle_Resize, mangle_PrintableByte, mangle_BitPrintable, mangle_PrintableBytes, mangle_MagicPrintable, mangle_IncBytePrintable, mangle_DecBytePrintable, mangle_NegBytePrintable, mangle_AddSubPrintable, mangle_DictionaryPrintable, mangle_DictionaryInsertPrintable, mangle_MemMove, mangle_MemSetPrintable, mangle_RandomPrintable, mangle_CloneByte, mangle_Expand, mangle_Shrink, mangle_InsertRndPrintable, mangle_ASCIIVal, }; if (run->mutationsPerRun == 0U) { return; } /* No point in modifying it, if its size is 0 */ if (run->dynamicFileSz == 0UL) { input_setSize(run, 1UL); } /* Max number of stacked changes is, by default, 6 */ uint64_t changesCnt = util_rndGet(1, run->global->mutate.mutationsPerRun); if (run->global->cfg.only_printable) { for (uint64_t x = 0; x < changesCnt; x++) { uint64_t choice = util_rndGet(0, ARRAYSIZE(manglePrintableFuncs) - 1); manglePrintableFuncs[choice](run); } } else { for (uint64_t x = 0; x < changesCnt; x++) { uint64_t choice = util_rndGet(0, ARRAYSIZE(mangleFuncs) - 1); mangleFuncs[choice](run); } } }