使用afl-gcc编译后仍提示No instrumentation detected的问题排查
No instrumentation detected 错误的排查步骤 这个问题我之前帮不少开发者排查过,Ubuntu 18.04仓库里的AFL 2.52b版本确实容易碰到这个 instrumentation 检测失败的问题,咱们一步步来定位解决:
先确认测试程序有可检测的分支逻辑
如果你的main.c是一个空的或者完全没有分支判断的程序(比如只是打印一句话就退出),AFL可能无法识别到 instrumentation。建议换成一个带输入处理和分支逻辑的简单程序,比如:#include <stdio.h> #include <string.h> int main() { char buf[100]; fread(buf, 1, sizeof(buf), stdin); if (strstr(buf, "foobar")) { printf("Found the magic string!\n"); } return 0; }这类程序有明确的分支,能让AFL的 instrumentation 发挥作用。
检查afl-gcc的编译过程是否正常
编译时加上-v参数查看详细输出:afl-gcc -v main.c -o main,看看输出中是否包含AFL相关的编译选项(比如-instrumentation=trace-pc或者提到AFL的插桩步骤)。如果没有,说明afl-gcc没有正确调用,你可以先运行which afl-gcc确认路径是否为/usr/bin/afl-gcc,如果不是,可能需要手动指定路径或者检查环境变量。禁用PIE编译选项
Ubuntu 18.04默认开启了PIE(位置独立可执行文件)编译,而AFL 2.52b版本对PIE的支持有问题,这是最常见的诱因。编译时显式加上-no-pie参数:afl-gcc main.c -o main -no-pie之后再运行
afl-analyze -i foo.txt ./main试试,大概率能解决问题。检查是否存在干扰环境变量
运行echo $AFL_SKIP_INSTRUMENTATION,如果输出非空字符串,说明这个环境变量导致AFL跳过了插桩操作,执行unset AFL_SKIP_INSTRUMENTATION取消该变量即可。验证编译后的程序是否包含AFL插桩
用反汇编工具检查:objdump -d main | grep afl,如果能看到__afl_maybe_log、__afl_setup这类AFL相关的函数,说明插桩成功;如果没有,就得回到前面的步骤排查afl-gcc的安装或调用问题。
内容的提问来源于stack exchange,提问作者user1273684

