Radamsa-通用绒毛

taibeihacker

Moderator
RADAMSA是用于鲁棒性测试的测试用例生成器,又名fuzzer。它通常用于测试程序能够承受畸形且潜在的恶意输入的程度。它通过读取有效数据的示例文件并生成有趣的不同输出来起作用。 The main selling points of radamsa are that it has already found a slew of bugs in programs that actually matter, it is easily scriptable and, easy to get up and running.

Nutshell:​

$#请请您的程序模糊。这是获取IT:数据的一种方法
$ sudo apt-get install gcc make git wget
$ git克隆3https://gitlab.com/akihe/radamsa.git cd radamsa make sudo make install
$ echo'hal 9000'| RADAMSA

What the Fuzz​

编程很难。所有非平凡的程序都有错误。 What's more, even the simplest typical mistakes are in some of the most widely used programming languages usually enough for attackers to gain undesired powers.
模糊是从程序中找到这种意外行为的技术之一。这个想法仅仅是将程序对各种输入进行,然后看看会发生什么。此过程中有两个部分:获取各种输入以及如何查看发生的情况。 RADAMSA是对第一部分的解决方案,第二部分通常是一个短壳脚本。测试人员通常有一个或多或少的模糊想法不应该发生的事情,他们试图找出是否这样。这种测试通常称为阴性测试,与正单位或集成测试相反。 Developers know a service should not crash, should not consume exponential amounts of memory, should not get stuck in an infinite loop, etc. Attackers know that they can probably turn certain kinds of memory safety bugs into exploits, so they fuzz typically In theory, the idea is to counterprove by finding a counterexample a theorem about the program stating that for all inputs something doesn't happen.
有许多类型的模糊和应用方法。有些人追踪目标程序并根据行为生成测试案例。有些人需要了解数据的格式,并根据该信息生成测试用例。 RADAMSA是一种非常“黑框”的魔力,因为它不需要有关程序或数据格式的信息。 One can pair it with coverage analysis during testing to likely improve the quality of the sample set During a continuous test run, but this is not mandatory.主要目标是首先轻松进行测试,然后在必要时完善应用的技术。
RADAMSA旨在成为各种数据的良好通用模糊器。 The goal is to be able to find issues no matter what kind of data the program processes, whether it's xml or mp3, and conversely that not finding bugs implies that other similar tools likely won't find them either.这是通过具有各种启发式方法和变化模式来实现的,这些模式在测试过程中有所不同。有时只有一种变化,有时会有一堆,有时会有一些掷骰子,有时还有一些更先进和新颖的东西。
Radamsa is a side-product of OUSPG's Protos Genome Project, in which some techniques to automatically analyze and examine the structure of communication protocols were explored.其中一种工具的一个子集证明是一个令人惊讶的有效文件模糊器。第一个原型Black-Box Fuzzer工具主要使用常规和无上下文的形式语言来表示数据的推断模型。

Requirements​

支持的操作系统: * gnu/linux * OpenBSD * freebsd * Mac OS X * Windows(使用Cygwin)
来自来源构建的软件要求: * GCC/CLANG * MAKE * GIT * WGET

Building Radamsa​

$ git克隆https://gitlab.com/akihe/radamsa.git
$ CD RADAMSA
$制作
$ sudo make install#可选,您也可以抓住bin/radamsa
$ RADAMSA - 主持RadAmsa本身只是一个没有外部依赖性的二进制文件。您可以将其移动到您需要的地方,然后删除其余部分。

Fuzzing with Radamsa​

