搭建afl-qemu模块的时候,碰到了如下2个报错:

xxxxxxxx/qemu/linux-user/syscall.c:253:16: error: static declaration of ‘gettid’ follows non-static declaration
253 | _syscall0(int, gettid)
  ^~~~~~
xxxxxxxxx/qemu/linux-user/syscall.c:184:13: note: in definition of macro ‘_syscall0’
  184 | static type name (void)   
/xxxxxx/qemu_mode/qemu-2.10.0/linux-user/ioctls.h:174:9: error: ‘SIOCGSTAMPNS’ undeclared here (not in a function); did you mean ‘SIOCGSTAMP_OLD’?
174 | IOCTL(SIOCGSTAMPNS, IOC_R, MK_PTR(MK_STRUCT(STRUCT_timespec)))
| ^~~~~~~~~~~~
xxxxxxx/qemu_mode/qemu-2.10.0/linux-user/syscall.c:5597:23: note: in definition of macro ‘IOCTL’
5597 | { TARGET ## cmd, cmd, #cmd, access, 0, { VA_ARGS } },
| ^~~
make[1]: *** [/xxxxxxxx/AFL/qemu_mode/qemu-2.10.0/rules.mak:66: linux-user/syscall.o] Error 1
make: *** [Makefile:326: subdir-x86_64-linux-user] Error 2

根据错误提示可知,问题出在syscall.c这个c程序文件里,具体涉及到的位置应该就是‘gettid’和‘SIOCGSTAMPNS’这2块内容。
在网上找呀找呀找,最后在GitHub上找到了别人提过的问题:https://github.com/google/AFL/issues/41。跟进去看看,找了一个syscall.diff的补丁,编个补丁就可以解决该问题,补丁内容具体如下:

--- qemu-2.10.0-clean/linux-user/syscall.c	2020-03-12 18:47:47.898592169 +0100
+++ qemu-2.10.0/linux-user/syscall.c	2020-03-12 19:16:41.563074307 +0100
@@ -34,6 +34,7 @@
 #include <sys/resource.h>
 #include <sys/swap.h>
 #include <linux/capability.h>
+#include <linux/sockios.h> // https://lkml.org/lkml/2019/6/3/988
 #include <sched.h>
 #include <sys/timex.h>
 #ifdef __ia64__
@@ -116,6 +117,8 @@ int __clone2(int (*fn)(void *), void *ch
 #include "qemu.h"
+extern unsigned int afl_forksrv_pid;
 #ifndef CLONE_IO
 #define CLONE_IO                0x80000000      /* Clone io context */
 #endif
@@ -256,7 +259,9 @@ static type name (type1 arg1,type2 arg2,
 #endif
 #ifdef __NR_gettid
-_syscall0(int, gettid)
+// taken from https://patchwork.kernel.org/patch/10862231/
+#define __NR_sys_gettid __NR_gettid
+_syscall0(int, sys_gettid)
 #else
 /* This is a replacement for the host gettid() and must return a host
    errno. */
@@ -6219,7 +6224,8 @@ static void *clone_func(void *arg)
     cpu = ENV_GET_CPU(env);
     thread_cpu = cpu;
     ts = (TaskState *)cpu->opaque;
-    info->tid = gettid();
+    // taken from https://patchwork.kernel.org/patch/10862231/
+    info->tid = sys_gettid();
     task_settid(ts);
     if (info->child_tidptr)
         put_user_u32(info->tid, info->child_tidptr);
@@ -6363,9 +6369,11 @@ static int do_fork(CPUArchState *env, un
                mapping.  We can't repeat the spinlock hack used above because
                the child process gets its own copy of the lock.  */
             if (flags & CLONE_CHILD_SETTID)
-                put_user_u32(gettid(), child_tidptr);
+                // taken from https://patchwork.kernel.org/patch/10862231/
+                put_user_u32(sys_gettid(), child_tidptr);
             if (flags & CLONE_PARENT_SETTID)
-                put_user_u32(gettid(), parent_tidptr);
+                // taken from https://patchwork.kernel.org/patch/10862231/
+                put_user_u32(sys_gettid(), parent_tidptr);
             ts = (TaskState *)cpu->opaque;
             if (flags & CLONE_SETTLS)
                 cpu_set_tls (env, newtls);
@@ -11402,7 +11410,8 @@ abi_long do_syscall(void *cpu_env, int n
         break;
 #endif
     case TARGET_NR_gettid:
-        ret = get_errno(gettid());
+        // taken from https://patchwork.kernel.org/patch/10862231/
+        ret = get_errno(sys_gettid());
         break;
 #ifdef TARGET_NR_readahead
     case TARGET_NR_readahead:

diff文件的语法和格式还需要赘述一下吗?

--- autoconf-2.7/acgeneral.m4 Wed Nov 22 11:42:00 1995     ## 旧文件
+++ autoconf-2.9/acgeneral.m4 Sat Mar 16 15:53:07 1996    ## 新文件
@@ -1,7 +1,7 @@   ##  第一段不同的地方,旧文件从1行开始,共7行;新文件从1行开始,共7行
dnl Parameterized macros.  ## 无+—符号,是引用的内容
dnl Requires GNU m4.
dnl This file is part of Autoconf.
dnl This program is free software; you can redistribute it and/or modify
dnl it under the terms of the GNU General Public License as published by
@@ -51,7 +51,7 @@     ## 第二段不同之处
divert(-1)dnl Throw away output until AC_INIT is called.
changequote([, ])
-define(AC_ACVERSION, 2.7)
+define(AC_ACVERSION, 2.9)
dnl Some old m4′s don’t support m4exit. But they provide
dnl equivalent functionality by core dumping because of the

改完之后,就能看到成功啦:

[+] Build process successful!
[*] Copying binary...
-rwxr-xr-x 1 root root 14245320 Dec 10 19:09 ../afl-qemu-trace
[+] Successfully created '../afl-qemu-trace'.
[*] Testing the build...
[+] Instrumentation tests passed. 
[+] All set, you can now use the -Q mode in afl-fuzz!
修补afl以修复误或添加增强功能
该github存储库已归档,因为它不再具有实际用途,因为我们现在拥有afl +&uuml;,它具有所有这些修补程序以及许多更出色的功能:
所有补丁均适用于当前版本afl-2.52b,并且可以在提取的afl目录中应用(补丁-p0 &lt;patch.diff)。
 注意:所有修补程序都是独立的。 因此,几个相互冲突。 为了减轻痛苦,现在有AFLplusplus,它是afl-2.52b,其中包含了大多数补丁:
 此外,它已升级为使用qemu 3.1,并支持llvm 3.8到8。请尽情享受!
afl-llvm-fix.diff -afl-clang:在forkserver中修复SIGCHLD的afl llvm(by kcwu(at)csie(dot)org)
 afl-llvm-fix2.diff -afl-clang:修复了afl llvm以删
LibAFL是为构建高效的模糊器而开发的模糊库/框架。
免责声明:LibAFL仍然是非常WIP,可能API会发生很大变化,请不要使用它。但是,也可以随时提出想法或提出问题。
 LibAFL最初由 GSOC指导者作为GSOC项目开发:
模糊测试的要素
LibAFL入门
LibAFL是构建模糊器的框架,并支持多线程。 LibAFL背后的主要概念不是构建&ldquo;最佳&rdquo;模糊器,而是为您提供轻松为特定目标制作最佳模糊器的工具。
我们用C语言编写此代码,因此您不必这样做:最终将添加诸如rust之类的理智语言的绑定。
 LibAFL包含构建模糊器的所有部分,请考虑&ldquo;模糊器的LLVM&rdquo;。
模糊测试的要素
LibAFL将模糊器的定义如下(基于工作):
执行程序-执行目标和收集观察的结构(代码覆盖率,执行时间等)。 ./examples一个示例使用AFL ++ forkserver,
                                    AFL qemu模式安装解决
AFL qemu模式安装出现如下:
error: static declaration of ‘gettid’ follows non-static declaration;
error: ‘SIOCGSTAMPNS’ undeclared here (not in a function);
解决方法
将文件qemu_mode/patches/syscall.c中内容替换为以下内容:
--- qemu-2.10.0-clean/linux-user/syscall.c
         LEX dtc-lexer.lex.c
make[1]: flex: Command not found
make[1]: '/soft/qemu-2.11.0/capstone/libcapstone.a' is up to date.
  CC      util/memfd.o
模糊测试(Fuzzing)在安全界广为流传,被用来进行漏洞挖掘。通过向目标系统提供非预期的输入并监视异常记过来发现软件的漏洞。
0x11 AFL
AFL(American Fuzzy Lop)是由安全研究员Michał Zalewski(@lcamtuf)开发的一款基于覆盖引导(Coverage-guided)的模糊测试工具,它通过记录输入样本的代码覆盖率,从而调整输入样本以...
                                    由于科研的需要,不得不学习一下AFL的使用。先吐槽一句:虽然是很有名的工具,但是竟然安装起来都不能很顺利,真的是太垃圾了!怎么说呢,从学术界到开源,总是能碰到让人很无语,觉得很SB的问题,不得不让人感叹这个世界上大部分人和事都太垃圾,让人只能呵呵。也许也是因为软件系统的复杂度,导致了种种不完美。
参考这里介绍的流程:https://blog.csdn.net/salmonwilliam/article/details/112846864
首先在AFL官网下载:https://lcamtuf.coredu
                                    AFL前言AFL安装AFL运行界面介绍fuzzing -- 有源码的程序fuzzing -- 无源码的程序总结
  在学习了一段时间的pwn后,我个人对漏洞挖掘也是充满了极大的兴趣,但是真实环境中的漏洞挖掘和CTF中的pwn题还是有很大区别的。原因在于,CTF中的pwn题代码量少,实现逻辑并不复杂,存在的漏洞也是比较明显的,一般都是通过代码审计就能发现;而在真实环境中,代码量大,实现逻辑复杂,虽然造成漏洞的代码可能和pwn题相差不大,但是在庞大的代码量下,通过代码审计的方式来发现漏洞并不是一个好的方
AFL(American Fuzzy lop)是一种面向安全的模糊器,它采用新型的编译时检测和遗传算法来自动发现干净、有趣的测试用例,这些用例会触发目标二进制文件中的新内部状态。这大大改善了模糊代码的功能覆盖范围。该工具生成的紧凑的合成语料库还可用于其他更耗费人力或资源的测试方案的种子。
与其他仪器化的模糊测试器相比,afl-fuzz的设计实用:它具有适度的性能开销,使用各种高效的模糊测试策略和工作量最小化技巧,基本上不需要配置,并且可以无缝地处理复杂的实际用例,例如,常见的图.
                                    文章目录AFL -Q模式build_qemu_support.shdiff文件elfload.diffcpu-exec.diffsyscall.diffconfigure.diffafl-qemu-cpu-inl.h
AFL版本:2.52b。
AFL -Q模式
在Fuzzing的对象是无源码的二进制程序时,我们无法通过编译时插桩来插入forkserver以及用于收集代码信息的插桩信息。那么,我们就可以使用QEMU模式来实现二进制程序的动态插桩,收集代码覆盖率。
在命令行启动AFL的时候加入-Q参数即可使用