代码先锋网 代码片段及技术文章聚合

AFL(afl-qemu mode)的安装和使用(一)

技术标签: 科研工具

由于科研的需要,不得不学习一下AFL的使用。先吐槽一句:虽然是很有名的工具,但是竟然安装起来都不能很顺利,真的是太垃圾了!怎么说呢,从学术界到开源,总是能碰到让人很无语,觉得很SB的问题,不得不让人感叹这个世界上大部分人和事都太垃圾,让人只能呵呵。也许也是因为软件系统的复杂度,导致了种种不完美。

参考这里介绍的流程:https://blog.csdn.net/salmonwilliam/article/details/112846864

首先在AFL官网下载:https://lcamtuf.coredump.cx/afl/

Latest source tarball for the tool

下载下来之后解压,然后依次运行:

make
sudo make install

然后按照上面那个博客里的说法:在终端输入afl-后tab,就能看到很多命令。

我们希望使用afl-qemu,那还需要进行以下操作:

cd qemu_mode
./build_qemu_support.sh

如果有些lib没有安装的,会报:[-] Error: 'automake' not found, please install first. 类似于这种的错。这些都比较好说,缺什么安装什么就行了。让人觉得无语的第一点是这个报错:

ERROR: Cannot use 'python', Python 2.6 or later is required.
       Note that Python 3 or later is not yet supported.
       Use --python=/path/to/python to specify a supported Python.

看到这个真的很无语啊……,想到我的anaconda上有python 2.7的,就先activate了2.7的环境,然后再运行就不报这个错了。ps:Use --python=/path/to/python to specify a supported Python. 这种提示有啥用呢,我实在不知道应该在什么地方specify。

把python的问题解决之后,又报了第二个让人无语的错

util/memfd.c:40:12: error: static declaration of ‘memfd_create’ follows non-static declaration

看上面那个教程中也提到了这个报错,想问问,这种事情没有人管的么?真的是太垃圾了。参考了这里的教程:https://blog.csdn.net/liyihao17/article/details/109981662,这个问题就解决了。顺便说一句,像

patch -p1 <../patches/elfload.diff || exit 1
patch -p1 <../patches/cpu-exec.diff || exit 1

在build_qemu_support.sh的131行左右。

然后再运行一遍,又报了第三个让人无语的错

/home/yu/Projects/afl-2.52b/qemu_mode/qemu-2.10.0/linux-user/syscall.c:261:16: error: static declaration of ‘gettid’ follows non-static declaration,心里不禁想问候有些人啊,解决方法按照这里的介绍:

https://blog.csdn.net/geniusle201/article/details/111028697

按理说,加上一个diff文件,将其放在patches文件夹下,然后再改build_qemu_support.sh就可以了,可是问题是,我们在patches目录下,已经有了名为: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:

再运行的时候会报这个错:

Hunk #2 FAILED at 117.
Hunk #3 succeeded at 259 (offset 2 lines).
Hunk #4 succeeded at 6224 (offset 2 lines).
Hunk #5 succeeded at 6369 (offset 2 lines).
Hunk #6 succeeded at 11410 (offset 2 lines).
1 out of 6 hunks FAILED -- saving rejects to file linux-user/syscall.c.rej

看这个是我们刚才加的117行的diff没法用,也没仔细看看细节,尝试把上面这些diff重新放在了一个名为syscall2.diff的文件中,并且在build_qemu_support.sh中加入:

patch -p1 <../patches/syscall2.diff || exit 1

发现还是不行,感觉是两个diff文件冲突了,所以在build_qemu_support.sh文件中把syscall.diff去掉:

patch -p1 <../patches/elfload.diff || exit 1
patch -p1 <../patches/cpu-exec.diff || exit 1
patch -p1 <../patches/syscall2.diff || exit 1
patch -p1 <../patches/memfd_create.diff || exit 1

再运行一遍build_qemu_support.sh,就可以了:

[+] Build process successful!
[*] Copying binary...
-rwxrwxr-x 1 yu yu 10956720 Mar 13 19:33 ../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已经是很有名的工具了,竟然有这么多弱智的错误,不得不说这个领域真的是太浮躁和让人失望

版权声明:本文为qysh123原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qysh123/article/details/114792891

智能推荐

AFL qemu模式安装报错解决

AFL qemu模式安装报错解决 AFL qemu模式安装出现如下报错: 解决方法 将文件qemu_mode/patches/syscall.c中内容替换为以下内容: 参考 AFL QEMU模式安装报错(afl-2.52b & qemu-2.10.0)[已解决] AFL(afl-qemu mode)的安装和使用(一)...

