【AFL(七)】afl-fuzz.c小改——输出文件夹暂存

前言:

之前已经写过两篇针对tmin、cmin的修改,现在再改afl-fuzz.c已经轻车熟路了,对整个afl的源码结构也比较了解了。

afl-tmin:https://www.cnblogs.com/wayne-tao/p/11964565.html

afl-cmin:https://www.cnblogs.com/wayne-tao/p/11971922.html

此番修改是因为,对AFL关于 out_dir 文件夹的细节处理不是很满意,AFL对 out_dir 的处理是这样的:

  1. 检测 out_dir 文件的合法性,不仅检测路径合法,还检测是否可用、当前状态是否可以用于处理;
  2. 检查文件夹里面的内容 ,如果是之前跑的结果,检查里面的信息是不是 valuable,如果有价值,就会暂停,程序停止;
  3. 经过前两步的处理,保证可以对out_dir进行简单操作了,cleanup文件夹里的信息,开始使用out_dir。

源码分析:

【一】需求分析

当运行时间 过长时,比如这样,虽然没有crash,但是运行了很长时间,也经过了许多变异:

当停下之后,如果继续进行 afl 操作的话,会出现如下问题:

在PROGRAM ABORT处,可看到,程序停止的位置,现在的想法是:

当发现 valuable out info 的时候,对文件夹进行暂存操作,让程序继续进行,当然这里的操作跟 cmin 的处理如出一辙,先重命名文件夹,而后新建与原来同名的文件夹作为 out_dir。

【二】代码设计

通过FATAL()和输出内容很容易找到程序停止所在位置:

进行如下修改:(其中 old_out_dir 是在开始声明的跟 out_dir 相同类型的变量)

因为源码修改较多,所以,修改后的源码都会放在git上:https://github.com/WayneDevMaze/Chinese_noted_AFL

此处代码稍微解释一下:

1.这里的old_out_dir是之前声明过的跟out_dir同类型变量,然后 if 里面的 alloc_printf 是afl自己弄的一个拼接字符串的东西;

2.rename操作,重命名文件夹;

3.mkdir新建文件夹,用的是旧的名字;

4.如果最开始的拼接失败,可能是out_dir本身就有问题,停止程序;

ps.

OKF()//成功情况的输出提示
FATAL()//失败情况的输出提示,并且输出结束后,还会exit(1)

代码原文

//发现文件夹有价值,又不舍得删,就备份一下,跟cmin思路相同
//
if (old_out_dir = alloc_printf("%s_old", out_dir))
{
    rename(out_dir, old_out_dir);
    mkdir(out_dir, 0700);
    OKF("Success to create old_file_dir and move valuable files in it.");
}
else{
    OKF("Fail to move file!!!");
    FATAL("At-risk data found in ‘%s‘", out_dir);
}

【三】运行效果

依旧用之前会停止的那个指令,发现程序继续运行,并且给与提示了:

而且存放out的那个文件夹,确实也暂存了

总体来说,思路还是很清楚的,也不太麻烦,如果对 Linux C 有了解,还是很容易实现的,之后还会继续对AFL的功能进行自己的修改。


Reference

【1】LinuxC 文件操作指南:linuxC文件以及目录操作函数 - yongfengnice - 博客园

【2】Linux C文件夹重命名:linux c 重命名文件和文件夹_he_fa的专栏-CSDN博客

【3】uint8_t意味着什么:uint8_t / uint16_t / uint32_t /uint64_t数据类型详解 - Z--Y - 博客园

【4】我自己git的源码地址:https://github.com/WayneDevMaze/Chinese_noted_AFL

原文地址:https://www.cnblogs.com/wayne-tao/p/12129385.html

时间: 2024-11-25 21:30:02

【AFL(七)】afl-fuzz.c小改——输出文件夹暂存的相关文章

从头開始写项目Makefile(七):统一目标输出文件夹