本节假定对Unix脚本的熟悉程度。
可以将RADAMSA视为CAT UNIX工具,该工具在流动时设法以通常有趣的方式打破数据。它还支持一次生成一个以上的输出,并充当TCP服务器或客户端,以防需要此类。
Radamsa的使用将通过小例子来证明。我们将使用BC任意精度计算作为示例目标程序。
在最简单的情况下,从脚本的角度来看,Radamsa可用于通过管道传播的模糊数据。
$ ECHO'AAA'| Radamsa
AAAA在这里radamsa决定在输入中添加一个“ A”。让我们再试一次。
$ ECHO'AAA'| Radamsa
ːaaa现在我们得到了另一个结果。 By default radamsa will grab a random seed from /dev/urandom if it is not given a specific random state to start from, and you will generally see a different result every time it is started, though for small inputs you might see the same or the original fairly often.可以使用-s参数给出的随机状态,其次是数字。使用相同的随机状态将产生相同的数据。
$ echo'Fuzztron 2000'| Radamsa-种子4
Fuzztron 4294967296 This particular example was chosen because radamsa happens to choose to use a number mutator, which replaces textual numbers with something else.程序员可能会认识到为什么为什么此特定数字可能是一个有趣的测试。
您可以使用-n参数如下:生成多个输出
$ echo'1 +(2 +(3 + 4))'| radamsa-种子12 -n 4
1 +(2 +(2 +(3 + 4?)
1 +(2 +(3 +?4))
18446744073709551615 + 4))))
1 +(2 +(3 + 170141183460460469231731687303715884105727))无法保证所有输出都将是唯一的。但是,当使用非平凡样品时,相等的输出往往极为罕见。
到目前为止,我们拥有的内容可以用来例如从标准输入中读取输入的测试程序,例如
$ echo'100 *(1 +(2 /3))'| RADAMSA -N 10000 |公元前
[.]
(standard_in)1418:非法字符: ^_
(standard_in)1422:语法错误
(standard_in)1424:语法错误
(standard_in)1424:耗尽的内存
[挂起]或用于编译RADAMSA:的编译器
$ echo'((lambda(x)(+ x 1))#x124214214)'| RADAMSA -N 10000 | OL
[.]
什么是“ óµ”?
4901126677
$或测试Decompression:
$ gzip -c /bin /bash | RADAMSA -N 1000 | GZIP -D /dev /null通常可能需要每个输出的程序单独运行。基本的外壳脚本使它变得容易。通常我们希望测试脚本连续运行,因此我们将在这里使用无限循环:
$ gzip -c /bin /bash sample.gz
$ the true;做radamsa sample.gz | gzip -d /dev /null;完成请注意,我们在这里将样本作为文件提供,而不是在管道中运行RadAmsa。就像cat radamsa默认情况下,将输出写入stdout,但是与cat不同时,当给出一个以上的文件时,通常只会使用其中一个或几个文件来创建一个输出。该测试将进行针对GZIP的模糊数据,但不在乎那时会发生什么。找出(简单的单线程)程序是否发生过不良事件的一种简单方法是检查退出值是否大于127,这表明了致命的程序终止。例如,可以做如下:
$ gzip -c /bin /bash sample.gz
$,而正确

radamsa样品.gz fuzzed.gz
gzip -dc fuzzed.gz /dev /null
测试$? -GT 127休息
这样做就可以运行,只要碰撞Gzip,希望它甚至不再是可能的,并且fuzzed.gz可以使用脚本停止时检查问题。我们发现了一些这样的案例,其中最后一个案件花了大约3个月的时间才能找到,但是所有这些情况都像往常一样作为错误提交,并已迅速被上游修复。
要注意的一件事是,由于大多数输出基于给定样本中的数据(命令行中给出的标准输入或文件),因此通常是一个好主意,最好尝试找到好的样本,最好是其中一个不止一个。在更真实的测试脚本中,RadAmsa通常用于一次基于数十或数千个样本一次生成一个以上的输出,并且输出的后果主要通过并行测试,通常是通过将命令线上的每个输出在目标程序中提供给目标。我们将为BC做一个简单的这样的脚本,该脚本接受命令行的文件。 -O标志可用于给出一个文件名,而Radamsa应该写入输出而不是标准输出。如果生成多个输出,则该路径应具有一个%n,该路径将扩展到输出数。
$ echo'1 + 2'示例1
$ echo'(124%7) ^ 1*2'样本2
$ echo'sqrt((1 +长度(10^4)) * 5)'sample-3
$ bc样本- * /dev /null
3
10
5
$,而正确

radamsa -o fuzz-%n -n 100样品- *
bc fuzz-* /dev /null
测试$? -GT 127休息
完成此操作将再次延伸到明显的有趣时间,这是由较大的退出值或目标程序陷入困境的。
实际上,许多程序以独特的方式失败。捕获明显错误的一些常见方法是检查退出值,在内核中启用致命信号打印,并检查DMESG中的新事物是否出现,在Strace,GDB或Valgrind下运行一个程序,并查看是否抓住了一些有趣的内容,检查是否启动了错误的记者流程,是否启动了程序之后的程序等。

Output Options​

最重要的示例要么写入标准输出或文件。通过使用特殊参数为-O,也可以要求Radamsa成为TCP客户端或服务器。输出模式
 
返回
上方