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次下载

MIT许可证

120KB
2.5K SLoC

lain

此crate提供在开发fuzzer时可能有用的一些功能。需要使用最近夜的Rust构建来支持特殊化功能。

请将此crate视为“beta”版本,并且对于预1.0版本,次要版本发布可能会出现破坏性变化。

crates.io docs.rs

文档

请参阅维基以获取高级概述。

对于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