1*08b48e0bSAndroid Build Coastguard Worker /* 2*08b48e0bSAndroid Build Coastguard Worker american fuzzy lop++ - common routines header 3*08b48e0bSAndroid Build Coastguard Worker --------------------------------------------- 4*08b48e0bSAndroid Build Coastguard Worker 5*08b48e0bSAndroid Build Coastguard Worker Originally written by Michal Zalewski 6*08b48e0bSAndroid Build Coastguard Worker 7*08b48e0bSAndroid Build Coastguard Worker Now maintained by Marc Heuse <[email protected]>, 8*08b48e0bSAndroid Build Coastguard Worker Heiko Eißfeldt <[email protected]>, 9*08b48e0bSAndroid Build Coastguard Worker Andrea Fioraldi <[email protected]>, 10*08b48e0bSAndroid Build Coastguard Worker Dominik Maier <[email protected]> 11*08b48e0bSAndroid Build Coastguard Worker 12*08b48e0bSAndroid Build Coastguard Worker Copyright 2016, 2017 Google Inc. All rights reserved. 13*08b48e0bSAndroid Build Coastguard Worker Copyright 2019-2024 AFLplusplus Project. All rights reserved. 14*08b48e0bSAndroid Build Coastguard Worker 15*08b48e0bSAndroid Build Coastguard Worker Licensed under the Apache License, Version 2.0 (the "License"); 16*08b48e0bSAndroid Build Coastguard Worker you may not use this file except in compliance with the License. 17*08b48e0bSAndroid Build Coastguard Worker You may obtain a copy of the License at: 18*08b48e0bSAndroid Build Coastguard Worker 19*08b48e0bSAndroid Build Coastguard Worker https://www.apache.org/licenses/LICENSE-2.0 20*08b48e0bSAndroid Build Coastguard Worker 21*08b48e0bSAndroid Build Coastguard Worker Gather some functions common to multiple executables 22*08b48e0bSAndroid Build Coastguard Worker 23*08b48e0bSAndroid Build Coastguard Worker - detect_file_args 24*08b48e0bSAndroid Build Coastguard Worker 25*08b48e0bSAndroid Build Coastguard Worker */ 26*08b48e0bSAndroid Build Coastguard Worker 27*08b48e0bSAndroid Build Coastguard Worker #ifndef __AFLCOMMON_H 28*08b48e0bSAndroid Build Coastguard Worker #define __AFLCOMMON_H 29*08b48e0bSAndroid Build Coastguard Worker 30*08b48e0bSAndroid Build Coastguard Worker #include <stdio.h> 31*08b48e0bSAndroid Build Coastguard Worker #include <string.h> 32*08b48e0bSAndroid Build Coastguard Worker #include <unistd.h> 33*08b48e0bSAndroid Build Coastguard Worker #include <sys/time.h> 34*08b48e0bSAndroid Build Coastguard Worker #include <stdbool.h> 35*08b48e0bSAndroid Build Coastguard Worker #include "forkserver.h" 36*08b48e0bSAndroid Build Coastguard Worker #include "types.h" 37*08b48e0bSAndroid Build Coastguard Worker 38*08b48e0bSAndroid Build Coastguard Worker /* STRINGIFY_VAL_SIZE_MAX will fit all stringify_ strings. */ 39*08b48e0bSAndroid Build Coastguard Worker 40*08b48e0bSAndroid Build Coastguard Worker #define STRINGIFY_VAL_SIZE_MAX (16) 41*08b48e0bSAndroid Build Coastguard Worker 42*08b48e0bSAndroid Build Coastguard Worker u32 check_binary_signatures(u8 *fn); 43*08b48e0bSAndroid Build Coastguard Worker void detect_file_args(char **argv, u8 *prog_in, bool *use_stdin); 44*08b48e0bSAndroid Build Coastguard Worker void print_suggested_envs(char *mispelled_env); 45*08b48e0bSAndroid Build Coastguard Worker void check_environment_vars(char **env); 46*08b48e0bSAndroid Build Coastguard Worker void set_sanitizer_defaults(); 47*08b48e0bSAndroid Build Coastguard Worker 48*08b48e0bSAndroid Build Coastguard Worker char **argv_cpy_dup(int argc, char **argv); 49*08b48e0bSAndroid Build Coastguard Worker void argv_cpy_free(char **argv); 50*08b48e0bSAndroid Build Coastguard Worker 51*08b48e0bSAndroid Build Coastguard Worker char **get_cs_argv(u8 *own_loc, u8 **target_path_p, int argc, char **argv); 52*08b48e0bSAndroid Build Coastguard Worker char **get_qemu_argv(u8 *own_loc, u8 **target_path_p, int argc, char **argv); 53*08b48e0bSAndroid Build Coastguard Worker char **get_wine_argv(u8 *own_loc, u8 **target_path_p, int argc, char **argv); 54*08b48e0bSAndroid Build Coastguard Worker char *get_afl_env(char *env); 55*08b48e0bSAndroid Build Coastguard Worker 56*08b48e0bSAndroid Build Coastguard Worker /* Extract env vars from input string and set them using setenv() 57*08b48e0bSAndroid Build Coastguard Worker For use with AFL_TARGET_ENV, ... */ 58*08b48e0bSAndroid Build Coastguard Worker bool extract_and_set_env(u8 *env_str); 59*08b48e0bSAndroid Build Coastguard Worker 60*08b48e0bSAndroid Build Coastguard Worker extern u8 be_quiet; 61*08b48e0bSAndroid Build Coastguard Worker extern u8 *doc_path; /* path to documentation dir */ 62*08b48e0bSAndroid Build Coastguard Worker 63*08b48e0bSAndroid Build Coastguard Worker /* Find binary, used by analyze, showmap, tmin 64*08b48e0bSAndroid Build Coastguard Worker @returns the path, allocating the string */ 65*08b48e0bSAndroid Build Coastguard Worker 66*08b48e0bSAndroid Build Coastguard Worker u8 *find_binary(u8 *fname); 67*08b48e0bSAndroid Build Coastguard Worker 68*08b48e0bSAndroid Build Coastguard Worker /* find an afl binary */ 69*08b48e0bSAndroid Build Coastguard Worker 70*08b48e0bSAndroid Build Coastguard Worker u8 *find_afl_binary(u8 *own_loc, u8 *fname); 71*08b48e0bSAndroid Build Coastguard Worker 72*08b48e0bSAndroid Build Coastguard Worker /* Parses the (numeric) kill signal environment variable passed 73*08b48e0bSAndroid Build Coastguard Worker via `numeric_signal_as_str`. 74*08b48e0bSAndroid Build Coastguard Worker If NULL is passed, the `default_signal` value is returned. 75*08b48e0bSAndroid Build Coastguard Worker FATALs if `numeric_signal_as_str` is not a valid integer .*/ 76*08b48e0bSAndroid Build Coastguard Worker int parse_afl_kill_signal(u8 *numeric_signal_as_str, int default_signal); 77*08b48e0bSAndroid Build Coastguard Worker 78*08b48e0bSAndroid Build Coastguard Worker /* Configure the signals that are used to kill the forkserver 79*08b48e0bSAndroid Build Coastguard Worker and the forked childs. If `afl_kill_signal_env` or `afl_fsrv_kill_signal_env` 80*08b48e0bSAndroid Build Coastguard Worker is NULL, the appropiate values are read from the environment. */ 81*08b48e0bSAndroid Build Coastguard Worker void configure_afl_kill_signals(afl_forkserver_t *fsrv, 82*08b48e0bSAndroid Build Coastguard Worker char *afl_kill_signal_env, 83*08b48e0bSAndroid Build Coastguard Worker char *afl_fsrv_kill_signal_env, 84*08b48e0bSAndroid Build Coastguard Worker int default_server_kill_signal); 85*08b48e0bSAndroid Build Coastguard Worker 86*08b48e0bSAndroid Build Coastguard Worker /* Read a bitmap from file fname to memory 87*08b48e0bSAndroid Build Coastguard Worker This is for the -B option again. */ 88*08b48e0bSAndroid Build Coastguard Worker 89*08b48e0bSAndroid Build Coastguard Worker void read_bitmap(u8 *fname, u8 *map, size_t len); 90*08b48e0bSAndroid Build Coastguard Worker 91*08b48e0bSAndroid Build Coastguard Worker /* Get unix time in milliseconds */ 92*08b48e0bSAndroid Build Coastguard Worker 93*08b48e0bSAndroid Build Coastguard Worker u64 get_cur_time(void); 94*08b48e0bSAndroid Build Coastguard Worker 95*08b48e0bSAndroid Build Coastguard Worker /* Get unix time in microseconds */ 96*08b48e0bSAndroid Build Coastguard Worker 97*08b48e0bSAndroid Build Coastguard Worker u64 get_cur_time_us(void); 98*08b48e0bSAndroid Build Coastguard Worker 99*08b48e0bSAndroid Build Coastguard Worker /* Describe integer. The buf should be 100*08b48e0bSAndroid Build Coastguard Worker at least 6 bytes to fit all ints we randomly see. 101*08b48e0bSAndroid Build Coastguard Worker Will return buf for convenience. */ 102*08b48e0bSAndroid Build Coastguard Worker 103*08b48e0bSAndroid Build Coastguard Worker u8 *stringify_int(u8 *buf, size_t len, u64 val); 104*08b48e0bSAndroid Build Coastguard Worker 105*08b48e0bSAndroid Build Coastguard Worker /* Describe float. Similar as int. */ 106*08b48e0bSAndroid Build Coastguard Worker 107*08b48e0bSAndroid Build Coastguard Worker u8 *stringify_float(u8 *buf, size_t len, double val); 108*08b48e0bSAndroid Build Coastguard Worker 109*08b48e0bSAndroid Build Coastguard Worker /* Describe integer as memory size. */ 110*08b48e0bSAndroid Build Coastguard Worker 111*08b48e0bSAndroid Build Coastguard Worker u8 *stringify_mem_size(u8 *buf, size_t len, u64 val); 112*08b48e0bSAndroid Build Coastguard Worker 113*08b48e0bSAndroid Build Coastguard Worker /* Describe time delta as string. 114*08b48e0bSAndroid Build Coastguard Worker Returns a pointer to buf for convenience. */ 115*08b48e0bSAndroid Build Coastguard Worker 116*08b48e0bSAndroid Build Coastguard Worker u8 *stringify_time_diff(u8 *buf, size_t len, u64 cur_ms, u64 event_ms); 117*08b48e0bSAndroid Build Coastguard Worker 118*08b48e0bSAndroid Build Coastguard Worker /* Unsafe describe time delta as simple string. 119*08b48e0bSAndroid Build Coastguard Worker Returns a pointer to buf for convenience. */ 120*08b48e0bSAndroid Build Coastguard Worker 121*08b48e0bSAndroid Build Coastguard Worker u8 *u_simplestring_time_diff(u8 *buf, u64 cur_ms, u64 event_ms); 122*08b48e0bSAndroid Build Coastguard Worker 123*08b48e0bSAndroid Build Coastguard Worker /* Unsafe Describe integer. The buf sizes are not checked. 124*08b48e0bSAndroid Build Coastguard Worker This is unsafe but fast. 125*08b48e0bSAndroid Build Coastguard Worker Will return buf for convenience. */ 126*08b48e0bSAndroid Build Coastguard Worker 127*08b48e0bSAndroid Build Coastguard Worker u8 *u_stringify_int(u8 *buf, u64 val); 128*08b48e0bSAndroid Build Coastguard Worker 129*08b48e0bSAndroid Build Coastguard Worker /* Unsafe describe float. Similar as unsafe int. */ 130*08b48e0bSAndroid Build Coastguard Worker 131*08b48e0bSAndroid Build Coastguard Worker u8 *u_stringify_float(u8 *buf, double val); 132*08b48e0bSAndroid Build Coastguard Worker 133*08b48e0bSAndroid Build Coastguard Worker /* Unsafe describe integer as memory size. */ 134*08b48e0bSAndroid Build Coastguard Worker 135*08b48e0bSAndroid Build Coastguard Worker u8 *u_stringify_mem_size(u8 *buf, u64 val); 136*08b48e0bSAndroid Build Coastguard Worker 137*08b48e0bSAndroid Build Coastguard Worker /* Unsafe describe time delta as string. 138*08b48e0bSAndroid Build Coastguard Worker Returns a pointer to buf for convenience. */ 139*08b48e0bSAndroid Build Coastguard Worker 140*08b48e0bSAndroid Build Coastguard Worker u8 *u_stringify_time_diff(u8 *buf, u64 cur_ms, u64 event_ms); 141*08b48e0bSAndroid Build Coastguard Worker 142*08b48e0bSAndroid Build Coastguard Worker /* Reads the map size from ENV */ 143*08b48e0bSAndroid Build Coastguard Worker u32 get_map_size(void); 144*08b48e0bSAndroid Build Coastguard Worker 145*08b48e0bSAndroid Build Coastguard Worker /* create a stream file */ 146*08b48e0bSAndroid Build Coastguard Worker FILE *create_ffile(u8 *fn); 147*08b48e0bSAndroid Build Coastguard Worker 148*08b48e0bSAndroid Build Coastguard Worker /* create a file */ 149*08b48e0bSAndroid Build Coastguard Worker s32 create_file(u8 *fn); 150*08b48e0bSAndroid Build Coastguard Worker 151*08b48e0bSAndroid Build Coastguard Worker /* memmem implementation as not all platforms support this */ 152*08b48e0bSAndroid Build Coastguard Worker void *afl_memmem(const void *haystack, size_t haystacklen, const void *needle, 153*08b48e0bSAndroid Build Coastguard Worker size_t needlelen); 154*08b48e0bSAndroid Build Coastguard Worker 155*08b48e0bSAndroid Build Coastguard Worker #ifdef __linux__ 156*08b48e0bSAndroid Build Coastguard Worker /* Nyx helper functions to create and remove tmp workdirs */ 157*08b48e0bSAndroid Build Coastguard Worker char *create_nyx_tmp_workdir(void); 158*08b48e0bSAndroid Build Coastguard Worker void remove_nyx_tmp_workdir(afl_forkserver_t *fsrv, char *nyx_out_dir_path); 159*08b48e0bSAndroid Build Coastguard Worker #endif 160*08b48e0bSAndroid Build Coastguard Worker 161*08b48e0bSAndroid Build Coastguard Worker #endif 162*08b48e0bSAndroid Build Coastguard Worker 163