[版权声明:转载请保留出处:blog.csdn.net/gentleliu. Mail:shallnew at 163 dot com] 上一节我们把规则单独提取出来,方便了Makefile的维护,每一个模块仅仅须要给出关于自己的一些变量,然后再使用统一的规则Makefile.这一节我们继续改进我们的Makefile,到眼下为止我们的Makefile编译链接输出的目标都在源文件同文件夹下或模块Makefile同一文件夹下.当一个项目大了之后,这样会显得非常乱,寻找编译输出的文件也比較困难. 既然

asp.net 文件操作小例子(创建文件夹,读,写,删)

静态生成要在虚拟目录下创建文件夹 来保存生成的页面 那么就要对文件进行操作 一.创建文件夹 using System.IO; string name = "aa"; string path = Server.MapPath("") + "\\" + name; if (Directory.Exists(path)) { Response.Write("<script>alert('文件夹已存在了!');history.go(

uboot学习之二----主Makefile学习之四----两种编译方法:原地编译和单独输出文件夹编译

第57-123行: 57 # 58 # U-boot build supports producing a object files to the separate external 59 # directory. Two use cases are supported: 60 # 61 # 1) Add O= to the make command line 62 # 'make O=/tmp/build all' 63 # 64 # 2) Set environement variable

从代码上解决Output directory already exists错误,避免每次调试都要手动删除输出文件夹

// 判断output文件夹是否存在,如果存在则删除 Path outPath = new Path("hdfs://192.168.9.13:8020/meanwhileFind");// 输出路径 FileSystem fs = outPath.getFileSystem(conf);// 根据输出路径找到文件,参数为配置文件 if (fs.exists(outPath)) { fs.delete(outPath); // fs.delete(outPath, true);true

输出文件夹大小

import os, re """ 查看文件夹下的所有文件及文件夹 join为拼接函数 """ def Look_File(path): for root , dirs, files in os.walk(path): print(root) #主目录 for item in files: #主目录下的文件夹 print(os.path.join(root, item)) """ 计算文件夹 大小 "&qu

Webpack将静态资源拷贝并压缩至输出文件夹

就拿Vue项目来说,比如要将src/assets/js下的静态js文件,直接在public/index.html中引用: 这时候没有在项目中引用,不会经过wenpack的loader,也就不会自己打包到dist目录下. 可以通过配置vue.config.js来实现: cmd: npm install uglify-es --save-dev vue.config.js: const UglifyJS = require('uglify-es'); const CopyWebpackPlugin

【AFL(三)】afl-tmin修改:添加文件夹操作指令

前言: 之前分析tmin工具的时候,提到tmin的命令目前只能对文件进行操作,很多博客也提供了写脚本的方式对文件夹进行操作.本文是想通过修改tmin源代码的方式,实现添加新命令参数就可以对文件夹进行操作. 本文分为三部分:主要思路.部分实现细节.演示. 在文章最后给出了git地址,可以pull下来直接替换afl-tmin.c用. 主要思路: [一]分析源码 在main函数入口之前,有几个自变量.函数需要仔细查看: 1. 自变量 static u8 *in_file, /* Minimizer i

二叉树的先序遍历和后序遍历的应用--输出文件和统计目录大小

一,介绍 本文主要二叉树的两种基本的典型应用: 1) 输出某个文件夹下所有文件名称(可以有子文件夹)---用先序遍历实现 2) 统计某个文件夹的大小(该文件夹下所有文件的大小--用后序遍历实现 二,实现分析 对于问题 1),输出文件名称的过程如下: 如果是文件夹,先输出文件夹名,然后再依次输出该文件夹下的所有文件(包括子文件夹),如果有子文件夹,则再进入该子文件夹,输出该子文件夹下的所有文件名.这是一个典型的先序遍历过程. 对于问题2),统计文件夹的大小过程如下: 若要知道某文件夹的大小,必须先

linux下使用c判断文件夹是否为空的小程序

/*自己写了一个 判断文件夹是否为空的小代码 打开文件夹的函数在man的时候要加 man 3 readdir,  */ #include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <unistd.h>#include <dirent.h>int isdirempty(char *dirname){    /* 打开要进行匹配的文件目录 */    DIR *dir =