Crates.io | byte-mutator |
lib.rs | byte-mutator |
version | 0.2.0 |
source | src |
created_at | 2019-11-05 03:55:37.335745 |
updated_at | 2020-02-24 03:01:18.885081 |
description | Library to define staged mutations for a series of bytes |
homepage | |
repository | https://github.com/ragona/byte-mutator |
max_upload_size | |
id | 178197 |
size | 19,584 |
byte-mutator
is a crate for defining a set of rules by which to mutate byte arrays. It's intented to be used as part
of a fuzzing workflow to configure how you want your input mutated. For example, you might want to do one pass where
you don't mess with the header of your message, and you only mutate the body -- or you could mutate them differently.
This example is configured to flip every bit in the bytes one at a time.
let mut bytes = b"foo".to_vec();
let mut mutator = ByteMutator::new().with_stages(vec![Stage {
count: 0,
max: Some(24),
mutations: vec![Mutation {
range: None,
mutation: MutationType::BitFlipper { width: 1 },
}],
}]);
// Bytes in their original state
assert_eq!(&bytes, b"foo");
// Perform a single mutation
mutator.mutate(&mut bytes);
// We've flipped the first bit (little endian)
// 0b1100110 -> 0b1100111, 103 -> 102, f -> g
assert_eq!(&bytes, b"goo");
This is an example of a mutator configured to flip bits forever.
[[stages]]
# Iteration count at which to start the loop (useful for starting over from a future state)
count = 0
# A list of mutations to perform on this stage
[[stages.mutations]]
# Must be a variant of the MutatorTypes enum
mutation = {"BitFlipper" = {width = 1 }}
&mut [u8]
reference.Iterations
, just added a simple Option<usize>
for max
.Ryan Ragona – @ryanragona – https://github.com/ragona
Distributed under the MIT license. See LICENSE
for more information.
Always happy to see PRs or Issues.
To contribute:
git checkout -b feature/fooBar
)git commit -am 'Add some fooBar'
)git push origin feature/fooBar
)