ble55ing的技术专栏 code analysis ,fuzzing technique and ctf

NEUZZ分析

2019-05-06
ble55ing


NEUZZ分析

从概念上讲,模糊是一个优化问题,其目标是最大限度地在给定时间的测试中发现触发漏洞的程序输入的数量。

论文关注的研究现状

目前主流的模糊测试思路是使用进化算法来解决底层优化问题-生成新的输入,最大限度地提高代码覆盖率。进化优化从一组种子输入开始,将随机突变应用于种子生成新的测试输入,执行这些输入的目标程序,并只保留有希望的新输入 。这样存在的问题是输入语料库越来越大时,达到新的代码位置的效率会越低。

论文的主要工作

本文介绍了一种新的,高效的,可扩展的程序平滑技术,使用前馈神经网络 (NNs),可以增量学习复杂的平滑逼近, 真实世界的程序分支行为,即由特定给定的输入预测目标程序的控制流边缘。首先确定程序平滑的意义,采用高效的梯度引导技术进行模糊处理。并有一个有效的和可扩展的程序平滑技术使用代理神经网络有效地建模目标程序的分支行为,并进一步提出了一种增量学习技术,以随着训练数据的曾多迭代地改进代理模型。

论文要点

如何将模糊转换为优化问题:

NNs的训练:本文中建模程序的分支行为。前馈NNs接收固定大小的输入,因此使用null填充。最大输入大小适度即可不是越大/*就能越好

梯度引导:关键思想在于识别具有最高梯度值的输入字节并对它们进行变异, 因为它们表明对 NN 的重要性更高,因此在程序行为 (例如,翻转分支) 中引起重大变化的可能性更高。

平滑逼近:利用代理神经网络模型学习和迭代,基于观察到的程序行为细化平滑逼近的目标程序

增量学习:在一开始NN模型可能只能覆盖程序空间的一小部分,所以需要通过增量训练进一步细化模型。本文设计了一种新的覆盖的过滤方案,该方案创建了旧数据和新数据的浓缩摘要,使得训练更有效。即为逐步细化的神经网络模型,因为从积累的旧数据到训练的 新数据,会忘记之前的信息,这被称为结果的稳定性–可塑性困境。为了避免这样的遗忘问题,神经网络必须改变足够的权重来学习新的任务,但不要过多地导致它忘记以前学习的表现。

本文解决这个问题使用的是基于边缘覆盖的过滤,保留旧数据并和触发新分支的样本重新训练,发现时间上也不会消耗太久。训练数据执行是不均匀的,某一小部分标签可能由所有输入一起执行,所以要将一起出现的通过机器学习中的方式降维。另外,本文只考虑被覆盖到的标签,这样能减少标签数。当模糊测试发现新的边缘数据时,合并的标签可能会分隔,他们的相关性可能会降低。

3月30日更新思路汇总

该深度学习算法使用一层隐藏层的模型对实际程序进行模拟,不断将样本和预测得到路径信息进行比对,通过这些去修正模型,增加或减少该位对特定块的影响,并借此预测能够覆盖新块的输入。如果覆盖了新的块,则重新进行训练(因为时间也不长),

另梯度的正式定义:总结一个输入字节对特定块的影响(一个0,1之间的值),从而找到能让最终神经元输出为1的输入。

汇总为:这篇论文使用前馈神经网络模型学习输入与覆盖率之间的关系,基于观察到的程序行为细化平滑逼近的目标程序,用以计算样本每一位的梯度,并采用梯度下降的方式对样本进行变异(对每位的梯度绝对值进行排序,然后按照13个分组,即前xx个一组,接下来xx个一组这样,每组根据梯度为正或负进行+1或减一的操作)。如果新增的覆盖数达到一定程度,则重新训练模型,以更好的对测试程序进行模拟。

5月6日更新开源源码分析

文件内容:

gradient_info 中的信息由三部分组成:首先是各个位的影响权重,越在前面的意味着这一位的梯度绝对值越大。接下来是这一梯度是正的还是反的,最后是这个文件名。

模型输入是文件,输出是模型判断每一位的权重。这里就是将文件输入模型得到的各位权重

py文件中通过afl-showmap得到测试文件的覆盖率信息,然后分析获得文件的位权重

py文件中有一个全局的seed_list,使用这个和bitmaps中的覆盖率信息进行分析,16个seed是一组

c文件中获得位权重并进行变异,记录crash

splice_seed是通过两个文件(取短文件的前面和长文件的后面)来生成新文件的

vari_seeds存储发现了新的边缘的哪些样本

该项目的github链接:https://github.com/Dongdongshe/neuzz


Similar Posts

上一篇 starctf blind pwn

下一篇 TaintScope 分析

Content