/*afl-tmin

AFL-tmin是模糊测试工具American Fuzzy Lop (AFL)的一个辅助工具,用于从大量测试输入中生成最小化的种子文件。它通过删除输入中的冗余部分,帮助缩小测试用例,从而更有效地进行模糊测试。AFL-tmin通过迭代过程找到能够触发同样代码路径的最小化输入,这对于理解和调试被测程序的行为非常有用。
/*afl-tmin:
独立工具,能够自动收缩测试用例,同时仍然确保它们在目标二进制文件中执行相同的功能(或者触发相同的崩溃)。
另一个类似的工具afl-cmin采用了类似的技巧来消除任何大型测试语料库中的冗余文件。*/

#define U32 unsigned int
#define U16 unsigned short
#define U8  unsigned char (byte)

#define S32 int
#define S16 short int
#define S8  char



#include <stdio.h>
#include <stdlib.h>

/* Main entry point */

int main(int argc, char** argv) //argv指向char*,即argv存的是指向字符串的指针的地址。
{
   
   

  s32 opt;
  u8  mem_limit_given = 0, timeout_given = 0, qemu_mode = 0; //u8:最大255
  char** use_argv;

  doc_path = access(DOC_PATH, F_OK) ? "docs" : DOC_PATH;     //R_OK文件是否可读 W_OK文件是否可写入 F_OK 文件是否存在

  SAYF(cCYA "afl-tmin " cBRI VERSION cRST " by <lcamtuf@google.com>\n");   

  while ((opt = getopt(argc,argv,"+i:o:f:m:t:B:xeQ")) > 0)   //每调用一次getopt返回一个选项,optarg是指向对应选项的参数指针。。
    switch (opt)                                             //从用户terminal输入中找到-i -t ...等配置
    {
   
   

      case 'i':

        if (in_file) FATAL("Multiple -i options not supported");
        in_file = optarg;
        break;

      case 'o':

        if (out_file) FATAL("Multiple -o options not supported");
        out_file = optarg;
        break;

      case 'f':

        if (prog_in) FATAL("Multiple -f options not supported");
        use_stdin = 0;
        prog_in   = optarg;
        break;

      case 'e':

        if (edges_only) FATAL("Multiple -e options not supported");
        edges_only = 1;
        break;

      case 'x':

        if (exit_crash) FATAL("Multiple -x options not supported");
        exit_crash = 1;
        break;

      case 'm': {
   
   

          u8 suffix = 'M';

          if (mem_limit_given) FATAL("Multiple -m options not supported");
          mem_limit_given = 1;

          if (!strcmp(optarg, "none")) {
   
   

            mem_limit = 0;
            break;

          }

          if (sscanf(optarg, "%llu%c", &mem_limit, &suffix) < 1 ||
              optarg[0] == '-') FATAL("Bad syntax used for -m");

          switch (suffix) {
   
                               //定义

            case 'T': mem_limit *= 1024 * 1024; break;
            case 'G': mem_limit *= 1024; break;
            case 'k': mem_limit /= 1024; break;
            case 'M': break;

            default:  FATAL("Unsupported suffix or bad syntax for -m");

          }

          if (mem_limit < 5) FATAL("Dangerously low value of -m");

          if (sizeof(rlim_t) == 4 && mem_limit > 2000)
            FATAL("Value of -m out of range on 32-bit systems");

        }

        break;

      case 't':

        if (timeout_given) FATAL("Multiple -t options not supported");
        timeout_given = 1;

        exec_tmout = atoi(optarg);                          //用户输入空闲等待时间

        if (exec_tmout < 10 || optarg[0] == '-')
          FATAL("Dangerously low value of -t");

        break;

      case 'Q':

        if (qemu_mode) FATAL("Multiple -Q options not supported");
        if (!mem_limit_given) mem_limit = MEM_LIMIT_QEMU;

        qemu_mode = 1;
        break;

      case 'B': /* load bitmap */

        /* This is a secret undocumented option! It is speculated to be useful
           if you have a baseline "boring" input file and another "interesting"
           file you want to minimize.

           You can dump a binary bitmap for the boring file using
           afl-showmap -b, and then load it into afl-tmin via -B. The minimizer
           will then minimize to preserve only the edges that are unique to
           the interesting input file, but ignoring everything from the
           original map.

           The option may be extended and made more official if it proves
           to be useful. */

        if (mask_bitmap) FATAL("Multiple -B options not supported");
<think>根据用户的问题,用户遇到了AFL(American Fuzzy Lop)工具在编译时使用afl-gcc或afl-clang时,因为这些编译器被移除而导致的程序中止报错(报错位置:main(), src/afl-cc.c:3605)。用户提供了多个引用,其中引用[1]提到清理编译文件并修改Makefile,引用[2]提到AFL的编译器是gcc/clang的包装器,引用[4]提到afl-gcc.c的源码分析,引用[5]提到afl-as.c的源码分析。 问题分析: 报错信息指向`src/afl-cc.c:3605`,这通常意味着AFL的cc组件在尝试调用afl-gcc或afl-clang时发现它们已经被移除或不可用。从引用[2]中我们知道,afl-gcc等实际上是gcc/clang的包装器。在最新版本的AFL(如AFL++)中,afl-gcc和afl-clang可能已经被弃用,取而代之的是统一的`afl-cc`工具。 解决方案: 1. 首先,确认你使用的AFL版本。如果是较新的AFL++版本(推荐),那么afl-gcc和afl-clang已经被整合到`afl-cc`中。因此,你应该使用`afl-cc`来编译你的程序。 2. 在编译时,使用`afl-cc`代替afl-gcc或afl-clang。例如,将原来的编译命令: afl-gcc -g -O0 test.c -o test 改为: afl-cc -g -O0 test.c -o test 3. 如果使用的是Makefile,可以修改Makefile中的CC变量,例如: CC = afl-cc 4. 清理之前的编译文件(如引用[1]所述),确保重新编译: make clean rm -rf $HOME/example/install/ 5. 设置环境变量(如果需要),确保AFL的编译器被正确使用。例如,在编译时指定编译器: CC=afl-cc CXX=afl-c++ make 6. 如果上述方法不起作用,可以尝试使用AFL的LLVM模式(如果系统支持)。首先确保安装了clang(引用[2]中提到),然后使用: afl-clang-fast # 代替afl-gcc 或者 afl-clang-fast++ # 代替afl-g++ 注意:afl-clang-fast是LLVM模式,需要系统安装clang和llvm(版本要求通常较高)。 如果用户使用的AFL版本较旧,建议升级到AFL++(最新版本),因为旧版本的AFL已经不再维护。 具体步骤总结: 1. 升级AFL到最新版(AFL++): git clone https://github.com/AFLplusplus/AFLplusplus cd AFLplusplus make sudo make install 2. 使用`afl-cc`代替afl-gcc/afl-clang,或者使用`afl-clang-fast`(需要安装LLVM)。 3. 清理之前的编译环境,重新编译目标程序。 如果用户不想升级,可以尝试在旧版本中寻找是否有`afl-cc`,或者检查环境变量是否设置正确,但升级是最推荐的解决方案。 引用说明: 根据用户提供的引用,引用[1]中提到了清理和修改Makefile的方法,引用[2]提到了AFL编译器是gcc/clang的包装器,这些信息帮助我们理解AFL的工作方式。引用[4]和[5]是源码分析,说明AFL内部实现,但当前问题更可能是由于版本更新导致的接口变化。 因此,解决该问题的核心是使用新版本的AFL++并调整编译命令。 生成相关问题: 为了帮助用户更好地理解和使用AFL,生成以下相关问题: 1. 如何安装最新版的AFL++? 2. 如何使用AFL的LLVM模式进行模糊测试? 3. 在编译目标程序时,如何设置AFL的编译选项以获取更好的覆盖率? 4. AFL++有哪些改进和新增功能? 5. 如何解决AFL编译时出现的其他常见错误? 下面将按照用户要求的结构化方式回答。 </think> ### 解决 AFL-GCC/AFL-CLang 因过时被移除导致的程序中止报错 #### 问题分析 根据报错信息 `PROGRAM ABORT (Location: main(), src/afl-cc.c:3605)`,该问题是由于 AFL 工具链中 `afl-gcc/afl-clang` 被标记为废弃并在新版本中被移除导致的。错误发生在 AFL 的编译控制模块(`afl-cc.c`),表明当前使用的 AFL 版本已不再支持传统的 GCC/Clang 包装器[^2][^4]。 #### 解决方案 **核心思路**:使用 AFL++(AFL 的增强分支)并切换到其现代化的编译器接口 `afl-cc`,或启用 LLVM 模式。 ##### 步骤 1:升级到 AFL++ 并清理环境 ```bash # 卸载旧版 AFL sudo apt purge afl # Debian/Ubuntu sudo yum remove afl # CentOS/RHEL # 安装 AFL++ git clone https://github.com/AFLplusplus/AFLplusplus cd AFLplusplus make sudo make install # 清理历史编译文件(关键!) make clean rm -rf $HOME/example/install # 移除旧版残留[^1] ``` ##### 步骤 2:使用 `afl-cc` 替代传统编译器 修改项目 Makefile,将编译器替换为统一接口: ```makefile # 修改前 CC = afl-gcc CXX = afl-g++ # 修改后 CC = afl-cc CXX = afl-c++ ``` 或通过环境变量指定: ```bash export CC=afl-cc export CXX=afl-c++ make ``` ##### 步骤 3:启用 LLVM 模式(推荐) ```bash # 安装 LLVM 依赖 sudo apt install clang llvm # Debian/Ubuntu sudo yum install clang llvm # CentOS/RHEL # 编译时使用 LLVM 模式 afl-clang-fast -g -O0 test.c -o test # C 语言 afl-clang-fast++ -g -O0 test.cpp -o test # C++[^2] ``` ##### 步骤 4:验证安装 ```bash # 检查编译器版本 afl-cc --version afl-clang-fast --version # 运行测试 afl-fuzz -i input/ -o output/ ./target_program ``` #### 关键说明 1. **废弃原因**:传统 `afl-gcc/afl-clang` 已被整合进 `afl-cc` 统一接口,旧调用会触发强制报错。 2. **LLVM 优势**: - 更快的插桩速度 - 支持更复杂的代码覆盖分析 - 兼容最新 Clang 工具链[^5] 3. **环境清理**:必须删除旧版 AFL 的编译残留(特别是 `$HOME/example/install`),否则可能引发冲突[^1]。 #### 常见错误排查 若仍报错,检查: 1. 系统是否安装 LLVM:`clang --version` 2. Makefile 中是否残留 `afl-gcc` 引用 3. 环境变量是否覆盖:`unset CC CXX` 后重试
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值