如何创建跳过某些种子的增强型 AFL 模糊器?
How to create an augmented AFL fuzzer which skips certain seeds?
我是一名硕士生,正在复制论文的结果:https://www.microsoft.com/en-us/research/publication/not-all-bytes-are-equal-neural-byte-sieve-for-fuzzing/
我想创建一个增强型模糊器,它拒绝对它认为无用的种子进行修改。任何有助于实现这一目标的帮助都会非常有帮助。
我为增强模糊器创建了一个简单的 python 函数。为了测试实现,我采用了简单的 "deadbeef" 程序并编写了 python 函数,这样每当种子被修改为 "deadbeef" 时,该函数就会发送一个 "not useful" return 到 AFL 模糊代码的 'common_fuzz_stuff()' 函数。这应该意味着模糊器不应该能够找到崩溃。但它仍然能够找到崩溃,我无法确定哪里出了问题。
这是 AFL 的 python 函数:
def check_useful(seed):
my_string = str.encode('deadbeef')
file = open(seed, 'rb')
value = file.read()
if (value == my_string):
print('[*] Crash Found!')
return True
else:
return False
这里是 afl-fuzz.c 代码片段:
/* Write a modified test case, run program, process results. Handle
error conditions, returning 1 if it's time to bail out. This is
a helper function for fuzz_one(). */
EXP_ST u8 common_fuzz_stuff(char** argv, u8* out_buf, u32 len) {
if (PyCallable_Check(pFuncCheckModel)){
pArgs = PyTuple_New(1);
PyTuple_SetItem(pArgs, 0, PyUnicode_FromString(queue_cur->fname));
pFuncReturn = PyObject_CallObject(pFuncCheckModel, pArgs);
if (PyObject_IsTrue(pFuncReturn)){
skip_requested = 1;
return 1;
}
} else
{
PyErr_Print();
}
即使种子 "deadbeef" 的 common_fuzz_stuff() 函数的 return 值为 1,我的程序如何仍然能够找到崩溃?
如果您决定此输入是否有用 仅取决于输入本身 (而不是突变),据我所知,您可以使用 experimental/post_library
东西。该文档包含在示例 post_library 中,并包含一条注释,即 这可能不是您想要的 -- 不是您的特定需要,这是对那个的近似引用文档。 :)
另一方面,此单功能-API描述包含以下内容:
2) If you want to skip this test case altogether and have AFL generate a
new one, return NULL. Use this sparingly - it's faster than running
the target program with patently useless inputs, but still wastes CPU
time.
回答我自己的问题:
我必须将 out_file
发送到 Python 函数而不是 queue_cur->fname
。
PyTuple_SetItem(pArgs, 0, PyUnicode_FromString(out_file));
另外上面代码中的skip_requested = 1;
是多余的。
现在模糊器将 运行 并且不会发现崩溃
我是一名硕士生,正在复制论文的结果:https://www.microsoft.com/en-us/research/publication/not-all-bytes-are-equal-neural-byte-sieve-for-fuzzing/
我想创建一个增强型模糊器,它拒绝对它认为无用的种子进行修改。任何有助于实现这一目标的帮助都会非常有帮助。
我为增强模糊器创建了一个简单的 python 函数。为了测试实现,我采用了简单的 "deadbeef" 程序并编写了 python 函数,这样每当种子被修改为 "deadbeef" 时,该函数就会发送一个 "not useful" return 到 AFL 模糊代码的 'common_fuzz_stuff()' 函数。这应该意味着模糊器不应该能够找到崩溃。但它仍然能够找到崩溃,我无法确定哪里出了问题。
这是 AFL 的 python 函数:
def check_useful(seed):
my_string = str.encode('deadbeef')
file = open(seed, 'rb')
value = file.read()
if (value == my_string):
print('[*] Crash Found!')
return True
else:
return False
这里是 afl-fuzz.c 代码片段:
/* Write a modified test case, run program, process results. Handle
error conditions, returning 1 if it's time to bail out. This is
a helper function for fuzz_one(). */
EXP_ST u8 common_fuzz_stuff(char** argv, u8* out_buf, u32 len) {
if (PyCallable_Check(pFuncCheckModel)){
pArgs = PyTuple_New(1);
PyTuple_SetItem(pArgs, 0, PyUnicode_FromString(queue_cur->fname));
pFuncReturn = PyObject_CallObject(pFuncCheckModel, pArgs);
if (PyObject_IsTrue(pFuncReturn)){
skip_requested = 1;
return 1;
}
} else
{
PyErr_Print();
}
即使种子 "deadbeef" 的 common_fuzz_stuff() 函数的 return 值为 1,我的程序如何仍然能够找到崩溃?
如果您决定此输入是否有用 仅取决于输入本身 (而不是突变),据我所知,您可以使用 experimental/post_library
东西。该文档包含在示例 post_library 中,并包含一条注释,即 这可能不是您想要的 -- 不是您的特定需要,这是对那个的近似引用文档。 :)
另一方面,此单功能-API描述包含以下内容:
2) If you want to skip this test case altogether and have AFL generate a
new one, return NULL. Use this sparingly - it's faster than running
the target program with patently useless inputs, but still wastes CPU
time.
回答我自己的问题:
我必须将 out_file
发送到 Python 函数而不是 queue_cur->fname
。
PyTuple_SetItem(pArgs, 0, PyUnicode_FromString(out_file));
另外上面代码中的skip_requested = 1;
是多余的。
现在模糊器将 运行 并且不会发现崩溃