Winafl cmin 报错问题的解决

当我想在windows平台下做语料蒸馏(Corpus distillation)的时候却发现了cmin会抛出一个
在linux 平台下从来没有见过的错误信息,然后就退出了。

错误信息如下:

1
2
3
4
5
6
7
8
corpus minimization tool for WinAFL by <0vercl0k@tuxfamily.org>
Based on WinAFL by <ifratric@google.com>
Based on AFL by <lcamtuf@google.com>
[+] CWD changed to C:winaflbin32.
[*] Testing the target binary...
[!] Dry-run failed, 2 executions resulted differently:
Tuples matching? False
Return codes matching? True

网上已经有一个老哥用他的方法做了解决

他的思路就是把 parse函数的返回值加上输出,把那些没有成功解析的样本去掉。

可是我在自己的研究中发现,这种方式虽然稳定但是缺会损失大量的样本,因为即使没有成功解析的
样本 不代表他没有覆盖的路径。事实也如此,我若不去掉解析失败的样本,我能得到42个唯一的样本
,若去掉只有30个样本。

为了更好的解决问题,我想看看源码,希望能在源码加改进 让其输出,是那个样本导致这个问题

然后去掉这个出问题的样本就行了。

源码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Do a dry run with the first file in the set
logging.info('[*] Testing the target binary...')
f = AFLShowMapWorker(args)
results = map(f, (inputs[0], inputs[0]))
if results[0] != results[1]:
logging.error('[!] Dry-run failed, 2 executions resulted differently:')
logging.error(
' Tuples matching? %r',
results[0].tuples == results[1].tuples
)
logging.error(
' Return codes matching? %r',
results[0].returncode == results[1].returncode
)

其中的注释写着

Do a dry run with the first file in the set

也就是说这个异常是由winafl-cmin 尝试运行第一个文件遇到的执行两次覆盖率不同导致。

奥,也即使删除第一个文件即可。

当然如果win下, 所有的样本名称 是 id_xxxxxx 这样的模式,则第一个样本就是id_000000

所以只需要rename 一遍样本,出现问题删除 id_000000 样本即可