18个版本
0.5.5 | 2021年5月21日 |
---|---|
0.5.4 | 2021年3月31日 |
0.5.3 | 2020年11月9日 |
0.5.2 | 2020年7月7日 |
0.1.2 | 2019年7月13日 |
#8 in #mutate
每月22次下载
120KB
2.5K SLoC
lain
此crate提供在开发fuzzer时可能有用的一些功能。需要使用最近夜的Rust构建来支持特殊化功能。
请将此crate视为“beta”版本,并且对于预1.0版本,次要版本发布可能会出现破坏性变化。
文档
请参阅维基以获取高级概述。
对于API文档:https://docs.rs/lain
安装
Lain需要rust nightly构建以支持特殊化。
将以下内容添加到您的Cargo.toml中
[dependencies]
lain = "0.2"
示例用法
extern crate lain;
use lain::prelude::*;
use lain::rand;
use lain::hexdump;
#[derive(Debug, Mutatable, NewFuzzed, BinarySerialize)]
struct MyStruct {
field_1: u8,
#[lain(bits = 3)]
field_2: u8,
#[lain(bits = 5)]
field_3: u8,
#[lain(min = 5, max = 10000)]
field_4: u32,
#[lain(ignore)]
ignored_field: u64,
}
fn main() {
let mut mutator = Mutator::new(rand::thread_rng());
let mut instance = MyStruct::new_fuzzed(&mut mutator, None);
let mut serialized_data = Vec::with_capacity(instance.serialized_size());
instance.binary_serialize::<_, BigEndian>(&mut serialized_data);
println!("{:?}", instance);
println!("hex representation:\n{}", hexdump(&serialized_data));
// perform small mutations on the instance
instance.mutate(&mut mutator, None);
println!("{:?}", instance);
}
// Output:
//
// MyStruct { field_1: 95, field_2: 5, field_3: 14, field_4: 8383, ignored_field: 0 }
// hex representation:
// ------00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
// 0000: 5F 75 00 00 20 BF 00 00 00 00 00 00 00 00 _u...¿........
// MyStruct { field_1: 160, field_2: 5, field_3: 14, field_4: 8383, ignored_field: 0 }
一个fuzzer及其目标的完整示例可以在examples目录中找到。服务器是用C编写的,通过TCP套接字接收数据,解析消息,并突变一些状态。fuzzer有C数据结构的Rust定义,并将完全突变的消息发送到服务器,并利用Driver
对象来管理fuzzer线程和状态。
贡献
此项目欢迎贡献和建议。大多数贡献都需要您同意一份贡献者许可协议(CLA),声明您有权并且确实授予我们使用您的贡献的权利。有关详细信息,请访问https://cla.microsoft.com。
在您提交拉取请求时,CLA机器人会自动确定您是否需要提供CLA,并相应地装饰PR(例如,标签,注释)。只需遵循机器人提供的说明即可。您只需在整个使用我们的CLA的repo中这样做一次。
此项目已采用Microsoft开源行为准则。有关更多信息,请参阅行为准则FAQ或联系[email protected],如有任何其他问题或评论。
许可证:MIT
依赖项
~4MB
~80K SLoC