看网上的评价fuzz好像是挖漏洞的首选工具,就先浅浅学习一下,或许可以找找ctf的应用场景,先从AFL++开始
安装
在安装之前AFL++要求要有llvm和clang,ldd,gcc等编译器
| 12
 3
 4
 5
 
 | sudo apt install wgetwget https://apt.llvm.org/llvm.sh
 chmod +x llvm.sh
 sudo ./llvm.sh 13
 sudo apt install clang-13 lld-13 llvm-13
 
 | 
之后更新环境变量
| 12
 3
 
 | export PATH=/usr/lib/llvm-13/bin:$PATHecho 'export PATH=/usr/lib/llvm-13/bin:$PATH' >> ~/.bashrc
 source ~/.bashrc
 
 | 
记住export只对本shell生效,bashrc只对之后起的shell生效
 假设输出显示您的GCC版本是9.xx.xx
| 1
 | sudo apt install gcc-9-plugin-dev
 | 
之后便可以下载依赖然后下载AFL++之后编译
| 12
 3
 4
 5
 
 | sudo apt update$ sudo apt install git make build-essential clang ninja-build pkg-config libglib2.0-dev libpixman-1-dev
 $ git clone https://github.91chi.fun/https://github.com/AFLplusplus/AFLplusplus.git
 $ cd AFLplusplus
 $ make all
 
 | 
这样没有error的话就完成AFL++的基本安装
如果报错就看报错解决,先百度,如果有网上没有的话可以与我讨论,即使我大概率也不会
AFL++的使用
首先是测试,就借用[网上的源码](初探AFL-Fuzz - 先知社区 (aliyun.com))
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 
 | #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);
 
 }
 else if(str[0] == 'F' && len == 6)
 {
 raise(SIGSEGV);
 
 }
 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;
 }
 
 | 
有源码的fuzz
首先是编译器的选择官方文档
| 1
 | afl-clang-lto ./afl_test.c -o afl_test
 | 
对那些可以直接从stdin读取输入的目标程序来说,语法如下:
./afl-fuzz -i testcase_dir -o findings_dir /path/to/program […params…]
对从文件读取输入的目标程序来说,要用“@@”,语法如下:
./afl-fuzz -i testcase_dir -o findings_dir /path/to/program @@
| 1
 | afl-fuzz -i fuzz_in -o fuzz_out ./afl_test
 | 