使用afl对libmodbus进行fuzz

1. 过程概览 下载编译libmodbus 利用 preeny 库辅助fuzz 获取样本数据,数据处理 启动afl 2. 具体步骤 2.1 下载编译libmodbus libmodbus库是一个用于 modbus 通讯的库,通过这个库可以很方便的实现 modbus 服务器和客户端的通讯。 首先下载好源码,目录下的 tests 目录里面有一些示例程序。 然后编译 modbus server,使用 a...

AFL的安装和使用(三)——FFmpeg的白盒测试

至于这里是不是白盒测试我也不好说,就是有源码的情况下怎么使用AFL进行插桩和fuzzing,以FFmpeg为例(接上一篇博客:https://blog.csdn.net/qysh123/article/details/114794833) 其实这个问题也有很多朋友介绍了,例如:(https://blog.csdn.net/m0_37907383/article/details/105419989)...

支持对Windows二进制程序的afl fuzz工具 Pe-afl

pe-afl是一款基于了PE二进制和WinAFL上的静态二进制检测的工具,可以用于fuzzWindows应用程序和内核模式驱动程序,而无需源代码或完整符号或硬件支持。 我用这个工具发现了office,gdiplus,jet,lnk,clfs,cng上的bug。 PE上的仪表部分可以被多种用途重用: 如果你觉得测试速度很慢,你可以在ubuntu上运行这个脚本; 该工具基于microsoft二进制文件...

Linux下安装AFL及遇到的问题 [已解决]

安装AFL前期工作: 编译安装AFL,及其LLVM_MODE llvm_mode将启用对afl-clang-fast和afl-clang-fast++的支持。 它将用于持久模式。 这将需要安装clang和llvm。 安装QEMU_MODE: 这里需要安装一些依赖项  以及安装python环境,笔者安装的是2.7版本 安装完成后,开始通过构建脚本安装qemu_mode,过程中出现了一些问题...

猜你喜欢

AFL种子文件是如何送入目标程序的?

AFL种子文件是如何送入目标程序的? 在做实验的过程中,因为要复现漏洞嘛,要把种子文件送入目标程序。这里产生了一个疑问 如果我用重定向的方式把种子文件(二进制文件)送入目标程序中,那么目标程序会显示相应的报错。但是如果我将二进制文件的内容(使用xxd)复制下来,然后在送入程序中,目标程序就不会报错。 在小刘的启发下,我开始对照源码,观察AFL是如何把种子文件送入目标程序。 得到的结论就是,AFL是...

AFL(American Fuzzy Lop)中用到的C语言函数

最近在读AFL的源码,AFL是用C语言写的,C都快忘完了。关乎到AFL源码的一些细节问题,记录一下AFL中出现频率比较高的以及没有见过的函数,免得一个个再去搜了 大部分摘自菜鸟教程 1.getenv() 描述 函数声明 参数 name – 包含被请求变量名称的 C 字符串 返回值 该函数返回一个以 null 结尾的字符串,该字符串为被请求环境变量的值。如果该环境变量不存在,则返回 NU...

AFL-Fuzz源码解析第一部分:afl-gcc代码插桩

先看afl-gcc的实现 当调用afl-g++或afl-gcc对目标代码进行插桩编译时,首先调用g++或gcc对目前程序进行编译, 如下,通过cc_params[0]指定编译器 编译过程中通过-B参数指定汇编器afl-as所在的路径as_path,正是通过afl-as在汇编层面对g++或gcc编译生成的汇编代码进行插桩(汇编器afl-as的路径as_path通过find_as()函数找到,一般和a...

AFL命令行中“@@“的作用以及AFL的两种数据传递方式

AFL命令行中"@@"的作用 参考:https://barro.github.io/2018/06/afl-fuzz-on-different-file-systems/ AFL有两种方式将输入传递给目标程序,一个是通过标准输入,一个是通过文件 具体地,在afl-fuzz.c 文件的 main 函数中,会调用 detect_file_args 函数区检测命令行参数中是否含有 &...

【AFL(十一)】AFL 学习笔记

afl-fuzz.c笔记 前言: 本文适合对象:已经对afl的流程有一定了解,自己跑过afl的各个功能;具有一定C编程基础,浏览过afl源码或者某个模块的源码。笔记分为五个大块对 afl-fuzz.c 进行分析:文件引用、预备工作、fuzzing的整体结构、关键函数实现原理、main函数。当然其中涉及到很多其他的头文件,也会对相关部分进行详述。 Ⅰ、文件引用 【一】自定义头文件 这部分几个头文件都...