模糊测试FUZZ——AFL安装使用

安装环境

kali

afl-2.52b

下载源代码压缩包

官网:american fuzzy lop (coredump.cx)

image-20231127093803966

安装

  • 将压缩包解压,编译
sudo su
tar -xvf afl-latest.tgz
cd afl-2.52b
make 
make install

image-20231127095203616

image-20231127095323342

有源码

在桌面创建一个fuzztest项目

mkdir fuzztest
cd fuzztest
vi afl_test.c
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <string.h> 
#include <signal.h> 

int vuln(char *str)
{
    int len = strlen(str);
    if(str[0] == 'A' && len == 66)
    {
        raise(SIGSEGV);
        //如果输入的字符串的首字符为A并且长度为66,则异常退出
    }
    else if(str[0] == 'F' && len == 6)
    {
        raise(SIGSEGV);
        //如果输入的字符串的首字符为F并且长度为6,则异常退出
    }
    else
    {
        printf("it is good!\n");
    }
    return 0;
}

int main(int argc, char *argv[])
{
    char buf[100]={0};
    gets(buf);//存在栈溢出漏洞
    printf(buf);//存在格式化字符串漏洞
    vuln(buf);

    return 0;
}

afl-gcc -g -o afl_test afl_test.c //编译插桩指令

image-20231127103609105

建立两个文件夹,fuzz_in和fuzz_out
fuzz_in中需要创建一个测试样本testcase,并在里边插入字符“aaa”

mkdir fuzz_in fuzz_out
vi fuzz_in/testcase
afl-fuzz -i fuzz_in -o fuzz_out ./afl_test

image-20231127112619179

一段时间后需要手动ctrl + c结束

cd fuzz_out/crashes
ls

image-20231127105449960

更新apt下载源,下载xxd

# apt-get updat
# apt-get upgrade
# apt-get install xxd

查看测试结果(二进制文件)

xxd 文件名

image-20231127133053342

无源码

afl-qemu mode的安装

cd qemu_mode
./build_qemu_support.sh

image-20231127100501326

  • 多次执行./build_qemu_support.sh安装命令反馈缺少的库

安装libtoolo库

apt-get install litbool-bin

libtool 是一个通用库支持脚本(/usr/bin/libtool),将使用动态库的复杂性隐藏在统一、可移植的接口中。可以在不同平台上创建并调用动态库,可以认为libtool是gcc的一个抽象,即它包装了gcc或者其他的任何编译器,用户无需知道细节, 只要告诉libtool需要编译哪些库即可。

image-20231127134609421

安装bison库

./build_qemu_support.sh
apt-get install bison

image-20231127134758073

安装glib2

apt-get install libglib2.0-dev

image-20231127135642299

image-20231127135836819

  • 修改配置文件
vi build_qemu_support.sh

修改官网路径为Index of / (qemu.org)image-20231127140453159

删除黄框部分

image-20231127140643921

加入此命令

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

image-20231127141550277

添加补丁文件syscall2.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:
vi patches/syscall2.diff
./build_qemu_support.sh
cd ..
make install

image-20231127145512196

看到afl-qemu-trace

image-20231127145548324

安装成功

无源码二进制文件进行fuzz测试

以系统中指令为例,使用如下指令执行fuzz,参数表示使用qemu模式;参数设置使用内存大小,不设置则默认200MB:wget -Q -m

afl-fuzz -i fuzz_in -o fuzz_out -m 200 -Q wget @@

image-20231127150541822

fuzz测试语料库fuzz_in

语料库文档下载https://lcamtuf.coredump.cx/afl/demo/afl_testcases.tgz

将其移动解压到fuzz_in文件中

安装afl-plot绘图:gnuplot

apt-get install gnuplot

在fuzztest目录下新建image

mkdir image
afl-plot fuzz_out image

打开index.html

image-20231127151917612

参考文章:

afl 安装 - 知乎 (zhihu.com)

AFL(afl-qemu mode)的安装和使用(一)_afl qemu-CSDN博客

深入分析 afl / qemu-mode(qemu模式) / afl-unicorn 编译及安装存在的问题以及相应的解决方案_模糊测试 afl qemu模式-CSDN博客

利用AFL进行模糊测试_afl模糊测试-CSDN博客

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

§666§

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值