这样三个区域要注意的
process time,overall result,findings in depth
主要是total crashes可以看到几个被保留,先知社区那篇AFL便有细讲
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 
 | bamboo@bamboo-virtual-machine:~/test/fuzz_out/default/crashes$ xxd id:000000,sig:11,src:000002,time:525,execs:641,op:havoc,rep:200000000: 4646 ff61 6161                           FF.aaa           //异常
 bamboo@bamboo-virtual-machine:~/test/fuzz_out/default/crashes$ xxd id:000001,sig:11,src:000002,time:2133,execs:2603,op:havoc,rep:30
 00000000: cfcf cfcf cfcf cfcf cfcf cfcf cfcf cfcf  ................
 00000010: cfcf cfcf cfcf cfff 80b2 b2b2 b2b2 b2b2  ................
 00000020: b2b2 b2b2 b2b2 b2b2 b2b2 b2b2 b2b2 b2b2  ................
 00000030: b2b2 b2b2 4db2 b2b2 b2b2 b2b2 b2cf cfcf  ....M...........
 00000040: cfcf cfcf cfcf ff80 9eb2 b2b2 b2b2 b2cf  ................
 00000050: cfcf cfcf cfcf cfcf cfcf cfcf cfcf cfcf  ................
 00000060: d4cf cf80 b2cf 0064 e2cf cfcf cfcf ff80  .......d........
 00000070: 9eb2 97b2 b2b2 b2cf cfcf cfcf cfcf cfcf  ................
 00000080: cfcf cfcf b2b2 b2b2 b2b2 9db2 b2b2 b2e6  ................
 00000090: ddff                                     ..
 bamboo@bamboo-virtual-machine:~/test/fuzz_out/default/crashes$ xxd id:000002,sig:11,src:000002,time:7445,execs:10000,op:havoc,rep:2
 00000000: 256e 6161                                %naa              //格式化字符串
 bamboo@bamboo-virtual-machine:~/test/fuzz_out/default/crashes$ xxd id:000003,sig:11,src:000001,time:11633,execs:15043,op:havoc,rep:63
 00000000: 417f 418e 4141 be41 4141 4141 4140 4129  A.A.AA.AAAAAA@A)
 00000010: 4141 4180 4120 415a 5a41 6241 4141 4141  AAA.A AZZAbAAAAA
 00000020: 4102 4120 415a 5a3b 3241 4141 4141 4141  A.A AZZ
 00000030: 4141 4141 4141 4141 4141 7f36 4141 4141  AAAAAAAAAA.6AAAA
 00000040: 4141 0200 4140 4129 4141 4180 4120 415a  AA..A@A)AAA.A AZ
 00000050: 5a41 6241 3041 4141 4102 4120 415a 5a3b  ZAbA0AAAA.A AZZ
 00000060: 3241 4140 4141 0241 2041 5a5a 4162 4149  2AA@AA.A AZZAbAI
 00000070: 4141 4141 0241 df41 5a5a 4132 4141 4141  AAAA.A.AZZA2AAAA
 00000080: 4141 0241 2041 5a64 4141 4100 4041 4100  AA.A AZdAAA.@AA.
 00000090: 1b                                       .
 bamboo@bamboo-virtual-machine:~/test/fuzz_out/default/crashes$ xxd id:000004,sig:11,src:000001,time:25097,execs:31270,op:havoc,rep:28    //异常2,不过\x00
 00000000: 4197 8241 1f87 a4a4 c87f ffc8 c8c8 afaf  A..A............
 00000010: af8e afaf afaf afaf afaf 98d8 9898 9898  ................
 00000020: 98b8 9897 9898 8e98 9898 9898 9898 9898  ................
 00000030: 9898 9898 9898 98af afaf afaf afaf c821  ...............!
 00000040: 8820 0000 0002 0003 2017 c8c8 1c         . ...... ....
 
 | 
- id:000001:
- 这是一个唯一的标识符,用于标识 AFL++ 生成的测试用例。每个新生成的测试用例都会有一个递增的 ID。
 
- sig:11:
- 这是信号编号,表示程序崩溃时接收到的信号。在这个例子中,11表示SIGSEGV(Segmentation Fault),即内存访问违规。
 
- src:000002:
- 这是生成该测试用例的父测试用例的 ID。它表示此测试用例是从 ID 为 000002的测试用例变异而来的。
 
- time:2133:
- 这是 AFL++ 生成该测试用例时的运行时间,单位是毫秒。这里表示 AFL++ 在运行 2133 毫秒后生成了这个测试用例。
 
- execs:2603:
- 这是 AFL++ 在生成该测试用例时的执行次数。表示 AFL++ 已经执行了 2603 次测试用例。
 
- op:havoc:
- 这是 AFL++ 用来生成该测试用例的变异操作类型。在这个例子中,havoc是一种随机变异策略,AFL++ 会对输入进行多种随机变异操作,以发现潜在的漏洞。
 
- rep:30:
- 这是 AFL++ 在生成该测试用例时重复变异操作的次数。表示该测试用例是在第 30 次变异操作时生成的。
 
看来里面还是有很多门道的,希望我有一天能参透
无源码的fuzz
无源码的要在qemu上运行,确保事先装好system和static的qemu
| 12
 
 | cd qemu_mode./build_qemu_support.sh
 
 | 
| 1
 | gcc -g -o afl_test2 afl_test.c
 | 
| 1
 | afl-fuzz -i in -o out -Q ./afl_test2
 | 
-Q说明是qemu运行
之后尝试一些ctf,iot上的应用(算是留个坑),其实我尝试了go的但是跑的很慢很慢,等我有服务器了再用服务器跑(听说跑fuzz烧硬盘