From cdfd37e0a2a393bb0827a3b93406fde1fc26b411 Mon Sep 17 00:00:00 2001 From: matheusbaptistella Date: Tue, 4 Jul 2023 22:11:37 -0300 Subject: [PATCH 01/21] Initial commit for GSOC's 2023 Fuzzer Template Generator project --- libafl_ftg/Cargo.toml | 9 ++++ libafl_ftg/questions.csv | 29 ++++++++++++ libafl_ftg/src/lib.rs | 95 ++++++++++++++++++++++++++++++++++++++++ libafl_ftg/src/main.rs | 55 +++++++++++++++++++++++ 4 files changed, 188 insertions(+) create mode 100644 libafl_ftg/Cargo.toml create mode 100644 libafl_ftg/questions.csv create mode 100644 libafl_ftg/src/lib.rs create mode 100644 libafl_ftg/src/main.rs diff --git a/libafl_ftg/Cargo.toml b/libafl_ftg/Cargo.toml new file mode 100644 index 0000000000..80a6db7916 --- /dev/null +++ b/libafl_ftg/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "libafl_ftg" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +csv = "1.2.2" diff --git a/libafl_ftg/questions.csv b/libafl_ftg/questions.csv new file mode 100644 index 0000000000..1169705070 --- /dev/null +++ b/libafl_ftg/questions.csv @@ -0,0 +1,29 @@ +name;content;answer1;answer2;next1;next2;previous +Introduction;Description;Yes;Sure;1;1;0 +Do you have the target's source code?;Description;Yes;No;2;3;0 +Can you provide a harness function?;Description;Yes;No;3;3;0 +Do you want to use a map to track coverage?;Description;Yes;No;4;7;0 +Do you need multiple maps?;Description;Yes;No;5;5;0 +Do you know the size of the map at compile time?;Description;Yes;No;6;6;0 +Do you want to improve input selection by adding a hit counts map?;Description;Yes;No;7;7;0 +Do you want to consider the logged values of CMP instructions?;Description;Yes;No;8;8;0 +Do you want to consider the backtrace after the harness crashes?;Description;Yes;No;9;9;0 +Do you want to keep track of the testcases' runtime?;Description;Yes;No;10;11;0 +Do you want to consider a timeout as a solution?;Description;Yes;No;11;11;0 +Do you want to consider a crash as a solution?;Description;Yes;No;12;12;0 +Do you want to manage the testcases in memory or on disk?;Description;In memory; On disk;13;14;0 +Do you want to manage only in memory or in memory and on disk?;Description;In memory;Both;16;16;0 +Do you want to manage only on disk or on disk and in memory?;Description;On disk;Both;15;16;0 +Do you want to load testcases from disk to memory using a cache?;Description;Yes;No;16;16;0 +Do you want to see stats about the fuzzing campaign?;Description;Yes;No;17;20;0 +Do you want to see the stats in a UI style?;Description;Yes;No;18;18;0 +Do you want to store the stats to a file?;Description;Yes;No;19;20;0 +Do you want to store them to a TOML or JSON file?;Description;TOML;JSON;20;20;0 +Do you want to restart your fuzzer every time a solution is achieved?;Description;Yes;No;21;21;0 +Do you want to load testcases from the corpus using a queue policy?;Description;Yes;No;22;22;0 +Do you want to prioritize smaller and faster testcases?;Description;Yes;No;23;23;0 +Can your target corrupt memory used by the fuzzer?;Description;Yes;No;24;24;0 +Do you want to set a timeout before each run?;Description;Yes;No;25;25;0 +Do you want to generate an initial set of inputs?;Description;Yes;No;26;26;0 +Do you want to schedule mutations?;Description;Yes;No;27;27;0 +Do you want to use the StdMutationalStage?;Description;Yes;No;28;28;0 diff --git a/libafl_ftg/src/lib.rs b/libafl_ftg/src/lib.rs new file mode 100644 index 0000000000..ae1405edfa --- /dev/null +++ b/libafl_ftg/src/lib.rs @@ -0,0 +1,95 @@ +use std::{ + error::Error, +}; + +// Used to copy the fields of a question. +type QuestionTup = (String, String, String, String, usize, usize, usize); + +// This reresents a "node": the answer of a Question might lead to different Questions (different nodes). +#[derive(Clone)] +pub struct Question { + name: String, // The question that will be asked. + content: String, // Description related to the question, to help the user. + answer1: String, // One of the possible answers that may result, either in another question, or a component. + answer2: String, // Same. + next1: usize, // The next question (or the choice of an specific component), if answer1 is chosen. + next2: usize, // The next question (or the choice of an specific component), if answer2 is chosen. + previous: usize, // The question that lead to the current one (possible UNDO functionality implementation). +} + +impl Question { + // Builds the diagram of questions from the csv file (this will probably be changed, the csv is used only for demonstrative purposes). + // The diagram is a vector of Questions (vector of nodes): each Question, depending on the answer, will have the index of the next Question + // that should be asked. + pub fn new() -> Result, Box> { + let mut reader = csv::ReaderBuilder::new() + .delimiter(b';') + .from_path("questions.csv")?; + + let mut questions_diagram: Vec = Vec::new(); + + for result in reader.deserialize() { + let question: QuestionTup = result?; + + questions_diagram.push( + Question { + name: question.0, + content: question.1, + answer1: question.2, + answer2: question.3, + next1: question.4, + next2: question.5, + previous: question.6 + } + ); + } + + Ok(questions_diagram) + } + + pub fn print_question(&self) -> () { + print!("{esc}c", esc = 27 as char); + println!("=========================\nFuzzer Template Generator\n========================="); + println!("{}\n", self.name); + println!("{}\n", self.content); + println!("\t{}\t{}\tUndo", self.answer1, self.answer2); + } + + // Checks if the answer given by the user is one of the possibilities that the generator expects. + pub fn validate_answer(&self, input: &mut String) -> bool { + if input.ends_with("\r\n") { + input.truncate(input.len() - 2); + } + else if input.ends_with("\n") { + input.truncate(input.len() - 1); + } + + // For now we dont check for variants (with the implementation of an interface this wont be necessary). + // The "Undo" option makes the generator go back to the previous question, so if the user do something + // by mistake, they can correct it. + if (input == &self.answer1) || (input == &self.answer2) || (input == "Undo") { + return true; + } + + false + } +} + +pub fn next_question(q_diagram: &mut Vec, question: &Question, input: &String, q_index: usize) -> usize { + // If it's equal to answer1, we go to next1, which is the next question if answer1 is chosen. + if input == &question.answer1 { + // We save the index of the current question in the 'previous' field of the next one. + q_diagram[question.next1].previous = q_index; + + question.next1 + } + else if input == &question.answer2 { + q_diagram[question.next2].previous = q_index; + + question.next2 + } + // Undo option. + else { + question.previous + } +} diff --git a/libafl_ftg/src/main.rs b/libafl_ftg/src/main.rs new file mode 100644 index 0000000000..34db537502 --- /dev/null +++ b/libafl_ftg/src/main.rs @@ -0,0 +1,55 @@ +use std::{ + io, + error::Error, + process, +}; + +use libafl_ftg::Question; +use libafl_ftg::next_question; + +fn run() -> Result<(), Box> { + // Mutable because we have to update the index of the 'previous' field. + let mut q_diagram = Question::new()?; + + // Basically, a q_diagram[q_index] is asked, answered by the user and then the generator moves on to the next q_diagram[q_index], until the last one is asked. + // Note that not all the questions are going to be asked. So if the user chooses not to use a monitor, the generator shouldn't ask + // if he wants a monitor with a UI style or a Simple monitor. + let mut q_index = 0; + let mut input = String::new(); + + while q_index < q_diagram.len() { + q_diagram[q_index].print_question(); + + io::stdin().read_line(&mut input).expect("Error reading input"); + + while !q_diagram[q_index].validate_answer(&mut input) { + println!("Please type a valid answer:"); + input = "".to_string(); + io::stdin().read_line(&mut input).expect("Error reading input"); + } + + // :( I couldnt think another way to do it so for now I am cloning + let question: Question = q_diagram[q_index].clone(); + + if q_index < q_diagram.len() - 1 { + q_index = next_question(&mut q_diagram, &question, &input, q_index); + } + else { + q_index += 1; + } + + input = "".to_string(); + } + + print!("{esc}c", esc = 27 as char); + println!("\nAll questions answered!!!\n\nShutting down..."); + + Ok(()) +} + +fn main() { + if let Err(err) = run() { + println!("{}", err); + process::exit(1); + } +} From a1104dec5fefc09f40a898485f6cd29b9818c470 Mon Sep 17 00:00:00 2001 From: matheusbaptistella Date: Tue, 4 Jul 2023 23:18:49 -0300 Subject: [PATCH 02/21] Minor changes --- Cargo.toml | 1 + libafl_ftg/Cargo.toml | 8 ++ libafl_ftg/README.md | 1 + libafl_ftg/src/lib.rs | 189 ++++++++++++++++++++--------------------- libafl_ftg/src/main.rs | 25 +++--- 5 files changed, 115 insertions(+), 109 deletions(-) create mode 100644 libafl_ftg/README.md diff --git a/Cargo.toml b/Cargo.toml index ef58e3fa83..8c53101716 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,6 +5,7 @@ members = [ "libafl_cc", "libafl_targets", "libafl_frida", + "libafl_ftg", "libafl_qemu", "libafl_tinyinst", "libafl_sugar", diff --git a/libafl_ftg/Cargo.toml b/libafl_ftg/Cargo.toml index 80a6db7916..162892f5a9 100644 --- a/libafl_ftg/Cargo.toml +++ b/libafl_ftg/Cargo.toml @@ -2,6 +2,14 @@ name = "libafl_ftg" version = "0.1.0" edition = "2021" +authors = ["matheus "] +description = "libafl's fuzzer template generator" +documentation = "TODO" +repository = "https://github.com/AFLplusplus/LibAFL/" +readme = "../README.md" +license = "MIT OR Apache-2.0" +keywords = ["fuzzing", "testing", "security"] +categories = ["TODO"] # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/libafl_ftg/README.md b/libafl_ftg/README.md new file mode 100644 index 0000000000..30404ce4c5 --- /dev/null +++ b/libafl_ftg/README.md @@ -0,0 +1 @@ +TODO \ No newline at end of file diff --git a/libafl_ftg/src/lib.rs b/libafl_ftg/src/lib.rs index ae1405edfa..f6281cd49d 100644 --- a/libafl_ftg/src/lib.rs +++ b/libafl_ftg/src/lib.rs @@ -1,95 +1,94 @@ -use std::{ - error::Error, -}; - -// Used to copy the fields of a question. -type QuestionTup = (String, String, String, String, usize, usize, usize); - -// This reresents a "node": the answer of a Question might lead to different Questions (different nodes). -#[derive(Clone)] -pub struct Question { - name: String, // The question that will be asked. - content: String, // Description related to the question, to help the user. - answer1: String, // One of the possible answers that may result, either in another question, or a component. - answer2: String, // Same. - next1: usize, // The next question (or the choice of an specific component), if answer1 is chosen. - next2: usize, // The next question (or the choice of an specific component), if answer2 is chosen. - previous: usize, // The question that lead to the current one (possible UNDO functionality implementation). -} - -impl Question { - // Builds the diagram of questions from the csv file (this will probably be changed, the csv is used only for demonstrative purposes). - // The diagram is a vector of Questions (vector of nodes): each Question, depending on the answer, will have the index of the next Question - // that should be asked. - pub fn new() -> Result, Box> { - let mut reader = csv::ReaderBuilder::new() - .delimiter(b';') - .from_path("questions.csv")?; - - let mut questions_diagram: Vec = Vec::new(); - - for result in reader.deserialize() { - let question: QuestionTup = result?; - - questions_diagram.push( - Question { - name: question.0, - content: question.1, - answer1: question.2, - answer2: question.3, - next1: question.4, - next2: question.5, - previous: question.6 - } - ); - } - - Ok(questions_diagram) - } - - pub fn print_question(&self) -> () { - print!("{esc}c", esc = 27 as char); - println!("=========================\nFuzzer Template Generator\n========================="); - println!("{}\n", self.name); - println!("{}\n", self.content); - println!("\t{}\t{}\tUndo", self.answer1, self.answer2); - } - - // Checks if the answer given by the user is one of the possibilities that the generator expects. - pub fn validate_answer(&self, input: &mut String) -> bool { - if input.ends_with("\r\n") { - input.truncate(input.len() - 2); - } - else if input.ends_with("\n") { - input.truncate(input.len() - 1); - } - - // For now we dont check for variants (with the implementation of an interface this wont be necessary). - // The "Undo" option makes the generator go back to the previous question, so if the user do something - // by mistake, they can correct it. - if (input == &self.answer1) || (input == &self.answer2) || (input == "Undo") { - return true; - } - - false - } -} - -pub fn next_question(q_diagram: &mut Vec, question: &Question, input: &String, q_index: usize) -> usize { - // If it's equal to answer1, we go to next1, which is the next question if answer1 is chosen. - if input == &question.answer1 { - // We save the index of the current question in the 'previous' field of the next one. - q_diagram[question.next1].previous = q_index; - - question.next1 - } - else if input == &question.answer2 { - q_diagram[question.next2].previous = q_index; - - question.next2 - } - // Undo option. - else { - question.previous - } -} +use std::error::Error; + +// Used to copy the fields of a question. +type QuestionTup = (String, String, String, String, usize, usize, usize); + +// This reresents a "node": the answer of a Question might lead to different Questions (different nodes). +#[derive(Clone)] +pub struct Question { + name: String, // The question that will be asked. + content: String, // Description related to the question, to help the user. + answer1: String, // One of the possible answers that may result, either in another question, or a component. + answer2: String, // Same. + next1: usize, // The next question (or the choice of an specific component), if answer1 is chosen. + next2: usize, // The next question (or the choice of an specific component), if answer2 is chosen. + previous: usize, // The question that lead to the current one (possible UNDO functionality implementation). +} + +impl Question { + // Builds the diagram of questions from the csv file (this will probably be changed, the csv is used only for demonstrative purposes). + // The diagram is a vector of Questions (vector of nodes): each Question, depending on the answer, will have the index of the next Question + // that should be asked. + pub fn new() -> Result, Box> { + let mut reader = csv::ReaderBuilder::new() + .delimiter(b';') + .from_path("questions.csv")?; + + let mut questions_diagram: Vec = Vec::new(); + + for result in reader.deserialize() { + let question: QuestionTup = result?; + + questions_diagram.push(Question { + name: question.0, + content: question.1, + answer1: question.2, + answer2: question.3, + next1: question.4, + next2: question.5, + previous: question.6, + }); + } + + Ok(questions_diagram) + } + + pub fn print_question(&self) -> () { + print!("{esc}c", esc = 27 as char); + println!("=========================\nFuzzer Template Generator\n========================="); + println!("{}\n", self.name); + println!("{}\n", self.content); + println!("\t{}\t{}\tUndo", self.answer1, self.answer2); + } + + // Checks if the answer given by the user is one of the possibilities that the generator expects. + pub fn validate_answer(&self, input: &mut String) -> bool { + if input.ends_with("\r\n") { + input.truncate(input.len() - 2); + } else if input.ends_with("\n") { + input.truncate(input.len() - 1); + } + + // For now we dont check for variants (with the implementation of an interface this wont be necessary). + // The "Undo" option makes the generator go back to the previous question, so if the user do something + // by mistake, they can correct it. + if (input == &self.answer1) || (input == &self.answer2) || (input == "Undo") { + return true; + } + + false + } + + pub fn next_question( + &self, + q_diagram: &mut Vec, + input: &String, + q_index: usize, + ) -> usize { + // If it's equal to answer1, we go to next1, which is the next question if answer1 is chosen. + if input == &self.answer1 { + // We save the index of the current question in the 'previous' field of the next one. + q_diagram[self.next1].previous = q_index; + + self.next1 + } else if input == &self.answer2 { + q_diagram[self.next2].previous = q_index; + + self.next2 + } + // Undo option. + else { + self.previous + } + } +} diff --git a/libafl_ftg/src/main.rs b/libafl_ftg/src/main.rs index 34db537502..7e4af17cec 100644 --- a/libafl_ftg/src/main.rs +++ b/libafl_ftg/src/main.rs @@ -1,11 +1,6 @@ -use std::{ - io, - error::Error, - process, -}; +use std::{error::Error, io, process}; use libafl_ftg::Question; -use libafl_ftg::next_question; fn run() -> Result<(), Box> { // Mutable because we have to update the index of the 'previous' field. @@ -20,21 +15,23 @@ fn run() -> Result<(), Box> { while q_index < q_diagram.len() { q_diagram[q_index].print_question(); - io::stdin().read_line(&mut input).expect("Error reading input"); + io::stdin() + .read_line(&mut input) + .expect("Error reading input"); while !q_diagram[q_index].validate_answer(&mut input) { println!("Please type a valid answer:"); input = "".to_string(); - io::stdin().read_line(&mut input).expect("Error reading input"); + io::stdin() + .read_line(&mut input) + .expect("Error reading input"); } - // :( I couldnt think another way to do it so for now I am cloning - let question: Question = q_diagram[q_index].clone(); - if q_index < q_diagram.len() - 1 { - q_index = next_question(&mut q_diagram, &question, &input, q_index); - } - else { + q_index = q_diagram[q_index] + .clone() + .next_question(&mut q_diagram, &input, q_index); + } else { q_index += 1; } From 307fe4c99158c839b0aae8a9a4da2a9a7ea47535 Mon Sep 17 00:00:00 2001 From: matheusbaptistella Date: Wed, 5 Jul 2023 21:48:57 -0300 Subject: [PATCH 03/21] Changed questions file from CSV to TOML --- libafl_ftg/Cargo.toml | 3 +- libafl_ftg/questions.toml | 251 ++++++++++++++++++++++++++++++++++++++ libafl_ftg/src/lib.rs | 36 ++---- 3 files changed, 266 insertions(+), 24 deletions(-) create mode 100644 libafl_ftg/questions.toml diff --git a/libafl_ftg/Cargo.toml b/libafl_ftg/Cargo.toml index 162892f5a9..6a95111e84 100644 --- a/libafl_ftg/Cargo.toml +++ b/libafl_ftg/Cargo.toml @@ -14,4 +14,5 @@ categories = ["TODO"] # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -csv = "1.2.2" +toml = "0.7.6" +serde = { version = "1.0", features = ["derive"] } diff --git a/libafl_ftg/questions.toml b/libafl_ftg/questions.toml new file mode 100644 index 0000000000..3dc1c3152d --- /dev/null +++ b/libafl_ftg/questions.toml @@ -0,0 +1,251 @@ +[[question]] +name = "Introduction" +content = "Description" +answer1 = "Yes" +answer2 = "Sure" +next1 = 1 +next2 = 1 +previous = 0 + +[[question]] +name = "Do you have the target's source code?" +content = "Description" +answer1 = "Yes" +answer2 = "No" +next1 = 2 +next2 = 3 +previous = 0 + +[[question]] +name = "Can you provide a harness function?" +content = "Description" +answer1 = "Yes" +answer2 = "No" +next1 = 3 +next2 = 3 +previous = 0 + +[[question]] +name = "Do you want to use a map to track coverage?" +content = "Description" +answer1 = "Yes" +answer2 = "No" +next1 = 4 +next2 = 7 +previous = 0 + +[[question]] +name = "Do you need multiple maps?" +content = "Description" +answer1 = "Yes" +answer2 = "No" +next1 = 5 +next2 = 5 +previous = 0 + +[[question]] +name = "Do you know the size of the map at compile time?" +content = "Description" +answer1 = "Yes" +answer2 = "No" +next1 = 6 +next2 = 6 +previous = 0 + +[[question]] +name = "Do you want to improve input selection by adding a hit counts map?" +content = "Description" +answer1 = "Yes" +answer2 = "No" +next1 = 7 +next2 = 7 +previous = 0 + +[[question]] +name = "Do you want to consider the logged values of CMP instructions?" +content = "Description" +answer1 = "Yes" +answer2 = "No" +next1 = 8 +next2 = 8 +previous = 0 + +[[question]] +name = "Do you want to consider the backtrace after the harness crashes?" +content = "Description" +answer1 = "Yes" +answer2 = "No" +next1 = 9 +next2 = 9 +previous = 0 + +[[question]] +name = "Do you want to keep track of the testcases' runtime?" +content = "Description" +answer1 = "Yes" +answer2 = "No" +next1 = 10 +next2 = 11 +previous = 0 + +[[question]] +name = "Do you want to consider a timeout as a solution?" +content = "Description" +answer1 = "Yes" +answer2 = "No" +next1 = 11 +next2 = 11 +previous = 0 + +[[question]] +name = "Do you want to consider a crash as a solution?" +content = "Description" +answer1 = "Yes" +answer2 = "No" +next1 = 12 +next2 = 12 +previous = 0 + +[[question]] +name = "Do you want to manage the testcases in memory or on disk?" +content = "Description" +answer1 = "In memory" +answer2 = "On disk" +next1 = 13 +next2 = 14 +previous = 0 + +[[question]] +name = "Do you want to manage only in memory or in memory and on disk?" +content = "Description" +answer1 = "In memory" +answer2 = "Both" +next1 = 16 +next2 = 16 +previous = 0 + +[[question]] +name = "Do you want to manage only on disk or on disk and in memory?" +content = "Description" +answer1 = "On disk" +answer2 = "Both" +next1 = 15 +next2 = 16 +previous = 0 + +[[question]] +name = "Do you want to load testcases from disk to memory using a cache?" +content = "Description" +answer1 = "Yes" +answer2 = "No" +next1 = 16 +next2 = 16 +previous = 0 + +[[question]] +name = "Do you want to see stats about the fuzzing campaign?" +content = "Description" +answer1 = "Yes" +answer2 = "No" +next1 = 17 +next2 = 20 +previous = 0 + +[[question]] +name = "Do you want to see the stats in a UI style?" +content = "Description" +answer1 = "Yes" +answer2 = "No" +next1 = 18 +next2 = 18 +previous = 0 + +[[question]] +name = "Do you want to store the stats to a file?" +content = "Description" +answer1 = "Yes" +answer2 = "No" +next1 = 19 +next2 = 20 +previous = 0 + +[[question]] +name = "Do you want to store them to a TOML or JSON file?" +content = "Description" +answer1 = "TOML" +answer2 = "JSON" +next1 = 20 +next2 = 20 +previous = 0 + +[[question]] +name = "Do you want to restart your fuzzer every time a solution is achieved?" +content = "Description" +answer1 = "Yes" +answer2 = "No" +next1 = 21 +next2 = 21 +previous = 0 + +[[question]] +name = "Do you want to load testcases from the corpus using a queue policy?" +content = "Description" +answer1 = "Yes" +answer2 = "No" +next1 = 22 +next2 = 22 +previous = 0 + +[[question]] +name = "Do you want to prioritize smaller and faster testcases?" +content = "Description" +answer1 = "Yes" +answer2 = "No" +next1 = 23 +next2 = 23 +previous = 0 + +[[question]] +name = "Can your target corrupt memory used by the fuzzer?" +content = "Description" +answer1 = "Yes" +answer2 = "No" +next1 = 24 +next2 = 24 +previous = 0 + +[[question]] +name = "Do you want to set a timeout before each run?" +content = "Description" +answer1 = "Yes" +answer2 = "No" +next1 = 25 +next2 = 25 +previous = 0 + +[[question]] +name = "Do you want to generate an initial set of inputs?" +content = "Description" +answer1 = "Yes" +answer2 = "No" +next1 = 26 +next2 = 26 +previous = 0 + +[[question]] +name = "Do you want to schedule mutations?" +content = "Description" +answer1 = "Yes" +answer2 = "No" +next1 = 27 +next2 = 27 +previous = 0 + +[[question]] +name = "Do you want to use the StdMutationalStage?" +content = "Description" +answer1 = "Yes" +answer2 = "No" +next1 = 28 +next2 = 28 +previous = 0 \ No newline at end of file diff --git a/libafl_ftg/src/lib.rs b/libafl_ftg/src/lib.rs index f6281cd49d..3edd94052b 100644 --- a/libafl_ftg/src/lib.rs +++ b/libafl_ftg/src/lib.rs @@ -1,15 +1,21 @@ use std::error::Error; +use toml; +use std::fs; +use serde::Deserialize; -// Used to copy the fields of a question. -type QuestionTup = (String, String, String, String, usize, usize, usize); +// Used to read the TOML file +#[derive(Deserialize)] +struct QuestionList { + question: Vec, +} // This reresents a "node": the answer of a Question might lead to different Questions (different nodes). -#[derive(Clone)] +#[derive(Clone, Deserialize)] pub struct Question { name: String, // The question that will be asked. content: String, // Description related to the question, to help the user. answer1: String, // One of the possible answers that may result, either in another question, or a component. - answer2: String, // Same. + answer2: String, // Same (for now, only 2 possible answers). next1: usize, // The next question (or the choice of an specific component), if answer1 is chosen. next2: usize, // The next question (or the choice of an specific component), if answer2 is chosen. previous: usize, // The question that lead to the current one (possible UNDO functionality implementation). @@ -20,27 +26,11 @@ impl Question { // The diagram is a vector of Questions (vector of nodes): each Question, depending on the answer, will have the index of the next Question // that should be asked. pub fn new() -> Result, Box> { - let mut reader = csv::ReaderBuilder::new() - .delimiter(b';') - .from_path("questions.csv")?; - - let mut questions_diagram: Vec = Vec::new(); + let contents = fs::read_to_string("questions.toml")?; - for result in reader.deserialize() { - let question: QuestionTup = result?; - - questions_diagram.push(Question { - name: question.0, - content: question.1, - answer1: question.2, - answer2: question.3, - next1: question.4, - next2: question.5, - previous: question.6, - }); - } + let q_list: QuestionList = toml::from_str(&contents)?; - Ok(questions_diagram) + Ok(q_list.question) } pub fn print_question(&self) -> () { From 2e8974eb80e4c1233bb489de2384ecaed5bd8f32 Mon Sep 17 00:00:00 2001 From: matheusbaptistella Date: Mon, 17 Jul 2023 12:35:17 -0300 Subject: [PATCH 04/21] Added variable number of answers/next questions --- libafl_ftg/diagram/FTGQuestionsDiagram.wsd | 150 ++++++++++++++++++ libafl_ftg/questions.toml | 176 +++++++-------------- libafl_ftg/src/lib.rs | 52 +++--- 3 files changed, 234 insertions(+), 144 deletions(-) create mode 100644 libafl_ftg/diagram/FTGQuestionsDiagram.wsd diff --git a/libafl_ftg/diagram/FTGQuestionsDiagram.wsd b/libafl_ftg/diagram/FTGQuestionsDiagram.wsd new file mode 100644 index 0000000000..6761ff8539 --- /dev/null +++ b/libafl_ftg/diagram/FTGQuestionsDiagram.wsd @@ -0,0 +1,150 @@ +@startuml Fuzzer Template Generator Questions Diagram +hide empty description + +state "Introduction" as State0 +[*] --> State0 + +state InitialConsiderations { + 'Restricts in memory fuzzing + state "Do you have the target's source code?" as State1 + State0 --> State1: Let's Begin + + 'Restricts in memory fuzzing + state "Can you provide a harness function?" as State2 + State1 --> State2: Yes +} + +state Observers { + state "Do you want to use a map to track coverage?" as State3 + State1 --> State3: No + State2 --> State3: No + State2 --> State3: Yes + + state "Do you need multiple maps?" as State4 + State3 --> State4: Yes + + state "Do you know the size of the map\n at compile time?" as State5 + State4 --> State5: No + State4 --> State5: Yes + + state "Do you want to improve input\n selection by adding a hit counts map?" as State6 + State5 --> State6: No + State5 --> State6: Yes + + state "Do you want to consider the logged\n values of CMP instructions?" as State7 + State3 --> State7: No + State6 --> State7: No + State6 --> State7: Yes + + state ForkState1 <> + State7 --> ForkState1: No + State7 --> ForkState1: Yes + + 'BacktraceObserver requires a harness + state "Do you want to consider the backtrace\n after the harness crashes?" as State8 + ForkState1 --> State8: (if the user can\n provide a harness) + + 'Restricts the use of timeout + state "Do you want to keep track of\n the testcases' runtime?" as State9 + ForkState1 --> State9: (if the user can not\n provide a harness) + State8 --> State9: No + State8 --> State9: Yes + +} + +state Feedbacks { + 'Depends if the fuzzer is observing the runtime of the testcases + state "Do you want to consider a timeout\n as a solution?" as State10 + State9 --> State10: Yes + + state "Do you want to consider a crash\n as a solution?" as State11 + State9 --> State11: No + State10 --> State11: No + State10 --> State11: Yes + +} + +state States { + state "Do you want to manage the testcases\n in memory, on disk or both?" as State12 + State11 --> State12: No + State11 --> State12: Yes + + state "Do you want to load testcases from\ndisk to memory using a cache?" as State13 + State12 --> State13: On disk +} + +state Monitors { + state "Do you want to see stats about\n the fuzzing campaign?" as State14 + State12 --> State14: Both + State12 --> State14: In memory + State13 --> State14: No + State13 --> State14: Yes + + state "Do you want to see the stats in a UI style?" as State15 + State14 --> State15: Yes + + state "Do you want to store the stats to a file?" as State16 + State15 --> State16: No + State15 --> State16: Yes + + state "Do you want to store them to\n a TOML or JSON file?" as State17 + State16 --> State17: Yes +} + +State Events { + state ForkState2 <> + State14 --> ForkState2: No + State16 --> ForkState2: No + State17 --> ForkState2: TOML + State17 --> ForkState2: JSON + + 'Depends on whether in memorry fuzzing is possible or not + state "Do you want to restart your fuzzer\n every time a solution is achieved?" as State18 + ForkState2 --> State18: (if in memory fuzzing is possible, then use\n a Simple event manager, whereas if not,\n use a LLMP one) +} + +State Schedulers { + state "Do you want to load testcases from the\ncorpus using a queue policy?" as State19 + State18 --> State19: No + State18 --> State19: Yes + + state "Do you want to prioritize smaller\n and faster testcases?" as State20 + State19 --> State20: No + State19 --> State20: Yes +} + +State Executors { + state ForkState3 <> + State20 --> ForkState3: No + State20 --> ForkState3: Yes + + state "Can your target corrupt memory\n used by the fuzzer?" as State21 + ForkState3 --> State21: (if in memory fuzzing is possible) + + state "Do you want to set a timeout\n before each run?" as State22 + ForkState3 --> State22: (if in memory fuzzing is not possible) + State21 --> State22: No + State21 --> State22: Yes +} + +State Generators { + state "Do you want to generate\n an initial set of inputs?" as State23 + State22 --> State23: No + State22 --> State23: Yes +} + +State Mutators { + state "Do you want to schedule mutations?" as State24 + State23 --> State24: No + State23 --> State24: Yes +} + +State Stages { + state "StdMutationalStage" as State25 + State24 --> State25: No + State24 --> State25: Yes +} + +State25 --> [*] + +@enduml \ No newline at end of file diff --git a/libafl_ftg/questions.toml b/libafl_ftg/questions.toml index 3dc1c3152d..ff5d0567dc 100644 --- a/libafl_ftg/questions.toml +++ b/libafl_ftg/questions.toml @@ -1,251 +1,181 @@ [[question]] name = "Introduction" content = "Description" -answer1 = "Yes" -answer2 = "Sure" -next1 = 1 -next2 = 1 +answers = [ "Yes", "Quit" ] +next = [ 1, 1 ] previous = 0 [[question]] name = "Do you have the target's source code?" content = "Description" -answer1 = "Yes" -answer2 = "No" -next1 = 2 -next2 = 3 +answers = [ "Yes", "No" ] +next = [ 2, 3 ] previous = 0 [[question]] name = "Can you provide a harness function?" content = "Description" -answer1 = "Yes" -answer2 = "No" -next1 = 3 -next2 = 3 +answers = [ "Yes", "No" ] +next = [ 3, 3 ] previous = 0 [[question]] name = "Do you want to use a map to track coverage?" content = "Description" -answer1 = "Yes" -answer2 = "No" -next1 = 4 -next2 = 7 +answers = [ "Yes", "No" ] +next = [ 4, 7 ] previous = 0 [[question]] name = "Do you need multiple maps?" content = "Description" -answer1 = "Yes" -answer2 = "No" -next1 = 5 -next2 = 5 +answers = [ "Yes", "No" ] +next = [ 5, 5 ] previous = 0 [[question]] name = "Do you know the size of the map at compile time?" content = "Description" -answer1 = "Yes" -answer2 = "No" -next1 = 6 -next2 = 6 +answers = [ "Yes", "No" ] +next = [ 6, 6 ] previous = 0 [[question]] name = "Do you want to improve input selection by adding a hit counts map?" content = "Description" -answer1 = "Yes" -answer2 = "No" -next1 = 7 -next2 = 7 +answers = [ "Yes", "No" ] +next = [ 7, 7 ] previous = 0 [[question]] name = "Do you want to consider the logged values of CMP instructions?" content = "Description" -answer1 = "Yes" -answer2 = "No" -next1 = 8 -next2 = 8 +answers = [ "Yes", "No" ] +next = [ 8, 8 ] previous = 0 [[question]] name = "Do you want to consider the backtrace after the harness crashes?" content = "Description" -answer1 = "Yes" -answer2 = "No" -next1 = 9 -next2 = 9 +answers = [ "Yes", "No" ] +next = [ 9, 9 ] previous = 0 [[question]] name = "Do you want to keep track of the testcases' runtime?" content = "Description" -answer1 = "Yes" -answer2 = "No" -next1 = 10 -next2 = 11 +answers = [ "Yes", "No" ] +next = [ 10, 11 ] previous = 0 [[question]] name = "Do you want to consider a timeout as a solution?" content = "Description" -answer1 = "Yes" -answer2 = "No" -next1 = 11 -next2 = 11 +answers = [ "Yes", "No" ] +next = [ 11, 11 ] previous = 0 [[question]] name = "Do you want to consider a crash as a solution?" content = "Description" -answer1 = "Yes" -answer2 = "No" -next1 = 12 -next2 = 12 +answers = [ "Yes", "No" ] +next = [ 12, 12 ] previous = 0 [[question]] -name = "Do you want to manage the testcases in memory or on disk?" +name = "Do you want to manage the testcases in memory, on disk or both?" content = "Description" -answer1 = "In memory" -answer2 = "On disk" -next1 = 13 -next2 = 14 -previous = 0 - -[[question]] -name = "Do you want to manage only in memory or in memory and on disk?" -content = "Description" -answer1 = "In memory" -answer2 = "Both" -next1 = 16 -next2 = 16 -previous = 0 - -[[question]] -name = "Do you want to manage only on disk or on disk and in memory?" -content = "Description" -answer1 = "On disk" -answer2 = "Both" -next1 = 15 -next2 = 16 +answers = [ "In memory", "On disk", "Both" ] +next = [ 14, 13, 14 ] previous = 0 [[question]] name = "Do you want to load testcases from disk to memory using a cache?" content = "Description" -answer1 = "Yes" -answer2 = "No" -next1 = 16 -next2 = 16 +answers = [ "Yes", "No" ] +next = [ 14, 14 ] previous = 0 [[question]] name = "Do you want to see stats about the fuzzing campaign?" content = "Description" -answer1 = "Yes" -answer2 = "No" -next1 = 17 -next2 = 20 +answers = [ "Yes", "No" ] +next = [ 15, 18 ] previous = 0 [[question]] name = "Do you want to see the stats in a UI style?" content = "Description" -answer1 = "Yes" -answer2 = "No" -next1 = 18 -next2 = 18 +answers = [ "Yes", "No" ] +next = [ 16, 16 ] previous = 0 [[question]] name = "Do you want to store the stats to a file?" content = "Description" -answer1 = "Yes" -answer2 = "No" -next1 = 19 -next2 = 20 +answers = [ "Yes", "No" ] +next = [ 17, 18 ] previous = 0 [[question]] name = "Do you want to store them to a TOML or JSON file?" content = "Description" -answer1 = "TOML" -answer2 = "JSON" -next1 = 20 -next2 = 20 +answers = [ "TOML", "JSON" ] +next = [ 18, 18 ] previous = 0 [[question]] name = "Do you want to restart your fuzzer every time a solution is achieved?" content = "Description" -answer1 = "Yes" -answer2 = "No" -next1 = 21 -next2 = 21 +answers = [ "Yes", "No" ] +next = [ 19, 19 ] previous = 0 [[question]] name = "Do you want to load testcases from the corpus using a queue policy?" content = "Description" -answer1 = "Yes" -answer2 = "No" -next1 = 22 -next2 = 22 +answers = [ "Yes", "No" ] +next = [ 20, 20 ] previous = 0 [[question]] name = "Do you want to prioritize smaller and faster testcases?" content = "Description" -answer1 = "Yes" -answer2 = "No" -next1 = 23 -next2 = 23 +answers = [ "Yes", "No" ] +next = [ 21, 21 ] previous = 0 [[question]] name = "Can your target corrupt memory used by the fuzzer?" content = "Description" -answer1 = "Yes" -answer2 = "No" -next1 = 24 -next2 = 24 +answers = [ "Yes", "No" ] +next = [ 22, 22 ] previous = 0 [[question]] name = "Do you want to set a timeout before each run?" content = "Description" -answer1 = "Yes" -answer2 = "No" -next1 = 25 -next2 = 25 +answers = [ "Yes", "No" ] +next = [ 23, 23 ] previous = 0 [[question]] name = "Do you want to generate an initial set of inputs?" content = "Description" -answer1 = "Yes" -answer2 = "No" -next1 = 26 -next2 = 26 +answers = [ "Yes", "No" ] +next = [ 24, 24 ] previous = 0 [[question]] name = "Do you want to schedule mutations?" content = "Description" -answer1 = "Yes" -answer2 = "No" -next1 = 27 -next2 = 27 +answers = [ "Yes", "No" ] +next = [ 25, 25 ] previous = 0 [[question]] name = "Do you want to use the StdMutationalStage?" content = "Description" -answer1 = "Yes" -answer2 = "No" -next1 = 28 -next2 = 28 +answers = [ "Yes", "No" ] +next = [ 26, 26 ] previous = 0 \ No newline at end of file diff --git a/libafl_ftg/src/lib.rs b/libafl_ftg/src/lib.rs index 3edd94052b..ae7443dce0 100644 --- a/libafl_ftg/src/lib.rs +++ b/libafl_ftg/src/lib.rs @@ -14,10 +14,8 @@ struct QuestionList { pub struct Question { name: String, // The question that will be asked. content: String, // Description related to the question, to help the user. - answer1: String, // One of the possible answers that may result, either in another question, or a component. - answer2: String, // Same (for now, only 2 possible answers). - next1: usize, // The next question (or the choice of an specific component), if answer1 is chosen. - next2: usize, // The next question (or the choice of an specific component), if answer2 is chosen. + answers: Vec, // A vector containing all the possible answers for this question. + next: Vec, // A vector containing the next question for all the possible answers (for answer[0] the next question is next[0]...). previous: usize, // The question that lead to the current one (possible UNDO functionality implementation). } @@ -38,7 +36,12 @@ impl Question { println!("=========================\nFuzzer Template Generator\n========================="); println!("{}\n", self.name); println!("{}\n", self.content); - println!("\t{}\t{}\tUndo", self.answer1, self.answer2); + + for ans in &self.answers { + print!("\t{}", ans); + } + + println!("\tUndo"); } // Checks if the answer given by the user is one of the possibilities that the generator expects. @@ -49,13 +52,19 @@ impl Question { input.truncate(input.len() - 1); } - // For now we dont check for variants (with the implementation of an interface this wont be necessary). - // The "Undo" option makes the generator go back to the previous question, so if the user do something - // by mistake, they can correct it. - if (input == &self.answer1) || (input == &self.answer2) || (input == "Undo") { + // The "Undo" option makes the generator go back to the previous question, so if the user do something by mistake, they can correct it. + if input == "Undo" { return true; } + // Checks if the user typed one of the acceptable answers. + // For now we dont check for variants (with the implementation of an interface this wont be necessary). + for ans in &self.answers { + if input == ans { + return true; + } + } + false } @@ -65,20 +74,21 @@ impl Question { input: &String, q_index: usize, ) -> usize { - // If it's equal to answer1, we go to next1, which is the next question if answer1 is chosen. - if input == &self.answer1 { - // We save the index of the current question in the 'previous' field of the next one. - q_diagram[self.next1].previous = q_index; - - self.next1 - } else if input == &self.answer2 { - q_diagram[self.next2].previous = q_index; - self.next2 + if input == "Undo" { + return self.previous; } - // Undo option. - else { - self.previous + + // Checks which of the acceptable answers the user chose, then sets the 'previous' field for the next question as the current one and + // returns the index of the next question. + for (i, ans) in self.answers.iter().enumerate() { + if input == ans { + q_diagram[self.next[i]].previous = q_index; + return self.next[i]; + } } + + // The compiler complained about the base case so I'll probably change the logic of this method. + self.next[0] } } From f146edb64b72e9db043c6eab4840328630c63bcc Mon Sep 17 00:00:00 2001 From: matheusbaptistella Date: Mon, 17 Jul 2023 12:39:37 -0300 Subject: [PATCH 05/21] Added an image overview of the questions diagram --- libafl_ftg/diagram/FTGQuestionsDiagram.png | Bin 0 -> 218841 bytes .../questions_diagram.png:Zone.Identifier | 4 ++++ 2 files changed, 4 insertions(+) create mode 100644 libafl_ftg/diagram/FTGQuestionsDiagram.png create mode 100644 libafl_ftg/diagram/questions_diagram.png:Zone.Identifier diff --git a/libafl_ftg/diagram/FTGQuestionsDiagram.png b/libafl_ftg/diagram/FTGQuestionsDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..a0139744bb3012ef147a094ca16ebab837973d31 GIT binary patch literal 218841 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 z�|l-G0MCCov(R2}Kg#9o%s)F5Ntcwx{dD3NhBC54`Hw8I-m81f~NrG748}jL!DZ zfx*Emm`%2?LI;6Xu41U27?Oi!0}@)3%pH3ZNrJPdew!yig84Lsj)b5SKnga5VNCKu z$LQ$j?ohRxvSxF6d7qriy2g2(`R+umM3ve~%ZF01={q7{zTITd& zDFLnj{bI1fn00q-sfs*wZ#7*m_K=G4#9&3 zwl?d<=_U5tSLi04v+o~v*{Y=lTFO=5A0)BxwYMH}pQfMLGj-Hh#LzYFj%5@xb#=eg01?>QXzN}GT#28`Y=}%;o^>GJ-UlN?h0q~ox{s3Yg=~TJ$0qb zLn3bVn%|t<6-5Ia2MjE8kFGV7pca&(QHW#HXa`MAsbdB!V;Zd`0vF3i=9-!`pUG)5 zrpEGKer494;&j_dS3T^*ek-d4xO%pd>B$0n|FbLMqA`xUEOUFt-ypq-7zPIU6?fU(~N{~>aDMWi_?FV$e+vnU|%q)K(PFoA;w<7>PwqV-DCf0J(J^7y}jxk<;j=#JF( z
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

{m+C^D?F1AUto~4{CK@i`e4UPgNW_1_LEV8O|!J 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 z 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�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 Date: Mon, 24 Jul 2023 15:37:41 -0300 Subject: [PATCH 06/21] Added custom errors to validate the questions. --- .../questions_diagram.png:Zone.Identifier | 4 -- libafl_ftg/fuzzer.rs | 0 libafl_ftg/questions.toml | 33 ++++++++++- libafl_ftg/src/lib.rs | 57 +++++++++++++++++-- libafl_ftg/src/main.rs | 21 ++++--- 5 files changed, 95 insertions(+), 20 deletions(-) delete mode 100644 libafl_ftg/diagram/questions_diagram.png:Zone.Identifier create mode 100644 libafl_ftg/fuzzer.rs diff --git a/libafl_ftg/diagram/questions_diagram.png:Zone.Identifier b/libafl_ftg/diagram/questions_diagram.png:Zone.Identifier deleted file mode 100644 index 227f2fc1f4..0000000000 --- a/libafl_ftg/diagram/questions_diagram.png:Zone.Identifier +++ /dev/null @@ -1,4 +0,0 @@ -[ZoneTransfer] -ZoneId=3 -ReferrerUrl=http://www.plantuml.com/plantuml/png/bLZVJoCt47xFNp6w5teL9v7VW4xN4r0gAZZQSdsecZuukvEDnQwzvn-XeUh_NjjnyCI497sBFVPyttmpzdZpMHkcZ6rgkBRFpwZWApPjpGp2JoXGCICL_6fH6ow5XYlEAiMQpfoN26wXMKA9kb2yzVPEHnk_yzsDC4gMjl2Jxu1fUF3p9vq_l_yBFdpu58VhvJU26yxgImV0ImyPeFxf000S_UQW5I-C1YwWmKQg9SmSKowgi20YNabOIWjpja0mSmGNL8NcI8EMLXK8XIpnXqIbw_T66ebHznnkmwOBhBZe_2y2bqm41gsI2oyESroKGAtTOX648F2z1DzDyBrp-0Drvz-rBlTJZMg1AcgHXVh4X04ZmMeFrh3M3unYnQCBrkrY5GsulnMnVmvVPBBq3hHubbiO2SGI6biRtjRe6Mb2O92SzPEpmPlE7eLy2fdK_1b1plnlxtCYW1aNOTDo1s9uGwCS9f110XdIM79B3f-fonkVK0GkMciSjiOQGpPXkWHMbbnKFjNSKxB2Q4-H41ebs6627H52cMKleIAUag17BQiAIqThmMgBsijqUVUB8wkDie4cJS5uQmh6csH61reocjTIFSRg-lXnvWQVFgMTOx-JBF5-TrYJxwCBLyw-fd5z5a3XDyiLwdJ03XLhklRbIsXcucnq0eLYUevKhbFlcF1AuP-UmtTyLP7MqOA2YObuVVBVvpV8UaSePzwWj6O7-KV4DXveEPk8iDcWDWNJg8z0MP5L_zcRXCzU4mOXpLRIAJ6dr05DMMRnwKgtrZLYwQL-kS6li4LHQeW4PgismpN8a5CkAZyVumdQq4WFIYzRo-bJgzrGozfcTsxt9F4_8tV-oU57ZgsgP1T8Tpi8BVa0UgWjLpTCxsu83HEimaqH9o9rhsEG0agkNLafc4epf_nfP-eI8ZrAChVjLR2Mh4naOAPaCn61Wf6H5LYzkaiBLioHKgAjgqTWNIEwNmMIvBcJWXkvfsDgn63HmAQXPbxgqZCeMDCoNWbAOV061TU-Bfo0RrjlrgAJ9NswXCgQs_RAgZ6aEGR31J3u_SQDbZLIzaC2C200m_q0HYeAuQOOpFYc-n5nFoJkiowNsmw5Rjp8dpZuUdztwqlsvuVxBwz8Z0dGY02DNzvKOGm_Bb0OMXwaTVLIwye48skoe4QxpUFS7ABOkS27rzcyEQM0fpawBTJBAKwFKE0QMgardzRevH5oLrDH6DxxVax5gzY9YmjKot27aclDEtPdaJjZIQNE-YAj-DWO8ydj78zzKeNlGo6h3xnf7N7qUObNbphsuIfalcVuU8ud8ZvpRs_TyqOAV9yo-b3CiRGrVIOVU0Lv8XDHIDLQ_NBzVBDeqP6jUR6aKP-Hf9sIaBFEcDdsLNchk5JS-2UkRbXTXsmmKSACQOCg4IPKUYS4BZKPDq-fvBRy7FoDXSrlofJKVduKWezKg-GJOOUP14-_aLJyEWCdlRAjYSMoId89qoLv9z2uGsyb02IyxW65ztxtLMesNX5JTE4Ze3i0eAoWD7flq-Zje26aILI8R5swdqgQssW6wUVvxhglLiimr1NmrQTs25VELbyrcWRN9-WzWhwHxDoMCRkpPZyl7OyjD6vr_gNI6n0eAd3MBtCRfU5dAyn8F9ZoBkAnEYmWe4FYU40S3obeRgEWVXnixd-EJkSpYj8szNy0 -HostUrl=http://www.plantuml.com/plantuml/png/bLZVJoCt47xFNp6w5teL9v7VW4xN4r0gAZZQSdsecZuukvEDnQwzvn-XeUh_NjjnyCI497sBFVPyttmpzdZpMHkcZ6rgkBRFpwZWApPjpGp2JoXGCICL_6fH6ow5XYlEAiMQpfoN26wXMKA9kb2yzVPEHnk_yzsDC4gMjl2Jxu1fUF3p9vq_l_yBFdpu58VhvJU26yxgImV0ImyPeFxf000S_UQW5I-C1YwWmKQg9SmSKowgi20YNabOIWjpja0mSmGNL8NcI8EMLXK8XIpnXqIbw_T66ebHznnkmwOBhBZe_2y2bqm41gsI2oyESroKGAtTOX648F2z1DzDyBrp-0Drvz-rBlTJZMg1AcgHXVh4X04ZmMeFrh3M3unYnQCBrkrY5GsulnMnVmvVPBBq3hHubbiO2SGI6biRtjRe6Mb2O92SzPEpmPlE7eLy2fdK_1b1plnlxtCYW1aNOTDo1s9uGwCS9f110XdIM79B3f-fonkVK0GkMciSjiOQGpPXkWHMbbnKFjNSKxB2Q4-H41ebs6627H52cMKleIAUag17BQiAIqThmMgBsijqUVUB8wkDie4cJS5uQmh6csH61reocjTIFSRg-lXnvWQVFgMTOx-JBF5-TrYJxwCBLyw-fd5z5a3XDyiLwdJ03XLhklRbIsXcucnq0eLYUevKhbFlcF1AuP-UmtTyLP7MqOA2YObuVVBVvpV8UaSePzwWj6O7-KV4DXveEPk8iDcWDWNJg8z0MP5L_zcRXCzU4mOXpLRIAJ6dr05DMMRnwKgtrZLYwQL-kS6li4LHQeW4PgismpN8a5CkAZyVumdQq4WFIYzRo-bJgzrGozfcTsxt9F4_8tV-oU57ZgsgP1T8Tpi8BVa0UgWjLpTCxsu83HEimaqH9o9rhsEG0agkNLafc4epf_nfP-eI8ZrAChVjLR2Mh4naOAPaCn61Wf6H5LYzkaiBLioHKgAjgqTWNIEwNmMIvBcJWXkvfsDgn63HmAQXPbxgqZCeMDCoNWbAOV061TU-Bfo0RrjlrgAJ9NswXCgQs_RAgZ6aEGR31J3u_SQDbZLIzaC2C200m_q0HYeAuQOOpFYc-n5nFoJkiowNsmw5Rjp8dpZuUdztwqlsvuVxBwz8Z0dGY02DNzvKOGm_Bb0OMXwaTVLIwye48skoe4QxpUFS7ABOkS27rzcyEQM0fpawBTJBAKwFKE0QMgardzRevH5oLrDH6DxxVax5gzY9YmjKot27aclDEtPdaJjZIQNE-YAj-DWO8ydj78zzKeNlGo6h3xnf7N7qUObNbphsuIfalcVuU8ud8ZvpRs_TyqOAV9yo-b3CiRGrVIOVU0Lv8XDHIDLQ_NBzVBDeqP6jUR6aKP-Hf9sIaBFEcDdsLNchk5JS-2UkRbXTXsmmKSACQOCg4IPKUYS4BZKPDq-fvBRy7FoDXSrlofJKVduKWezKg-GJOOUP14-_aLJyEWCdlRAjYSMoId89qoLv9z2uGsyb02IyxW65ztxtLMesNX5JTE4Ze3i0eAoWD7flq-Zje26aILI8R5swdqgQssW6wUVvxhglLiimr1NmrQTs25VELbyrcWRN9-WzWhwHxDoMCRkpPZyl7OyjD6vr_gNI6n0eAd3MBtCRfU5dAyn8F9ZoBkAnEYmWe4FYU40S3obeRgEWVXnixd-EJkSpYj8szNy0 diff --git a/libafl_ftg/fuzzer.rs b/libafl_ftg/fuzzer.rs new file mode 100644 index 0000000000..e69de29bb2 diff --git a/libafl_ftg/questions.toml b/libafl_ftg/questions.toml index ff5d0567dc..ac985a0dd9 100644 --- a/libafl_ftg/questions.toml +++ b/libafl_ftg/questions.toml @@ -1,9 +1,13 @@ [[question]] name = "Introduction" -content = "Description" +content = """\ +Description\n +New line\ +""" answers = [ "Yes", "Quit" ] next = [ 1, 1 ] previous = 0 +code = "" [[question]] name = "Do you have the target's source code?" @@ -11,6 +15,7 @@ content = "Description" answers = [ "Yes", "No" ] next = [ 2, 3 ] previous = 0 +code = "" [[question]] name = "Can you provide a harness function?" @@ -18,6 +23,7 @@ content = "Description" answers = [ "Yes", "No" ] next = [ 3, 3 ] previous = 0 +code = "" [[question]] name = "Do you want to use a map to track coverage?" @@ -25,6 +31,7 @@ content = "Description" answers = [ "Yes", "No" ] next = [ 4, 7 ] previous = 0 +code = "" [[question]] name = "Do you need multiple maps?" @@ -32,6 +39,7 @@ content = "Description" answers = [ "Yes", "No" ] next = [ 5, 5 ] previous = 0 +code = "" [[question]] name = "Do you know the size of the map at compile time?" @@ -39,6 +47,7 @@ content = "Description" answers = [ "Yes", "No" ] next = [ 6, 6 ] previous = 0 +code = "" [[question]] name = "Do you want to improve input selection by adding a hit counts map?" @@ -46,6 +55,7 @@ content = "Description" answers = [ "Yes", "No" ] next = [ 7, 7 ] previous = 0 +code = "" [[question]] name = "Do you want to consider the logged values of CMP instructions?" @@ -53,6 +63,7 @@ content = "Description" answers = [ "Yes", "No" ] next = [ 8, 8 ] previous = 0 +code = "" [[question]] name = "Do you want to consider the backtrace after the harness crashes?" @@ -60,6 +71,7 @@ content = "Description" answers = [ "Yes", "No" ] next = [ 9, 9 ] previous = 0 +code = "" [[question]] name = "Do you want to keep track of the testcases' runtime?" @@ -67,6 +79,7 @@ content = "Description" answers = [ "Yes", "No" ] next = [ 10, 11 ] previous = 0 +code = "" [[question]] name = "Do you want to consider a timeout as a solution?" @@ -74,6 +87,7 @@ content = "Description" answers = [ "Yes", "No" ] next = [ 11, 11 ] previous = 0 +code = "" [[question]] name = "Do you want to consider a crash as a solution?" @@ -81,6 +95,7 @@ content = "Description" answers = [ "Yes", "No" ] next = [ 12, 12 ] previous = 0 +code = "" [[question]] name = "Do you want to manage the testcases in memory, on disk or both?" @@ -88,6 +103,7 @@ content = "Description" answers = [ "In memory", "On disk", "Both" ] next = [ 14, 13, 14 ] previous = 0 +code = "" [[question]] name = "Do you want to load testcases from disk to memory using a cache?" @@ -95,6 +111,7 @@ content = "Description" answers = [ "Yes", "No" ] next = [ 14, 14 ] previous = 0 +code = "" [[question]] name = "Do you want to see stats about the fuzzing campaign?" @@ -102,6 +119,7 @@ content = "Description" answers = [ "Yes", "No" ] next = [ 15, 18 ] previous = 0 +code = "" [[question]] name = "Do you want to see the stats in a UI style?" @@ -109,6 +127,7 @@ content = "Description" answers = [ "Yes", "No" ] next = [ 16, 16 ] previous = 0 +code = "" [[question]] name = "Do you want to store the stats to a file?" @@ -116,6 +135,7 @@ content = "Description" answers = [ "Yes", "No" ] next = [ 17, 18 ] previous = 0 +code = "" [[question]] name = "Do you want to store them to a TOML or JSON file?" @@ -123,6 +143,7 @@ content = "Description" answers = [ "TOML", "JSON" ] next = [ 18, 18 ] previous = 0 +code = "" [[question]] name = "Do you want to restart your fuzzer every time a solution is achieved?" @@ -130,6 +151,7 @@ content = "Description" answers = [ "Yes", "No" ] next = [ 19, 19 ] previous = 0 +code = "" [[question]] name = "Do you want to load testcases from the corpus using a queue policy?" @@ -137,6 +159,7 @@ content = "Description" answers = [ "Yes", "No" ] next = [ 20, 20 ] previous = 0 +code = "" [[question]] name = "Do you want to prioritize smaller and faster testcases?" @@ -144,6 +167,7 @@ content = "Description" answers = [ "Yes", "No" ] next = [ 21, 21 ] previous = 0 +code = "" [[question]] name = "Can your target corrupt memory used by the fuzzer?" @@ -151,6 +175,7 @@ content = "Description" answers = [ "Yes", "No" ] next = [ 22, 22 ] previous = 0 +code = "" [[question]] name = "Do you want to set a timeout before each run?" @@ -158,6 +183,7 @@ content = "Description" answers = [ "Yes", "No" ] next = [ 23, 23 ] previous = 0 +code = "" [[question]] name = "Do you want to generate an initial set of inputs?" @@ -165,6 +191,7 @@ content = "Description" answers = [ "Yes", "No" ] next = [ 24, 24 ] previous = 0 +code = "" [[question]] name = "Do you want to schedule mutations?" @@ -172,10 +199,12 @@ content = "Description" answers = [ "Yes", "No" ] next = [ 25, 25 ] previous = 0 +code = "" [[question]] name = "Do you want to use the StdMutationalStage?" content = "Description" answers = [ "Yes", "No" ] next = [ 26, 26 ] -previous = 0 \ No newline at end of file +previous = 0 +code = "" \ No newline at end of file diff --git a/libafl_ftg/src/lib.rs b/libafl_ftg/src/lib.rs index ae7443dce0..204fca973d 100644 --- a/libafl_ftg/src/lib.rs +++ b/libafl_ftg/src/lib.rs @@ -1,7 +1,6 @@ -use std::error::Error; -use toml; -use std::fs; use serde::Deserialize; +use std::{error::Error, fmt, fs}; +use toml; // Used to read the TOML file #[derive(Deserialize)] @@ -12,11 +11,12 @@ struct QuestionList { // This reresents a "node": the answer of a Question might lead to different Questions (different nodes). #[derive(Clone, Deserialize)] pub struct Question { - name: String, // The question that will be asked. - content: String, // Description related to the question, to help the user. + name: String, // The question that will be asked. + content: String, // Description related to the question, to help the user. answers: Vec, // A vector containing all the possible answers for this question. next: Vec, // A vector containing the next question for all the possible answers (for answer[0] the next question is next[0]...). previous: usize, // The question that lead to the current one (possible UNDO functionality implementation). + code: String, // Contains the Rust code associated to the question } impl Question { @@ -28,9 +28,32 @@ impl Question { let q_list: QuestionList = toml::from_str(&contents)?; + // Checks if each question is valid. + for q in q_list.question.iter() { + q.validate_question()?; + } + Ok(q_list.question) } + pub fn validate_question(&self) -> Result<(), Box> { + // At least one possible answer. + if self.answers.len() <= 0 { + return Err(Box::new(ZeroAnswersError( + "Error: Question with 0 answers found.\n".into(), + ))); + } + + // The number of answers has to match the number of next questions. + if self.answers.len() != self.next.len() { + return Err(Box::new(DiffNumOfAnswersAndNextError( + "Error: The number of answers in a question doesn't match the number of next questions.\n".into(), + ))); + } + + Ok(()) + } + pub fn print_question(&self) -> () { print!("{esc}c", esc = 27 as char); println!("=========================\nFuzzer Template Generator\n========================="); @@ -74,7 +97,6 @@ impl Question { input: &String, q_index: usize, ) -> usize { - if input == "Undo" { return self.previous; } @@ -92,3 +114,26 @@ impl Question { self.next[0] } } + +// Custom error types +#[derive(Debug)] +pub struct ZeroAnswersError(pub String); + +impl fmt::Display for ZeroAnswersError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{}", self.0) + } +} + +impl Error for ZeroAnswersError {} + +#[derive(Debug)] +pub struct DiffNumOfAnswersAndNextError(pub String); + +impl fmt::Display for DiffNumOfAnswersAndNextError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{}", self.0) + } +} + +impl Error for DiffNumOfAnswersAndNextError {} diff --git a/libafl_ftg/src/main.rs b/libafl_ftg/src/main.rs index 7e4af17cec..89c3d1bd66 100644 --- a/libafl_ftg/src/main.rs +++ b/libafl_ftg/src/main.rs @@ -1,4 +1,4 @@ -use std::{error::Error, io, process}; +use std::{error::Error, fs::OpenOptions, io, process}; use libafl_ftg::Question; @@ -6,27 +6,32 @@ fn run() -> Result<(), Box> { // Mutable because we have to update the index of the 'previous' field. let mut q_diagram = Question::new()?; - // Basically, a q_diagram[q_index] is asked, answered by the user and then the generator moves on to the next q_diagram[q_index], until the last one is asked. + // Basically, a question is asked, answered by the user and then the generator moves on to the next question, until the last one is asked. // Note that not all the questions are going to be asked. So if the user chooses not to use a monitor, the generator shouldn't ask // if he wants a monitor with a UI style or a Simple monitor. let mut q_index = 0; let mut input = String::new(); + // Output file, containing the generated fuzzer. + let mut out_file = OpenOptions::new() + .write(true) + .append(true) + .create(true) + .open("fuzzer.rs")?; + while q_index < q_diagram.len() { q_diagram[q_index].print_question(); - io::stdin() - .read_line(&mut input) - .expect("Error reading input"); + io::stdin().read_line(&mut input)?; while !q_diagram[q_index].validate_answer(&mut input) { println!("Please type a valid answer:"); input = "".to_string(); - io::stdin() - .read_line(&mut input) - .expect("Error reading input"); + io::stdin().read_line(&mut input)?; } + // Code generation + if q_index < q_diagram.len() - 1 { q_index = q_diagram[q_index] .clone() From 9cc7077c4ba82e5b8ccdaa8387c805933868c0c7 Mon Sep 17 00:00:00 2001 From: matheusbaptistella Date: Wed, 2 Aug 2023 19:26:47 -0300 Subject: [PATCH 07/21] Changed some aspects of the approach to deliver an initial working generator --- libafl_ftg/fuzzer.rs | 24 +++ libafl_ftg/questions.toml | 339 ++++++++++++++++++++++++++++---------- libafl_ftg/sections.toml | 24 +++ libafl_ftg/src/lib.rs | 268 ++++++++++++++++++++++-------- libafl_ftg/src/main.rs | 124 ++++++++++---- 5 files changed, 600 insertions(+), 179 deletions(-) create mode 100644 libafl_ftg/sections.toml diff --git a/libafl_ftg/fuzzer.rs b/libafl_ftg/fuzzer.rs index e69de29bb2..0746812a02 100644 --- a/libafl_ftg/fuzzer.rs +++ b/libafl_ftg/fuzzer.rs @@ -0,0 +1,24 @@ +use libafl::prelude::*; + +let observer = HitcountsMapObserver::new(StdMapObserver::new()); + +let mut feedback = feedback_or!(MaxMapFeedback::new(&observer), TimeObserver::new()); + +let mut objective = CrashFeedback::new(); + +let mut state = StdState::new(StdRand::with_seed(current_nanos()), InMemoryCorpus::new(), OnDiskCorpus::new(PathBuf::from()).unwrap(), &mut feedback, &mut objective,).unwrap(); + +let mon = SimpleMonitor::new(); + +let mut mgr = LlmpRestartingEventManager::new(mon); + +let scheduler = IndexesLenTimeMinimizerScheduler::new(QueueScheduler::new()); + +let mut fuzzer = StdFuzzer::new(scheduler, feedback, objective); + +let mut executor = ForkserverExecutor::new(); + +let mutator = StdScheduledMutator::new(); + +let mut stages = StdMutationalStage::new(); + diff --git a/libafl_ftg/questions.toml b/libafl_ftg/questions.toml index ac985a0dd9..bfa04785b4 100644 --- a/libafl_ftg/questions.toml +++ b/libafl_ftg/questions.toml @@ -1,210 +1,383 @@ [[question]] -name = "Introduction" +id = "intro" +title = "Introduction" content = """\ Description\n New line\ """ -answers = [ "Yes", "Quit" ] -next = [ 1, 1 ] +answers = [ "Next" ] +next = [ "source code" ] +code = [] previous = 0 -code = "" +skip = false [[question]] -name = "Do you have the target's source code?" +id = "source code" +title = "Do you have the target's source code?" content = "Description" answers = [ "Yes", "No" ] -next = [ 2, 3 ] +next = [ "harness", "observers" ] +code = [] previous = 0 -code = "" +skip = false [[question]] -name = "Can you provide a harness function?" +id = "harness" +title = "Can you provide a harness function?" content = "Description" answers = [ "Yes", "No" ] -next = [ 3, 3 ] +next = [ "observers", "observers" ] +code = [] previous = 0 -code = "" +skip = false [[question]] -name = "Do you want to use a map to track coverage?" +id = "observers" +title = "Observers" +content = "Description" +answers = [ "Next" ] +next = [ "map size" ] +code = [] +previous = 0 +skip = false + +[[question]] +id = "map size" +title = "Do you know the size of the map at compile time?" content = "Description" answers = [ "Yes", "No" ] -next = [ 4, 7 ] +next = [ "hit counts", "hit counts" ] +code = [ "let observer = ConstMapObserver::<>::new()", "let observer = StdMapObserver::new()" ] previous = 0 -code = "" +skip = false [[question]] -name = "Do you need multiple maps?" +id = "hit counts" +title = "Do you want to improve input selection by adding a hit counts map?" content = "Description" answers = [ "Yes", "No" ] -next = [ 5, 5 ] +next = [ "feedback", "feedback" ] +code = [ "let observer = HitcountsMapObserver::new($)", "" ] previous = 0 -code = "" +skip = false [[question]] -name = "Do you know the size of the map at compile time?" +id = "feedback" +title = "Feedback" +content = "Description" +answers = [ "Next" ] +next = [ "runtime" ] +code = [] +previous = 0 +skip = false + +[[question]] +id = "runtime" +title = "Do you want to keep track of the testcase's runtime?" content = "Description" answers = [ "Yes", "No" ] -next = [ 6, 6 ] +next = [ "crash", "crash" ] +code = [ "let mut feedback = feedback_or!(MaxMapFeedback::new(&observer), TimeObserver::new())", "let mut feedback = MaxMapFeedback::new(&observer)" ] previous = 0 -code = "" +skip = false [[question]] -name = "Do you want to improve input selection by adding a hit counts map?" +id = "crash" +title = "Do you want to consider a crash as a solution?" content = "Description" answers = [ "Yes", "No" ] -next = [ 7, 7 ] +next = [ "timeout", "state" ] +code = [ "let mut objective = CrashFeedback::new()", "let mut objective = TimeoutFeedback::new()" ] previous = 0 -code = "" +skip = false [[question]] -name = "Do you want to consider the logged values of CMP instructions?" +id = "timeout" +title = "Do you want to consider a timeout as a solution?" content = "Description" answers = [ "Yes", "No" ] -next = [ 8, 8 ] +next = [ "state", "state" ] +code = [ "let mut objective = feedback_and!($, TimeoutFeedback::new())", "" ] +previous = 0 +skip = false + +[[question]] +id = "state" +title = "State/Corpus" +content = "Description" +answers = [ "Next" ] +next = [ "manage testcases" ] +code = [] previous = 0 -code = "" +skip = false [[question]] -name = "Do you want to consider the backtrace after the harness crashes?" +id = "manage testcases" +title = "Do you want to manage the testcases in memory, on disk or both?" +content = "Description" +answers = [ "On disk", "In memory", "Both" ] +next = [ "via cache", "load state", "load state" ] +code = [ "", "InMemoryCorpus::new()", "InMemoryOnDiskCorpus::new().unwrap()" ] +previous = 0 +skip = false + +[[question]] +id = "via cache" +title = "Do you want to load testcases from disk to memory using a cache?" content = "Description" answers = [ "Yes", "No" ] -next = [ 9, 9 ] +next = [ "load state", "load state" ] +code = [ "CachedOnDiskCorpus::new().unwrap()", "OnDiskCorpus::new().unwrap()" ] +previous = 0 +skip = false + +[[question]] +id = "load state" +title = "" +content = "" +answers = [ "" ] +next = [ "monitors" ] +code = [ "let mut state = StdState::new(StdRand::with_seed(current_nanos()), $, OnDiskCorpus::new(PathBuf::from()).unwrap(), &mut feedback, &mut objective,).unwrap()" ] previous = 0 -code = "" +skip = false [[question]] -name = "Do you want to keep track of the testcases' runtime?" +id = "monitors" +title = "Monitors" +content = "Description" +answers = [ "Next" ] +next = [ "stats" ] +code = [] +previous = 0 +skip = false + +[[question]] +id = "stats" +title = "Do you want to see stats about the fuzzing campaign?" content = "Description" answers = [ "Yes", "No" ] -next = [ 10, 11 ] +next = [ "stats in ui", "stats to file" ] +code = [ "", "let mon = NopMonitor::new()" ] previous = 0 -code = "" +skip = false [[question]] -name = "Do you want to consider a timeout as a solution?" +id = "stats in ui" +title = "Do you want to see the stats in a UI style?" content = "Description" answers = [ "Yes", "No" ] -next = [ 11, 11 ] +next = [ "stats to file", "stats to file" ] +code = [ "let mon = (WIP)", "let mon = SimpleMonitor::new()" ] previous = 0 -code = "" +skip = false [[question]] -name = "Do you want to consider a crash as a solution?" +id = "stats to file" +title = "Do you want to store the stats to a file too?" content = "Description" answers = [ "Yes", "No" ] -next = [ 12, 12 ] +next = [ "file extensions", "events" ] +code = [ "", "" ] +previous = 0 +skip = false + +[[question]] +id = "file extensions" +title = "Do you want to store them to a TOML or JSON file?" +content = "Description" +answers = [ "TOML", "JSON" ] +next = [ "events", "events" ] +code = [ "let mon = OnDiskTOMLMonitor::new($)", "let mon = OnDiskJSONMonitor::new($)" ] previous = 0 -code = "" +skip = false [[question]] -name = "Do you want to manage the testcases in memory, on disk or both?" +id = "events" +title = "Events" content = "Description" -answers = [ "In memory", "On disk", "Both" ] -next = [ 14, 13, 14 ] +answers = [ "Next" ] +next = [ "restart fuzzer" ] +code = [] previous = 0 -code = "" +skip = false [[question]] -name = "Do you want to load testcases from disk to memory using a cache?" +id = "restart fuzzer" +title = "Do you want to restart your fuzzer every time a solution is achieved?" content = "Description" answers = [ "Yes", "No" ] -next = [ 14, 14 ] +next = [ "restart fuzzer llmp", "restart fuzzer llmp" ] +code = [ "let mut mgr = SimpleRestartingEventManager::launch(mon)", "let mut mgr = SimpleEventManager::new(mon)" ] previous = 0 -code = "" +skip = false [[question]] -name = "Do you want to see stats about the fuzzing campaign?" +id = "restart fuzzer llmp" +title = "Do you want to restart your fuzzer every time a solution is achieved (LLMP)?" content = "Description" answers = [ "Yes", "No" ] -next = [ 15, 18 ] +next = [ "schedulers", "schedulers" ] +code = [ "let mut mgr = LlmpRestartingEventManager::new(mon)", "let mut mgr = LlmpEventManager::new(mon).unwrap()" ] +previous = 0 +skip = false + +[[question]] +id = "schedulers" +title = "Schedulers" +content = "Description" +answers = [ "Next" ] +next = [ "queue policy" ] +code = [] previous = 0 -code = "" +skip = false [[question]] -name = "Do you want to see the stats in a UI style?" +id = "queue policy" +title = "Do you want to load testcases from the corpus using a queue policy?" content = "Description" answers = [ "Yes", "No" ] -next = [ 16, 16 ] +next = [ "smaller and faster", "fuzzer" ] +code = [ "let scheduler = QueueScheduler::new()", "let scheduler = RandScheduler::new()" ] previous = 0 -code = "" +skip = false [[question]] -name = "Do you want to store the stats to a file?" +id = "smaller and faster" +title = "Do you want to prioritize smaller and faster testcases?" content = "Description" answers = [ "Yes", "No" ] -next = [ 17, 18 ] +next = [ "fuzzer", "fuzzer" ] +code = [ "let scheduler = IndexesLenTimeMinimizerScheduler::new($)", "" ] previous = 0 -code = "" +skip = false [[question]] -name = "Do you want to store them to a TOML or JSON file?" +id = "fuzzer" +title = "Fuzzer" content = "Description" -answers = [ "TOML", "JSON" ] -next = [ 18, 18 ] +answers = [ "Next" ] +next = [ "load fuzzer" ] +code = [] +previous = 0 +skip = false + +[[question]] +id = "load fuzzer" +title = "" +content = "" +answers = [ "" ] +next = [ "executors" ] +code = ["let mut fuzzer = StdFuzzer::new(scheduler, feedback, objective)" ] previous = 0 -code = "" +skip = false [[question]] -name = "Do you want to restart your fuzzer every time a solution is achieved?" +id = "executors" +title = "Executors" content = "Description" -answers = [ "Yes", "No" ] -next = [ 19, 19 ] +answers = [ "Next" ] +next = [ "corrupt memory" ] +code = [] previous = 0 -code = "" +skip = false + [[question]] -name = "Do you want to load testcases from the corpus using a queue policy?" +id = "corrupt memory" +title = "Can your target corrupt memory used by the fuzzer?" content = "Description" answers = [ "Yes", "No" ] -next = [ 20, 20 ] +next = [ "in process timeout", "in process timeout" ] +code = [ "let mut executor = InProcessForkExecutor::new()", "let mut executor = InProcessExecutor::new()" ] previous = 0 -code = "" +skip = false [[question]] -name = "Do you want to prioritize smaller and faster testcases?" +id = "in process timeout" +title = "Do you want to set a timeout before each run?" content = "Description" answers = [ "Yes", "No" ] -next = [ 21, 21 ] +next = [ "forkserver timeout", "forkserver timeout" ] +code = [ "let mut executor = TimeoutExecutor::new($, Duration::from_secs())", "" ] previous = 0 -code = "" +skip = false [[question]] -name = "Can your target corrupt memory used by the fuzzer?" +id = "forkserver timeout" +title = "Do you want to set a timeout before each run (forkserver)?" content = "Description" answers = [ "Yes", "No" ] -next = [ 22, 22 ] +next = [ "generators", "generators" ] +code = [ "let mut executor = TimeoutForkserverExecutor::new($, Duration::from_secs())", "let mut executor = ForkserverExecutor::new()" ] previous = 0 -code = "" +skip = false [[question]] -name = "Do you want to set a timeout before each run?" +id = "generators" +title = "Generators" content = "Description" -answers = [ "Yes", "No" ] -next = [ 23, 23 ] +answers = [ "Next" ] +next = [ "initial inputs" ] +code = [] previous = 0 -code = "" +skip = false [[question]] -name = "Do you want to generate an initial set of inputs?" +id = "initial inputs" +title = "Do you want to generate an initial set of inputs?" content = "Description" answers = [ "Yes", "No" ] -next = [ 24, 24 ] +next = [ "mutators", "mutators" ] +code = [ "let mut = RandBytesGenerator::new()", "" ] +previous = 0 +skip = false + +[[question]] +id = "mutators" +title = "Mutators" +content = "Description" +answers = [ "Next" ] +next = [ "schedule mutations" ] +code = [] previous = 0 -code = "" +skip = false [[question]] -name = "Do you want to schedule mutations?" +id = "schedule mutations" +title = "Do you want to schedule mutations?" content = "Description" answers = [ "Yes", "No" ] -next = [ 25, 25 ] +next = [ "stages", "stages" ] +code = [ "let mutator = StdScheduledMutator::new()", "" ] +previous = 0 +skip = false + +[[question]] +id = "stages" +title = "Stages" +content = "Description" +answers = [ "Next" ] +next = [ "StdMutationalStage" ] +code = [] previous = 0 -code = "" +skip = false [[question]] -name = "Do you want to use the StdMutationalStage?" +id = "StdMutationalStage" +title = "Do you want to use the StdMutationalStage?" content = "Description" answers = [ "Yes", "No" ] -next = [ 26, 26 ] +next = [ "end", "end" ] +code = [ "let mut stages = StdMutationalStage::new()", "" ] +previous = 0 +skip = false + +[[question]] +id = "end" +title = "" +content = "" +answers = [] +next = [] +code = [] previous = 0 -code = "" \ No newline at end of file +skip = false \ No newline at end of file diff --git a/libafl_ftg/sections.toml b/libafl_ftg/sections.toml new file mode 100644 index 0000000000..f033c85008 --- /dev/null +++ b/libafl_ftg/sections.toml @@ -0,0 +1,24 @@ +informative_questions = [ + "observers", + "feedback", + "state", + "monitors", + "events", + "schedulers", + "fuzzer", + "executors", + "generators", + "mutators", + "stages", +] + +in_process_skip_questions = [ + "restart fuzzer", + "corrupt memory", + "in process timeout", +] + +forkserver_skip_questions = [ + "restart fuzzer llmp", + "forkserver timeout", +] \ No newline at end of file diff --git a/libafl_ftg/src/lib.rs b/libafl_ftg/src/lib.rs index 204fca973d..316f60d3a1 100644 --- a/libafl_ftg/src/lib.rs +++ b/libafl_ftg/src/lib.rs @@ -1,22 +1,31 @@ use serde::Deserialize; -use std::{error::Error, fmt, fs}; +use std::{error::Error, fs, fs::OpenOptions, io::Write}; use toml; +#[derive(Deserialize)] +struct Sections { + informative_questions: Vec, + in_process_skip_questions: Vec, + forkserver_skip_questions: Vec, +} + // Used to read the TOML file #[derive(Deserialize)] struct QuestionList { question: Vec, } -// This reresents a "node": the answer of a Question might lead to different Questions (different nodes). -#[derive(Clone, Deserialize)] +// This represents a "node": the answer of a Question might lead to different Questions (different nodes). +#[derive(Clone, Deserialize, PartialEq, Debug)] pub struct Question { - name: String, // The question that will be asked. + id: String, // ID is resolved to local indexes. + title: String, // The question that will be asked. content: String, // Description related to the question, to help the user. answers: Vec, // A vector containing all the possible answers for this question. - next: Vec, // A vector containing the next question for all the possible answers (for answer[0] the next question is next[0]...). + next: Vec, // A vector containing the next question for all the possible answers (for answer[0] the next question is next[0]...). + code: Vec, // Contains the Rust code associated to the question. previous: usize, // The question that lead to the current one (possible UNDO functionality implementation). - code: String, // Contains the Rust code associated to the question + skip: bool, // Marks questions that should be skipped. } impl Question { @@ -28,36 +37,26 @@ impl Question { let q_list: QuestionList = toml::from_str(&contents)?; - // Checks if each question is valid. - for q in q_list.question.iter() { - q.validate_question()?; - } + // // Checks if each question is valid. + // for q in q_list.question.iter() { + // q.validate_question()?; + // } Ok(q_list.question) } - pub fn validate_question(&self) -> Result<(), Box> { - // At least one possible answer. - if self.answers.len() <= 0 { - return Err(Box::new(ZeroAnswersError( - "Error: Question with 0 answers found.\n".into(), - ))); - } - - // The number of answers has to match the number of next questions. - if self.answers.len() != self.next.len() { - return Err(Box::new(DiffNumOfAnswersAndNextError( - "Error: The number of answers in a question doesn't match the number of next questions.\n".into(), - ))); + pub fn end(&self) -> bool { + if self.id == "end" { + return true; } - Ok(()) + false } pub fn print_question(&self) -> () { print!("{esc}c", esc = 27 as char); println!("=========================\nFuzzer Template Generator\n========================="); - println!("{}\n", self.name); + println!("{}\n", self.title); println!("{}\n", self.content); for ans in &self.answers { @@ -67,73 +66,206 @@ impl Question { println!("\tUndo"); } - // Checks if the answer given by the user is one of the possibilities that the generator expects. - pub fn validate_answer(&self, input: &mut String) -> bool { - if input.ends_with("\r\n") { - input.truncate(input.len() - 2); - } else if input.ends_with("\n") { - input.truncate(input.len() - 1); + pub fn resolve_answer( + &self, + questions: &Vec, + input: &String, + ) -> (usize, bool, usize) { + // The "Undo" option makes the generator go back to the previous question, so if the user do something by mistake, they can correct it. + if validate_answer(&input, &String::from("Undo")) { + return (self.previous, true, 0); } - // The "Undo" option makes the generator go back to the previous question, so if the user do something by mistake, they can correct it. - if input == "Undo" { + // Checks if the user typed one of the acceptable answers. If so, returns the index of the next question associated to that answer. + // For now we don't check for variants. + for (i, ans) in self.answers.iter().enumerate() { + if validate_answer(&input, &ans) { + let mut next_q = self.next_question(questions, i); + + // If the question should be skipped, then the generator goes to next question. + // These types of questions should always have only one possibility for next question (this is the approach for now). + while questions[next_q].skip { + next_q = questions[next_q].next_question(questions, 0); + } + + return (next_q, true, i); + } + } + + (0, false, 0) + } + + // Resolves the index in the vector for the next question + pub fn next_question(&self, questions: &Vec, i: usize) -> usize { + questions + .iter() + .position(|question| question.id == self.next[i]) + .unwrap() + } + + pub fn has_code(&self) -> bool { + if !self.code.is_empty() { return true; } - // Checks if the user typed one of the acceptable answers. - // For now we dont check for variants (with the implementation of an interface this wont be necessary). - for ans in &self.answers { - if input == ans { - return true; - } + false + } + + pub fn has_title(&self) -> bool { + if !self.title.is_empty() { + return true; } false } - pub fn next_question( + pub fn add_code(&self, code_content: &mut Vec, ans_i: usize) -> () { + if self.code[ans_i] != "" { + code_content.push(self.code[ans_i].to_string()); + } + } + + pub fn check_skip( &self, - q_diagram: &mut Vec, + questions: &mut Vec, input: &String, - q_index: usize, - ) -> usize { - if input == "Undo" { - return self.previous; + next_q: usize, + in_process_qs: &Vec, + forkserver_qs: &Vec, + ) -> () { + // If the user doesn't have the source code or can't provide a harness, then in process fuzzing in not possible and the questions + // related to it are skipped. + if ((self.id == "source code") || (self.id == "harness")) + && validate_answer(&input, &String::from("No")) + { + skip_questions(questions, &in_process_qs); } - - // Checks which of the acceptable answers the user chose, then sets the 'previous' field for the next question as the current one and - // returns the index of the next question. - for (i, ans) in self.answers.iter().enumerate() { - if input == ans { - q_diagram[self.next[i]].previous = q_index; - return self.next[i]; - } + // If it is possible, then forkserver/llmp questions are skipped. + else if (self.id == "harness") && validate_answer(&input, &String::from("Yes")) { + skip_questions(questions, &forkserver_qs); + // If the user is undoing, then the generator resets the questions that were marked to be skipped. + } else if ((self.id == "harness") + || (self.id == "observers") + || (self.id == "map size" + && (questions[next_q].id == "source code" || questions[next_q].id == "harness"))) + && validate_answer(&input, &String::from("Undo")) + { + unskip_questions(questions, &in_process_qs); + unskip_questions(questions, &forkserver_qs); } + } + + pub fn update_previous(&mut self, curr_q: usize) -> () { + // Saves the current questions as the previous for the next one. + self.previous = curr_q; + } +} + +pub fn read_sections() -> Result<(Vec, Vec, Vec), Box> { + let contents = fs::read_to_string("sections.toml")?; - // The compiler complained about the base case so I'll probably change the logic of this method. - self.next[0] + let sections: Sections = toml::from_str(&contents)?; + + Ok(( + sections.informative_questions, + sections.in_process_skip_questions, + sections.forkserver_skip_questions, + )) +} + +pub fn skip_questions(questions: &mut Vec, vec: &Vec) -> () { + for q in vec { + let i = questions + .iter() + .position(|question| &question.id == q) + .unwrap(); + + questions[i].skip = true; } } -// Custom error types -#[derive(Debug)] -pub struct ZeroAnswersError(pub String); +// Undo option +pub fn unskip_questions(questions: &mut Vec, vec: &Vec) -> () { + for q in vec { + let i = questions + .iter() + .position(|question| &question.id == q) + .unwrap(); -impl fmt::Display for ZeroAnswersError { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "{}", self.0) + questions[i].skip = false; } } -impl Error for ZeroAnswersError {} +pub fn replace_code(code_content: &mut Vec) -> () { + let mut symb_count: usize; -#[derive(Debug)] -pub struct DiffNumOfAnswersAndNextError(pub String); + // For each String of Rust code that contains a '$', we replace this '$' by another String (another Rust code). This works like in wrappers. + // The only requirement is that, for each '$' found in that String, the order of replacement is: the firt occurence is replaced by + // the code that is at 'position_of_string - number_of_occ_of_$'. Then, since this String will be removed from the vector, the next occ of '$' + // can be replaced by a String at the same position (i - symb_count). + for s in code_content.clone() { + if s.contains('$') { + // Current position + let i = code_content + .iter() + .position(|code| code.as_str() == s) + .unwrap(); -impl fmt::Display for DiffNumOfAnswersAndNextError { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "{}", self.0) + symb_count = s.chars().filter(|&c| c == '$').count(); + + for c in s.chars() { + if c == '$' { + // Since this component will be wrapped by another, it doesn't need to have an assigment to a variable. + //"let observer = StdMapObserver::new()" will become "StdMapObserver::new()" + if let Some(index) = code_content[i - symb_count].find("= ") { + code_content[i - symb_count].replace_range(..=index + 1, ""); + } + + code_content[i] = s.replacen('$', &code_content[i - symb_count], 1); + + code_content.remove(i - symb_count); + } + } + } } } -impl Error for DiffNumOfAnswersAndNextError {} +// Write Rust code in the file of the generated fuzzer. +pub fn write_code(code_content: Vec) -> Result<(), Box> { + let mut out_file = OpenOptions::new() + .append(true) + .create(true) + .open("fuzzer.rs")?; + + // While imports are not resolved, use this. + out_file.write_all("use libafl::prelude::*;\n\n".as_bytes())?; + + for (i, code) in code_content.iter().enumerate() { + out_file.write_all(code.as_bytes())?; + + if i < code_content.len() { + out_file.write_all(";\n\n".as_bytes())?; + } + } + + Ok(()) +} + +pub fn validate_answer(input: &String, ans: &String) -> bool { + let input_lower = input.to_lowercase(); + let ans_lower = ans.to_lowercase(); + + let mut input_chars = input_lower.chars(); + let mut ans_chars = ans_lower.chars(); + + // Basically, an aswer is valid if it is an acceptable variant of that given answer. Acceptable variants are strings that contain the + // characters in the same order as the answer, so for the answer "Yes", acceptable variants are: "y", "Ye", "yes", "yES", but not + // "Yess", "yy", "Yhes", "yYess"... + while let (Some(input_c), Some(ans_c)) = (input_chars.next(), ans_chars.next()) { + if input_c != ans_c { + return false; + } + } + + true +} diff --git a/libafl_ftg/src/main.rs b/libafl_ftg/src/main.rs index 89c3d1bd66..bafb3cba99 100644 --- a/libafl_ftg/src/main.rs +++ b/libafl_ftg/src/main.rs @@ -1,48 +1,116 @@ -use std::{error::Error, fs::OpenOptions, io, process}; - -use libafl_ftg::Question; +use libafl_ftg::{ + read_sections, replace_code, skip_questions, validate_answer, write_code, Question, +}; +use std::{error::Error, io, process}; fn run() -> Result<(), Box> { - // Mutable because we have to update the index of the 'previous' field. - let mut q_diagram = Question::new()?; + // The question diagram is a vector containing all the questions. + let mut questions = Question::new()?; - // Basically, a question is asked, answered by the user and then the generator moves on to the next question, until the last one is asked. - // Note that not all the questions are going to be asked. So if the user chooses not to use a monitor, the generator shouldn't ask - // if he wants a monitor with a UI style or a Simple monitor. - let mut q_index = 0; + // Each element is a String, which contains the Rust code associated to a question. This will be used to write to the file. + // Note that these are not in the same position as the questions, they are simply in the order that will be written to the file. + let mut code_content: Vec = Vec::new(); + + // Marks the questions that produced code that will be written. This has the same index as the questions in their vector. + // Undo option + let mut prod_code: Vec = vec![false; questions.len()]; + + // Index of the current question + let mut curr_q = 0; + // Index of the next question + let mut next_q; + // Index of the chosen answer + let mut ans_i; + + let mut valid_ans; + + // User input let mut input = String::new(); - // Output file, containing the generated fuzzer. - let mut out_file = OpenOptions::new() - .write(true) - .append(true) - .create(true) - .open("fuzzer.rs")?; + // Loads the vectors which contains the ids of questions that may be skipped. + let (info_qs, in_process_qs, forkserver_qs) = read_sections()?; - while q_index < q_diagram.len() { - q_diagram[q_index].print_question(); + // This option allows the user to skip informative question. + // These are questions that don't influence the generation of code, they simply explain the concepts and components used in Libafl. + print!("{esc}c", esc = 27 as char); + println!("Do you wish to skip informative questions? [Y/n]"); + loop { io::stdin().read_line(&mut input)?; + input = input.trim().to_string(); - while !q_diagram[q_index].validate_answer(&mut input) { - println!("Please type a valid answer:"); - input = "".to_string(); - io::stdin().read_line(&mut input)?; + if validate_answer(&input, &String::from("Yes")) { + skip_questions(&mut questions, &info_qs); + break; + } else if validate_answer(&input, &String::from("No")) { + break; } - // Code generation + println!("Please type a valid answer: "); + } + + // Basically, a question is asked, answered by the user and then the generator moves on to the next question, until the last one is asked. + // Note that not all the questions are going to be asked, for example, if the user chose not to use a monitor, the generator shouldn't + // ask if he wants a monitor with a UI style or a Simple monitor. + while !questions[curr_q].end() { + // If the question has a title, it means it contains information to show to the user and expects some input. + if questions[curr_q].has_title() { + questions[curr_q].print_question(); + + loop { + input = "".to_string(); + io::stdin().read_line(&mut input)?; + input = input.trim().to_string(); - if q_index < q_diagram.len() - 1 { - q_index = q_diagram[q_index] - .clone() - .next_question(&mut q_diagram, &input, q_index); + (next_q, valid_ans, ans_i) = questions[curr_q].resolve_answer(&questions, &input); + + if valid_ans { + break; + } + + println!("Please type a valid answer: "); + } + } else { + (next_q, _, ans_i) = questions[curr_q].resolve_answer(&questions, &input); + } + + // Code generation + if validate_answer(&input, &String::from("Undo")) { + // If the user chooses to undo a question that produced code, the code is removed. + // Since the Undo option goes backwards, we can simply pop the last piece of code. + if prod_code[next_q] { + code_content.pop(); + prod_code[next_q] = false; + } } else { - q_index += 1; + // Adds the code associated to the user choice + if questions[curr_q].has_code() { + questions[curr_q].add_code(&mut code_content, ans_i); + prod_code[curr_q] = true; + } } - input = "".to_string(); + // Skip questions that are no longer possible + questions[curr_q].clone().check_skip( + &mut questions, + &input, + next_q, + &in_process_qs, + &forkserver_qs, + ); + + // Only updates the 'previous' field when going forward in the questions diagram. + if !validate_answer(&input, &String::from("Undo")) { + questions[next_q].update_previous(curr_q); + } + + curr_q = next_q; } + replace_code(&mut code_content); + + write_code(code_content)?; + print!("{esc}c", esc = 27 as char); println!("\nAll questions answered!!!\n\nShutting down..."); From 21ad86622dd36645db1c358c3a9801c4194d91bd Mon Sep 17 00:00:00 2001 From: matheusbaptistella Date: Wed, 9 Aug 2023 16:07:27 -0300 Subject: [PATCH 08/21] Changed some questions and added file functionality --- libafl_ftg/fuzzer.rs | 34 ++++++++++++--- libafl_ftg/questions.toml | 90 +++++++++++++++++++++++++++++++++------ libafl_ftg/src/lib.rs | 17 ++++++-- libafl_ftg/src/main.rs | 9 ++-- 4 files changed, 122 insertions(+), 28 deletions(-) diff --git a/libafl_ftg/fuzzer.rs b/libafl_ftg/fuzzer.rs index 0746812a02..af8fd1c1bd 100644 --- a/libafl_ftg/fuzzer.rs +++ b/libafl_ftg/fuzzer.rs @@ -1,16 +1,32 @@ use libafl::prelude::*; +let mut shmem_provider = UnixShMemProvider::new().unwrap(); + +let mut shmem = shmem_provider.new_shmem(MAP_SIZE).unwrap(); +shmem.write_to_env("__AFL_SHM_ID").unwrap(); +let shmem_buf = shmem.as_mut_slice();; + let observer = HitcountsMapObserver::new(StdMapObserver::new()); -let mut feedback = feedback_or!(MaxMapFeedback::new(&observer), TimeObserver::new()); +let mut feedback = feedback_or!( + MaxMapFeedback::new(&observer), + TimeObserver::new() +); let mut objective = CrashFeedback::new(); -let mut state = StdState::new(StdRand::with_seed(current_nanos()), InMemoryCorpus::new(), OnDiskCorpus::new(PathBuf::from()).unwrap(), &mut feedback, &mut objective,).unwrap(); +let mut state = StdState::new( + StdRand::with_seed(current_nanos()), + InMemoryCorpus::new(), + OnDiskCorpus::new(PathBuf::from("./crashes")).unwrap(), + &mut feedback, + &mut objective, +) +.unwrap(); -let mon = SimpleMonitor::new(); +let mon = SimpleMonitor::new(|s| println!("{s}"); -let mut mgr = LlmpRestartingEventManager::new(mon); +let mut mgr = LlmpEventManager::new(mon).unwrap(); let scheduler = IndexesLenTimeMinimizerScheduler::new(QueueScheduler::new()); @@ -18,7 +34,13 @@ let mut fuzzer = StdFuzzer::new(scheduler, feedback, objective); let mut executor = ForkserverExecutor::new(); -let mutator = StdScheduledMutator::new(); +let mut generator = RandBytesGenerator::new(32); + +state + .generate_initial_inputs(&mut fuzzer, &mut executor, &mut generator, &mut mgr, 8) + .expect("Failed to generate the initial corpus"); + +let mutator = StdScheduledMutator::new(havoc_mutations()); -let mut stages = StdMutationalStage::new(); +let mut stages = tuple_list!(StdMutationalStage::new()); diff --git a/libafl_ftg/questions.toml b/libafl_ftg/questions.toml index bfa04785b4..d3c612cb4c 100644 --- a/libafl_ftg/questions.toml +++ b/libafl_ftg/questions.toml @@ -1,9 +1,9 @@ [[question]] id = "intro" title = "Introduction" -content = """\ -Description\n -New line\ +content = """ +Description +New line """ answers = [ "Next" ] next = [ "source code" ] @@ -17,7 +17,11 @@ title = "Do you have the target's source code?" content = "Description" answers = [ "Yes", "No" ] next = [ "harness", "observers" ] -code = [] +code = [ "", +"""let mut shmem_provider = UnixShMemProvider::new().unwrap();\n +let mut shmem = shmem_provider.new_shmem(MAP_SIZE).unwrap(); +shmem.write_to_env("__AFL_SHM_ID").unwrap(); +let shmem_buf = shmem.as_mut_slice();""" ] previous = 0 skip = false @@ -27,7 +31,11 @@ title = "Can you provide a harness function?" content = "Description" answers = [ "Yes", "No" ] next = [ "observers", "observers" ] -code = [] +code = [ "", +"""let mut shmem_provider = UnixShMemProvider::new().unwrap();\n +let mut shmem = shmem_provider.new_shmem(MAP_SIZE).unwrap(); +shmem.write_to_env("__AFL_SHM_ID").unwrap(); +let shmem_buf = shmem.as_mut_slice();""" ] previous = 0 skip = false @@ -77,7 +85,11 @@ title = "Do you want to keep track of the testcase's runtime?" content = "Description" answers = [ "Yes", "No" ] next = [ "crash", "crash" ] -code = [ "let mut feedback = feedback_or!(MaxMapFeedback::new(&observer), TimeObserver::new())", "let mut feedback = MaxMapFeedback::new(&observer)" ] +code = [ """let mut feedback = feedback_or!( +\tMaxMapFeedback::new(&observer), +\tTimeObserver::new() +)""", +"let mut feedback = MaxMapFeedback::new(&observer)" ] previous = 0 skip = false @@ -137,7 +149,14 @@ title = "" content = "" answers = [ "" ] next = [ "monitors" ] -code = [ "let mut state = StdState::new(StdRand::with_seed(current_nanos()), $, OnDiskCorpus::new(PathBuf::from()).unwrap(), &mut feedback, &mut objective,).unwrap()" ] +code = [ """let mut state = StdState::new( +\tStdRand::with_seed(current_nanos()), +\t$, +\tOnDiskCorpus::new(PathBuf::from("./crashes")).unwrap(), +\t&mut feedback, +\t&mut objective, +) +.unwrap()""" ] previous = 0 skip = false @@ -167,7 +186,7 @@ title = "Do you want to see the stats in a UI style?" content = "Description" answers = [ "Yes", "No" ] next = [ "stats to file", "stats to file" ] -code = [ "let mon = (WIP)", "let mon = SimpleMonitor::new()" ] +code = [ "let mon = (WIP)", """let mon = SimpleMonitor::new(|s| println!("{s}")""" ] previous = 0 skip = false @@ -288,7 +307,25 @@ title = "Can your target corrupt memory used by the fuzzer?" content = "Description" answers = [ "Yes", "No" ] next = [ "in process timeout", "in process timeout" ] -code = [ "let mut executor = InProcessForkExecutor::new()", "let mut executor = InProcessExecutor::new()" ] +code = [ """let mut shmem_provider = unix_shmem::UnixShMemProvider::new().unwrap();\n +let mut executor = InProcessForkExecutor::new( +\t&mut harness, +\ttuple_list!(observer), +\t&mut fuzzer, +\t&mut state, +\t&mut mgr, +\tshmem_provider +) +.expect("Failed to create the Executor")""", +"""let mut executor = InProcessExecutor::new( +\t&mut harness, +\ttuple_list!(observer), +\t&mut fuzzer, +\t&mut state, +\t&mut mgr, +)\ +.expect("Failed to create the Executor")""" +] previous = 0 skip = false @@ -298,7 +335,11 @@ title = "Do you want to set a timeout before each run?" content = "Description" answers = [ "Yes", "No" ] next = [ "forkserver timeout", "forkserver timeout" ] -code = [ "let mut executor = TimeoutExecutor::new($, Duration::from_secs())", "" ] +code = [ """let mut executor = TimeoutExecutor::new( +$, +Duration::from_secs() +)""", +"" ] previous = 0 skip = false @@ -308,7 +349,11 @@ title = "Do you want to set a timeout before each run (forkserver)?" content = "Description" answers = [ "Yes", "No" ] next = [ "generators", "generators" ] -code = [ "let mut executor = TimeoutForkserverExecutor::new($, Duration::from_secs())", "let mut executor = ForkserverExecutor::new()" ] +code = [ """let mut executor = TimeoutForkserverExecutor::new( +\t$, +\tDuration::from_secs() +)""", +"let mut executor = ForkserverExecutor::new()" ] previous = 0 skip = false @@ -328,7 +373,11 @@ title = "Do you want to generate an initial set of inputs?" content = "Description" answers = [ "Yes", "No" ] next = [ "mutators", "mutators" ] -code = [ "let mut = RandBytesGenerator::new()", "" ] +code = [ """let mut generator = RandBytesGenerator::new(32);\n +state +\t.generate_initial_inputs(&mut fuzzer, &mut executor, &mut generator, &mut mgr, 8) +\t.expect("Failed to generate the initial corpus")""" +, "" ] previous = 0 skip = false @@ -348,7 +397,7 @@ title = "Do you want to schedule mutations?" content = "Description" answers = [ "Yes", "No" ] next = [ "stages", "stages" ] -code = [ "let mutator = StdScheduledMutator::new()", "" ] +code = [ "let mutator = StdScheduledMutator::new(havoc_mutations())", "" ] previous = 0 skip = false @@ -368,7 +417,20 @@ title = "Do you want to use the StdMutationalStage?" content = "Description" answers = [ "Yes", "No" ] next = [ "end", "end" ] -code = [ "let mut stages = StdMutationalStage::new()", "" ] +code = [ "let mut stages = tuple_list!(StdMutationalStage::new())", "" ] +previous = 0 +skip = false + +[[question]] +id = "StdMutationalStage" +title = "" +content = "" +answers = [ "" ] +next = [ "end" ] +code = [ """fuzzer +\t.fuzz_loop(&mut stages, &mut executor, &mut state, &mut mgr) +\t.expect("Error in the fuzzing loop") +""" ] previous = 0 skip = false diff --git a/libafl_ftg/src/lib.rs b/libafl_ftg/src/lib.rs index 316f60d3a1..1206aca613 100644 --- a/libafl_ftg/src/lib.rs +++ b/libafl_ftg/src/lib.rs @@ -1,5 +1,5 @@ use serde::Deserialize; -use std::{error::Error, fs, fs::OpenOptions, io::Write}; +use std::{error::Error, fs, fs::OpenOptions, io::Write, path::Path}; use toml; #[derive(Deserialize)] @@ -231,11 +231,20 @@ pub fn replace_code(code_content: &mut Vec) -> () { } // Write Rust code in the file of the generated fuzzer. -pub fn write_code(code_content: Vec) -> Result<(), Box> { +pub fn write_code(code_content: Vec) -> Result> { + let mut counter = 0; + let mut file_name = format!("fuzzer.rs"); + + // Creates "fuzzer.rs", "fuzzer_1.rs" files if the previous one already exists... + while Path::new(&file_name).exists() { + counter += 1; + file_name = format!("fuzzer_{}.rs", counter); + } + let mut out_file = OpenOptions::new() .append(true) .create(true) - .open("fuzzer.rs")?; + .open(&file_name)?; // While imports are not resolved, use this. out_file.write_all("use libafl::prelude::*;\n\n".as_bytes())?; @@ -248,7 +257,7 @@ pub fn write_code(code_content: Vec) -> Result<(), Box> { } } - Ok(()) + Ok(file_name) } pub fn validate_answer(input: &String, ans: &String) -> bool { diff --git a/libafl_ftg/src/main.rs b/libafl_ftg/src/main.rs index bafb3cba99..285e7f623c 100644 --- a/libafl_ftg/src/main.rs +++ b/libafl_ftg/src/main.rs @@ -49,9 +49,9 @@ fn run() -> Result<(), Box> { println!("Please type a valid answer: "); } - // Basically, a question is asked, answered by the user and then the generator moves on to the next question, until the last one is asked. + // Basically, a question is asked, answered by the user and then the generator moves on to the next question. // Note that not all the questions are going to be asked, for example, if the user chose not to use a monitor, the generator shouldn't - // ask if he wants a monitor with a UI style or a Simple monitor. + // ask if he wants a monitor with a UI style or a SimpleMonitor. while !questions[curr_q].end() { // If the question has a title, it means it contains information to show to the user and expects some input. if questions[curr_q].has_title() { @@ -109,10 +109,11 @@ fn run() -> Result<(), Box> { replace_code(&mut code_content); - write_code(code_content)?; + let file_name = write_code(code_content)?; print!("{esc}c", esc = 27 as char); - println!("\nAll questions answered!!!\n\nShutting down..."); + println!("File {} successfully created!", file_name); + println!("\nAll questions answered."); Ok(()) } From e6d994770c9ca3286d665b38ece15d63fd2e7b1a Mon Sep 17 00:00:00 2001 From: matheusbaptistella Date: Wed, 9 Aug 2023 16:48:05 -0300 Subject: [PATCH 09/21] Corrected a question that was wrong --- libafl_ftg/questions.toml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/libafl_ftg/questions.toml b/libafl_ftg/questions.toml index d3c612cb4c..c03df17130 100644 --- a/libafl_ftg/questions.toml +++ b/libafl_ftg/questions.toml @@ -416,21 +416,20 @@ id = "StdMutationalStage" title = "Do you want to use the StdMutationalStage?" content = "Description" answers = [ "Yes", "No" ] -next = [ "end", "end" ] +next = [ "fuzz loop", "fuzz loop" ] code = [ "let mut stages = tuple_list!(StdMutationalStage::new())", "" ] previous = 0 skip = false [[question]] -id = "StdMutationalStage" +id = "fuzz loop" title = "" content = "" answers = [ "" ] next = [ "end" ] code = [ """fuzzer \t.fuzz_loop(&mut stages, &mut executor, &mut state, &mut mgr) -\t.expect("Error in the fuzzing loop") -""" ] +\t.expect("Error in the fuzzing loop")""" ] previous = 0 skip = false From b1f21abc55b49bf9bc92dd4032e0f990cb2c54b9 Mon Sep 17 00:00:00 2001 From: matheusbaptistella Date: Mon, 14 Aug 2023 23:40:23 -0300 Subject: [PATCH 10/21] Renamed the project to libafl_wizar. Removed unwanted features. Currently restructuring questions. --- libafl_wizard/Cargo.toml | 18 ++ libafl_wizard/README.md | 1 + libafl_wizard/old_questions.toml | 444 +++++++++++++++++++++++++++++++ libafl_wizard/questions.toml | 166 ++++++++++++ libafl_wizard/sections.toml | 10 + libafl_wizard/src/lib.rs | 278 +++++++++++++++++++ libafl_wizard/src/main.rs | 105 ++++++++ 7 files changed, 1022 insertions(+) create mode 100644 libafl_wizard/Cargo.toml create mode 100644 libafl_wizard/README.md create mode 100644 libafl_wizard/old_questions.toml create mode 100644 libafl_wizard/questions.toml create mode 100644 libafl_wizard/sections.toml create mode 100644 libafl_wizard/src/lib.rs create mode 100644 libafl_wizard/src/main.rs diff --git a/libafl_wizard/Cargo.toml b/libafl_wizard/Cargo.toml new file mode 100644 index 0000000000..dd56196b92 --- /dev/null +++ b/libafl_wizard/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "libafl_wizard" +version = "0.1.0" +edition = "2021" +authors = ["matheus "] +description = "libafl's fuzzer template generator" +documentation = "TODO" +repository = "https://github.com/AFLplusplus/LibAFL/" +readme = "../README.md" +license = "MIT OR Apache-2.0" +keywords = ["fuzzing", "testing", "security"] +categories = ["TODO"] + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +toml = "0.7.6" +serde = { version = "1.0", features = ["derive"] } diff --git a/libafl_wizard/README.md b/libafl_wizard/README.md new file mode 100644 index 0000000000..30404ce4c5 --- /dev/null +++ b/libafl_wizard/README.md @@ -0,0 +1 @@ +TODO \ No newline at end of file diff --git a/libafl_wizard/old_questions.toml b/libafl_wizard/old_questions.toml new file mode 100644 index 0000000000..c03df17130 --- /dev/null +++ b/libafl_wizard/old_questions.toml @@ -0,0 +1,444 @@ +[[question]] +id = "intro" +title = "Introduction" +content = """ +Description +New line +""" +answers = [ "Next" ] +next = [ "source code" ] +code = [] +previous = 0 +skip = false + +[[question]] +id = "source code" +title = "Do you have the target's source code?" +content = "Description" +answers = [ "Yes", "No" ] +next = [ "harness", "observers" ] +code = [ "", +"""let mut shmem_provider = UnixShMemProvider::new().unwrap();\n +let mut shmem = shmem_provider.new_shmem(MAP_SIZE).unwrap(); +shmem.write_to_env("__AFL_SHM_ID").unwrap(); +let shmem_buf = shmem.as_mut_slice();""" ] +previous = 0 +skip = false + +[[question]] +id = "harness" +title = "Can you provide a harness function?" +content = "Description" +answers = [ "Yes", "No" ] +next = [ "observers", "observers" ] +code = [ "", +"""let mut shmem_provider = UnixShMemProvider::new().unwrap();\n +let mut shmem = shmem_provider.new_shmem(MAP_SIZE).unwrap(); +shmem.write_to_env("__AFL_SHM_ID").unwrap(); +let shmem_buf = shmem.as_mut_slice();""" ] +previous = 0 +skip = false + +[[question]] +id = "observers" +title = "Observers" +content = "Description" +answers = [ "Next" ] +next = [ "map size" ] +code = [] +previous = 0 +skip = false + +[[question]] +id = "map size" +title = "Do you know the size of the map at compile time?" +content = "Description" +answers = [ "Yes", "No" ] +next = [ "hit counts", "hit counts" ] +code = [ "let observer = ConstMapObserver::<>::new()", "let observer = StdMapObserver::new()" ] +previous = 0 +skip = false + +[[question]] +id = "hit counts" +title = "Do you want to improve input selection by adding a hit counts map?" +content = "Description" +answers = [ "Yes", "No" ] +next = [ "feedback", "feedback" ] +code = [ "let observer = HitcountsMapObserver::new($)", "" ] +previous = 0 +skip = false + +[[question]] +id = "feedback" +title = "Feedback" +content = "Description" +answers = [ "Next" ] +next = [ "runtime" ] +code = [] +previous = 0 +skip = false + +[[question]] +id = "runtime" +title = "Do you want to keep track of the testcase's runtime?" +content = "Description" +answers = [ "Yes", "No" ] +next = [ "crash", "crash" ] +code = [ """let mut feedback = feedback_or!( +\tMaxMapFeedback::new(&observer), +\tTimeObserver::new() +)""", +"let mut feedback = MaxMapFeedback::new(&observer)" ] +previous = 0 +skip = false + +[[question]] +id = "crash" +title = "Do you want to consider a crash as a solution?" +content = "Description" +answers = [ "Yes", "No" ] +next = [ "timeout", "state" ] +code = [ "let mut objective = CrashFeedback::new()", "let mut objective = TimeoutFeedback::new()" ] +previous = 0 +skip = false + +[[question]] +id = "timeout" +title = "Do you want to consider a timeout as a solution?" +content = "Description" +answers = [ "Yes", "No" ] +next = [ "state", "state" ] +code = [ "let mut objective = feedback_and!($, TimeoutFeedback::new())", "" ] +previous = 0 +skip = false + +[[question]] +id = "state" +title = "State/Corpus" +content = "Description" +answers = [ "Next" ] +next = [ "manage testcases" ] +code = [] +previous = 0 +skip = false + +[[question]] +id = "manage testcases" +title = "Do you want to manage the testcases in memory, on disk or both?" +content = "Description" +answers = [ "On disk", "In memory", "Both" ] +next = [ "via cache", "load state", "load state" ] +code = [ "", "InMemoryCorpus::new()", "InMemoryOnDiskCorpus::new().unwrap()" ] +previous = 0 +skip = false + +[[question]] +id = "via cache" +title = "Do you want to load testcases from disk to memory using a cache?" +content = "Description" +answers = [ "Yes", "No" ] +next = [ "load state", "load state" ] +code = [ "CachedOnDiskCorpus::new().unwrap()", "OnDiskCorpus::new().unwrap()" ] +previous = 0 +skip = false + +[[question]] +id = "load state" +title = "" +content = "" +answers = [ "" ] +next = [ "monitors" ] +code = [ """let mut state = StdState::new( +\tStdRand::with_seed(current_nanos()), +\t$, +\tOnDiskCorpus::new(PathBuf::from("./crashes")).unwrap(), +\t&mut feedback, +\t&mut objective, +) +.unwrap()""" ] +previous = 0 +skip = false + +[[question]] +id = "monitors" +title = "Monitors" +content = "Description" +answers = [ "Next" ] +next = [ "stats" ] +code = [] +previous = 0 +skip = false + +[[question]] +id = "stats" +title = "Do you want to see stats about the fuzzing campaign?" +content = "Description" +answers = [ "Yes", "No" ] +next = [ "stats in ui", "stats to file" ] +code = [ "", "let mon = NopMonitor::new()" ] +previous = 0 +skip = false + +[[question]] +id = "stats in ui" +title = "Do you want to see the stats in a UI style?" +content = "Description" +answers = [ "Yes", "No" ] +next = [ "stats to file", "stats to file" ] +code = [ "let mon = (WIP)", """let mon = SimpleMonitor::new(|s| println!("{s}")""" ] +previous = 0 +skip = false + +[[question]] +id = "stats to file" +title = "Do you want to store the stats to a file too?" +content = "Description" +answers = [ "Yes", "No" ] +next = [ "file extensions", "events" ] +code = [ "", "" ] +previous = 0 +skip = false + +[[question]] +id = "file extensions" +title = "Do you want to store them to a TOML or JSON file?" +content = "Description" +answers = [ "TOML", "JSON" ] +next = [ "events", "events" ] +code = [ "let mon = OnDiskTOMLMonitor::new($)", "let mon = OnDiskJSONMonitor::new($)" ] +previous = 0 +skip = false + +[[question]] +id = "events" +title = "Events" +content = "Description" +answers = [ "Next" ] +next = [ "restart fuzzer" ] +code = [] +previous = 0 +skip = false + +[[question]] +id = "restart fuzzer" +title = "Do you want to restart your fuzzer every time a solution is achieved?" +content = "Description" +answers = [ "Yes", "No" ] +next = [ "restart fuzzer llmp", "restart fuzzer llmp" ] +code = [ "let mut mgr = SimpleRestartingEventManager::launch(mon)", "let mut mgr = SimpleEventManager::new(mon)" ] +previous = 0 +skip = false + +[[question]] +id = "restart fuzzer llmp" +title = "Do you want to restart your fuzzer every time a solution is achieved (LLMP)?" +content = "Description" +answers = [ "Yes", "No" ] +next = [ "schedulers", "schedulers" ] +code = [ "let mut mgr = LlmpRestartingEventManager::new(mon)", "let mut mgr = LlmpEventManager::new(mon).unwrap()" ] +previous = 0 +skip = false + +[[question]] +id = "schedulers" +title = "Schedulers" +content = "Description" +answers = [ "Next" ] +next = [ "queue policy" ] +code = [] +previous = 0 +skip = false + +[[question]] +id = "queue policy" +title = "Do you want to load testcases from the corpus using a queue policy?" +content = "Description" +answers = [ "Yes", "No" ] +next = [ "smaller and faster", "fuzzer" ] +code = [ "let scheduler = QueueScheduler::new()", "let scheduler = RandScheduler::new()" ] +previous = 0 +skip = false + +[[question]] +id = "smaller and faster" +title = "Do you want to prioritize smaller and faster testcases?" +content = "Description" +answers = [ "Yes", "No" ] +next = [ "fuzzer", "fuzzer" ] +code = [ "let scheduler = IndexesLenTimeMinimizerScheduler::new($)", "" ] +previous = 0 +skip = false + +[[question]] +id = "fuzzer" +title = "Fuzzer" +content = "Description" +answers = [ "Next" ] +next = [ "load fuzzer" ] +code = [] +previous = 0 +skip = false + +[[question]] +id = "load fuzzer" +title = "" +content = "" +answers = [ "" ] +next = [ "executors" ] +code = ["let mut fuzzer = StdFuzzer::new(scheduler, feedback, objective)" ] +previous = 0 +skip = false + +[[question]] +id = "executors" +title = "Executors" +content = "Description" +answers = [ "Next" ] +next = [ "corrupt memory" ] +code = [] +previous = 0 +skip = false + + +[[question]] +id = "corrupt memory" +title = "Can your target corrupt memory used by the fuzzer?" +content = "Description" +answers = [ "Yes", "No" ] +next = [ "in process timeout", "in process timeout" ] +code = [ """let mut shmem_provider = unix_shmem::UnixShMemProvider::new().unwrap();\n +let mut executor = InProcessForkExecutor::new( +\t&mut harness, +\ttuple_list!(observer), +\t&mut fuzzer, +\t&mut state, +\t&mut mgr, +\tshmem_provider +) +.expect("Failed to create the Executor")""", +"""let mut executor = InProcessExecutor::new( +\t&mut harness, +\ttuple_list!(observer), +\t&mut fuzzer, +\t&mut state, +\t&mut mgr, +)\ +.expect("Failed to create the Executor")""" +] +previous = 0 +skip = false + +[[question]] +id = "in process timeout" +title = "Do you want to set a timeout before each run?" +content = "Description" +answers = [ "Yes", "No" ] +next = [ "forkserver timeout", "forkserver timeout" ] +code = [ """let mut executor = TimeoutExecutor::new( +$, +Duration::from_secs() +)""", +"" ] +previous = 0 +skip = false + +[[question]] +id = "forkserver timeout" +title = "Do you want to set a timeout before each run (forkserver)?" +content = "Description" +answers = [ "Yes", "No" ] +next = [ "generators", "generators" ] +code = [ """let mut executor = TimeoutForkserverExecutor::new( +\t$, +\tDuration::from_secs() +)""", +"let mut executor = ForkserverExecutor::new()" ] +previous = 0 +skip = false + +[[question]] +id = "generators" +title = "Generators" +content = "Description" +answers = [ "Next" ] +next = [ "initial inputs" ] +code = [] +previous = 0 +skip = false + +[[question]] +id = "initial inputs" +title = "Do you want to generate an initial set of inputs?" +content = "Description" +answers = [ "Yes", "No" ] +next = [ "mutators", "mutators" ] +code = [ """let mut generator = RandBytesGenerator::new(32);\n +state +\t.generate_initial_inputs(&mut fuzzer, &mut executor, &mut generator, &mut mgr, 8) +\t.expect("Failed to generate the initial corpus")""" +, "" ] +previous = 0 +skip = false + +[[question]] +id = "mutators" +title = "Mutators" +content = "Description" +answers = [ "Next" ] +next = [ "schedule mutations" ] +code = [] +previous = 0 +skip = false + +[[question]] +id = "schedule mutations" +title = "Do you want to schedule mutations?" +content = "Description" +answers = [ "Yes", "No" ] +next = [ "stages", "stages" ] +code = [ "let mutator = StdScheduledMutator::new(havoc_mutations())", "" ] +previous = 0 +skip = false + +[[question]] +id = "stages" +title = "Stages" +content = "Description" +answers = [ "Next" ] +next = [ "StdMutationalStage" ] +code = [] +previous = 0 +skip = false + +[[question]] +id = "StdMutationalStage" +title = "Do you want to use the StdMutationalStage?" +content = "Description" +answers = [ "Yes", "No" ] +next = [ "fuzz loop", "fuzz loop" ] +code = [ "let mut stages = tuple_list!(StdMutationalStage::new())", "" ] +previous = 0 +skip = false + +[[question]] +id = "fuzz loop" +title = "" +content = "" +answers = [ "" ] +next = [ "end" ] +code = [ """fuzzer +\t.fuzz_loop(&mut stages, &mut executor, &mut state, &mut mgr) +\t.expect("Error in the fuzzing loop")""" ] +previous = 0 +skip = false + +[[question]] +id = "end" +title = "" +content = "" +answers = [] +next = [] +code = [] +previous = 0 +skip = false \ No newline at end of file diff --git a/libafl_wizard/questions.toml b/libafl_wizard/questions.toml new file mode 100644 index 0000000000..0881e6d117 --- /dev/null +++ b/libafl_wizard/questions.toml @@ -0,0 +1,166 @@ +[[question]] +id = "intro" +title = "libafl_wizard: a tool to generate Libafl-based fuzzers." +content = """ +Before starting, make sure that you know your target very well. Choosing the right components to build a fuzzer depends on the details of the implementation of your target. +Knowing what you want before building a fuzzer can be extremely helpful when selecting the components that best fit your options and the restrictions of the environment. + +Details such as: +\t*Having the source code of the target. +\t*Implementing a harness function to fuzz your target. +\t*Knowing the expected input by the target. +\t*Providing an initial set of inputs. +\t*The size of the target and the availability of memory. +\t*The possibility of memory corruption. + +Can be helpful during this process. +""" +answers = [ "Next" ] +next = [ "source code" ] +code = [] +previous = 0 +skip = false + +[[question]] +id = "source code" +title = "Do you have the target's source code?" +content = """ +Having the target's source code is interesting for performance. With the source code in hands, we can instrument the target, that is, +place coverage information to help our fuzzer identify new points of execution. + +Without instrumentation on the source, we have to rely on third-party applications to provide this infromation for our fuzzer, +such as QEMU, FRIDA or Tiny Inst. Note that QEMU only supports Linux. +""" +answers = [ "Yes", "No" ] +next = [ "harness", "" ] +code = [ +""" +""", +""" +""" ] +previous = 0 +skip = false + +[[question]] +id = "harness" +title = "Can you provide a harness function?" +content = """ +Providing a harness also has an impact on performance, for it allows in-process fuzzing. +""" +answers = [ "Yes", "No" ] +next = [ "special algorithm" ] +code = [ +""" +""", +""" +""" ] +previous = 0 +skip = false + +[[question]] +id = "special algorithm" +title = "Do you want to use some special algorithm to select and update testcases from the corpus?" +content = """ +Usually, a testcase that reaches a new execution point or achieves the desired objective, e.g. a crash on the target, are deemed interesting, +stored for later use and then selected using a queue policy. However, we can determine which testcases to use based on other aspects: for +instance, we can prioritize testacases that are smaller in size and take less time to execute (following a minimization policy). + +There are many algorithms supported by Libafl to choose, for more information about each, please read the libafl documentation on Schedulers +and Stages. +""" +answers = [ "Yes", "No" ] +next = [ "algorithm options", "special input" ] +code = [ +""" +""", +""" +""" ] +previous = 0 +skip = false + +[[question]] +id = "algorithm options" +title = "Which of the following options would you like to use?" +content = """ +(maybe give a quick explanation about each?) +""" +answers = [ "Accounting", "Ecofuzz", "Minimizer", "Power Scheduling", "Probabilistic Sampling", "Weighted" ] +next = [ "special input" ] +code = [ +""" +""", +""" +""" ] +previous = 0 +skip = false + +[[question]] +id = "special input" +title = "Does your target require some special type of input?" +content = """ +Usually, libafl uses a map of bytes (BytesInput) to represent the input sent to the target for execution. (maybe cite some examples of data that can be represented as a map of bytes?) + +More abstract or complex inputs, such as Grammar-Based have their own type in libafl. There are many input representations supported by Libafl +to choose, for more information about each, please read the libafl documentation on Inputs. +""" +answers = [ "Yes", "No" ] +next = [ "input options", "crash/timeout" ] +code = [ +""" +""", +""" +""" ] +previous = 0 +skip = false + +[[question]] +id = "input options" +title = "How can your input be represented?" +content = """ +(again, maybe give a quick explanation about each?) +""" +answers = [ "Encoded", "Generalized", "Gramatron", "Nautilus" ] +next = [ "crash/timeout" ] +code = [ +""" +""", +""" +""" ] +previous = 0 +skip = false + +[[question]] +id = "crash/timeout" +title = "Do you expect to cause a crash and/or a timeout on the target?" +content = """ +Determining the objective of the fuzzing campaign is essential to identify input that triggered critical errors on the target. + +(I think that by crash, the fuzzer can catch the signal that finished the program and by timeout we are able to catch infinite recursion?) +""" +answers = [ "Crash and Timeout", "Crash", "Timeout" ] +next = [ "" ] +code = [ +""" +""", +""" +""" ] +previous = 0 +skip = false + +[[question]] +id = "corrupt" +title = "Can your target corrupt memory used by the fuzzer?" +content = """ +Well, under some circumstances, you may find your harness pretty unstable or your harness wreaks havoc on the global states. +In this case, you want to fork it before executing the harness runs in the child process so that it doesn't break things. +(from the book for now, don't know if I can explain it any better hahahaha) +""" +answers = [ "Yes", "No" ] +next = [ "", "" ] +code = [ +""" +""", +""" +""" ] +previous = 0 +skip = false \ No newline at end of file diff --git a/libafl_wizard/sections.toml b/libafl_wizard/sections.toml new file mode 100644 index 0000000000..e801b5159b --- /dev/null +++ b/libafl_wizard/sections.toml @@ -0,0 +1,10 @@ +in_process_skip_questions = [ + "restart fuzzer", + "corrupt memory", + "in process timeout", +] + +forkserver_skip_questions = [ + "restart fuzzer llmp", + "forkserver timeout", +] \ No newline at end of file diff --git a/libafl_wizard/src/lib.rs b/libafl_wizard/src/lib.rs new file mode 100644 index 0000000000..dbc2bde122 --- /dev/null +++ b/libafl_wizard/src/lib.rs @@ -0,0 +1,278 @@ +use serde::Deserialize; +use std::{error::Error, fs, fs::OpenOptions, io::Write, path::Path}; +use toml; + +#[derive(Deserialize)] +struct Sections { + in_process_skip_questions: Vec, + forkserver_skip_questions: Vec, +} + +// Used to read the TOML file +#[derive(Deserialize)] +struct QuestionList { + question: Vec, +} + +// This represents a "node": the answer of a Question might lead to different Questions (different nodes). +#[derive(Clone, Deserialize, PartialEq, Debug)] +pub struct Question { + id: String, // ID is resolved to local indexes. + title: String, // The question that will be asked. + content: String, // Description related to the question, to help the user. + answers: Vec, // A vector containing all the possible answers for this question. + next: Vec, // A vector containing the next question for all the possible answers (for answer[0] the next question is next[0]...). + code: Vec, // Contains the Rust code associated to the question. + previous: usize, // The question that lead to the current one (possible UNDO functionality implementation). + skip: bool, // Marks questions that should be skipped. +} + +impl Question { + // Builds the diagram of questions from the csv file (this will probably be changed, the csv is used only for demonstrative purposes). + // The diagram is a vector of Questions (vector of nodes): each Question, depending on the answer, will have the index of the next Question + // that should be asked. + pub fn new() -> Result, Box> { + let contents = fs::read_to_string("questions.toml")?; + + let q_list: QuestionList = toml::from_str(&contents)?; + + // // Checks if each question is valid. + // for q in q_list.question.iter() { + // q.validate_question()?; + // } + + Ok(q_list.question) + } + + pub fn end(&self) -> bool { + if self.id == "end" { + return true; + } + + false + } + + pub fn print_question(&self) -> () { + print!("{esc}c", esc = 27 as char); + println!("=========================\nFuzzer Template Generator\n========================="); + println!("{}\n", self.title); + println!("{}\n", self.content); + + for ans in &self.answers { + print!("\t{}", ans); + } + + println!("\tUndo"); + } + + pub fn resolve_answer( + &self, + questions: &Vec, + input: &String, + ) -> (usize, bool, usize) { + // The "Undo" option makes the generator go back to the previous question, so if the user do something by mistake, they can correct it. + if validate_answer(&input, &String::from("Undo")) { + return (self.previous, true, 0); + } + + // Checks if the user typed one of the acceptable answers. If so, returns the index of the next question associated to that answer. + // For now we don't check for variants. + for (i, ans) in self.answers.iter().enumerate() { + if validate_answer(&input, &ans) { + let mut next_q = self.next_question(questions, i); + + // If the question should be skipped, then the generator goes to next question. + // These types of questions should always have only one possibility for next question (this is the approach for now). + while questions[next_q].skip { + next_q = questions[next_q].next_question(questions, 0); + } + + return (next_q, true, i); + } + } + + (0, false, 0) + } + + // Resolves the index in the vector for the next question + pub fn next_question(&self, questions: &Vec, i: usize) -> usize { + questions + .iter() + .position(|question| question.id == self.next[i]) + .unwrap() + } + + pub fn has_code(&self) -> bool { + if !self.code.is_empty() { + return true; + } + + false + } + + pub fn has_title(&self) -> bool { + if !self.title.is_empty() { + return true; + } + + false + } + + pub fn add_code(&self, code_content: &mut Vec, ans_i: usize) -> () { + if self.code[ans_i] != "" { + code_content.push(self.code[ans_i].to_string()); + } + } + + pub fn check_skip( + &self, + questions: &mut Vec, + input: &String, + next_q: usize, + in_process_qs: &Vec, + forkserver_qs: &Vec, + ) -> () { + // If the user doesn't have the source code or can't provide a harness, then in process fuzzing in not possible and the questions + // related to it are skipped. + if ((self.id == "source code") || (self.id == "harness")) + && validate_answer(&input, &String::from("No")) + { + skip_questions(questions, &in_process_qs); + } + // If it is possible, then forkserver/llmp questions are skipped. + else if (self.id == "harness") && validate_answer(&input, &String::from("Yes")) { + skip_questions(questions, &forkserver_qs); + // If the user is undoing, then the generator resets the questions that were marked to be skipped. + } else if ((self.id == "harness") + || (self.id == "observers") + || (self.id == "map size" + && (questions[next_q].id == "source code" || questions[next_q].id == "harness"))) + && validate_answer(&input, &String::from("Undo")) + { + unskip_questions(questions, &in_process_qs); + unskip_questions(questions, &forkserver_qs); + } + } + + pub fn update_previous(&mut self, curr_q: usize) -> () { + // Saves the current questions as the previous for the next one. + self.previous = curr_q; + } +} + +pub fn read_sections() -> Result<(Vec, Vec), Box> { + let contents = fs::read_to_string("sections.toml")?; + + let sections: Sections = toml::from_str(&contents)?; + + Ok(( + sections.in_process_skip_questions, + sections.forkserver_skip_questions, + )) +} + +pub fn skip_questions(questions: &mut Vec, vec: &Vec) -> () { + for q in vec { + let i = questions + .iter() + .position(|question| &question.id == q) + .unwrap(); + + questions[i].skip = true; + } +} + +// Undo option +pub fn unskip_questions(questions: &mut Vec, vec: &Vec) -> () { + for q in vec { + let i = questions + .iter() + .position(|question| &question.id == q) + .unwrap(); + + questions[i].skip = false; + } +} + +pub fn replace_code(code_content: &mut Vec) -> () { + let mut symb_count: usize; + + // For each String of Rust code that contains a '$', we replace this '$' by another String (another Rust code). This works like in wrappers. + // The only requirement is that, for each '$' found in that String, the order of replacement is: the firt occurence is replaced by + // the code that is at 'position_of_string - number_of_occ_of_$'. Then, since this String will be removed from the vector, the next occ of '$' + // can be replaced by a String at the same position (i - symb_count). + for s in code_content.clone() { + if s.contains('$') { + // Current position + let i = code_content + .iter() + .position(|code| code.as_str() == s) + .unwrap(); + + symb_count = s.chars().filter(|&c| c == '$').count(); + + for c in s.chars() { + if c == '$' { + // Since this component will be wrapped by another, it doesn't need to have an assigment to a variable. + //"let observer = StdMapObserver::new()" will become "StdMapObserver::new()" + if let Some(index) = code_content[i - symb_count].find("= ") { + code_content[i - symb_count].replace_range(..=index + 1, ""); + } + + code_content[i] = s.replacen('$', &code_content[i - symb_count], 1); + + code_content.remove(i - symb_count); + } + } + } + } +} + +// Write Rust code in the file of the generated fuzzer. +pub fn write_code(code_content: Vec) -> Result> { + let mut counter = 0; + let mut file_name = format!("fuzzer.rs"); + + // Creates "fuzzer.rs", "fuzzer_1.rs" files if the previous one already exists... + while Path::new(&file_name).exists() { + counter += 1; + file_name = format!("fuzzer_{}.rs", counter); + } + + let mut out_file = OpenOptions::new() + .append(true) + .create(true) + .open(&file_name)?; + + // While imports are not resolved, use this. + out_file.write_all("use libafl::prelude::*;\n\n".as_bytes())?; + + for (i, code) in code_content.iter().enumerate() { + out_file.write_all(code.as_bytes())?; + + if i < code_content.len() { + out_file.write_all(";\n\n".as_bytes())?; + } + } + + Ok(file_name) +} + +pub fn validate_answer(input: &String, ans: &String) -> bool { + let input_lower = input.to_lowercase(); + let ans_lower = ans.to_lowercase(); + + let mut input_chars = input_lower.chars(); + let mut ans_chars = ans_lower.chars(); + + // Basically, an aswer is valid if it is an acceptable variant of that given answer. Acceptable variants are strings that contain the + // characters in the same order as the answer, so for the answer "Yes", acceptable variants are: "y", "Ye", "yes", "yES", but not + // "Yess", "yy", "Yhes", "yYess"... + while let (Some(input_c), Some(ans_c)) = (input_chars.next(), ans_chars.next()) { + if input_c != ans_c { + return false; + } + } + + true +} diff --git a/libafl_wizard/src/main.rs b/libafl_wizard/src/main.rs new file mode 100644 index 0000000000..dc258f027b --- /dev/null +++ b/libafl_wizard/src/main.rs @@ -0,0 +1,105 @@ +use libafl_wizard::{read_sections, replace_code, validate_answer, write_code, Question}; +use std::{error::Error, io, process}; + +fn run() -> Result<(), Box> { + // The question diagram is a vector containing all the questions. + let mut questions = Question::new()?; + + // Each element is a String, which contains the Rust code associated to a question. This will be used to write to the file. + // Note that these are not in the same position as the questions, they are simply in the order that will be written to the file. + let mut code_content: Vec = Vec::new(); + + // Marks the questions that produced code that will be written. This has the same index as the questions in their vector. + // Undo option + let mut prod_code: Vec = vec![false; questions.len()]; + + // Index of the current question + let mut curr_q = 0; + // Index of the next question + let mut next_q; + // Index of the chosen answer + let mut ans_i; + + let mut valid_ans; + + // User input + let mut input = String::new(); + + // Loads the vectors which contains the ids of questions that may be skipped. + let (in_process_qs, forkserver_qs) = read_sections()?; + + // Basically, a question is asked, answered by the user and then the generator moves on to the next question. + // Note that not all the questions are going to be asked, for example, if the user chose not to use a monitor, the generator shouldn't + // ask if he wants a monitor with a UI style or a SimpleMonitor. + while !questions[curr_q].end() { + // If the question has a title, it means it contains information to show to the user and expects some input. + if questions[curr_q].has_title() { + questions[curr_q].print_question(); + + loop { + input = "".to_string(); + io::stdin().read_line(&mut input)?; + input = input.trim().to_string(); + + (next_q, valid_ans, ans_i) = questions[curr_q].resolve_answer(&questions, &input); + + if valid_ans { + break; + } + + println!("Please type a valid answer: "); + } + } else { + (next_q, _, ans_i) = questions[curr_q].resolve_answer(&questions, &input); + } + + // Code generation + if validate_answer(&input, &String::from("Undo")) { + // If the user chooses to undo a question that produced code, the code is removed. + // Since the Undo option goes backwards, we can simply pop the last piece of code. + if prod_code[next_q] { + code_content.pop(); + prod_code[next_q] = false; + } + } else { + // Adds the code associated to the user choice + if questions[curr_q].has_code() { + questions[curr_q].add_code(&mut code_content, ans_i); + prod_code[curr_q] = true; + } + } + + // Skip questions that are no longer possible + questions[curr_q].clone().check_skip( + &mut questions, + &input, + next_q, + &in_process_qs, + &forkserver_qs, + ); + + // Only updates the 'previous' field when going forward in the questions diagram. + if !validate_answer(&input, &String::from("Undo")) { + questions[next_q].update_previous(curr_q); + } + + curr_q = next_q; + } + + replace_code(&mut code_content); + + let file_name = write_code(code_content)?; + + print!("{esc}c", esc = 27 as char); + println!("File {} successfully created!", file_name); + println!("\nAll questions answered."); + + Ok(()) +} + +fn main() { + if let Err(err) = run() { + println!("{}", err); + process::exit(1); + } +} From 2d62c143ec592d40cfbbcc735d363b2c3d42eb39 Mon Sep 17 00:00:00 2001 From: matheusbaptistella Date: Tue, 15 Aug 2023 19:11:34 -0300 Subject: [PATCH 11/21] Updated the questions. --- libafl_wizard/questions.toml | 172 ++++++++++++++++++++++++++++++----- 1 file changed, 150 insertions(+), 22 deletions(-) diff --git a/libafl_wizard/questions.toml b/libafl_wizard/questions.toml index 0881e6d117..677c9e7ee2 100644 --- a/libafl_wizard/questions.toml +++ b/libafl_wizard/questions.toml @@ -2,16 +2,19 @@ id = "intro" title = "libafl_wizard: a tool to generate Libafl-based fuzzers." content = """ -Before starting, make sure that you know your target very well. Choosing the right components to build a fuzzer depends on the details of the implementation of your target. -Knowing what you want before building a fuzzer can be extremely helpful when selecting the components that best fit your options and the restrictions of the environment. +Before starting, make sure that you know your target very well. Choosing the right components to build a fuzzer depends on the details of the +implementation of your target. + +Knowing what you want before building a fuzzer can be extremely helpful when selecting the components that best fit your options and the +restrictions of the environment. Details such as: -\t*Having the source code of the target. -\t*Implementing a harness function to fuzz your target. -\t*Knowing the expected input by the target. -\t*Providing an initial set of inputs. -\t*The size of the target and the availability of memory. -\t*The possibility of memory corruption. + *Having the source code of the target. + *Implementing a harness function to fuzz your target. + *Knowing the expected input by the target. + *Providing an initial set of inputs. + *The size of the target and the availability of memory. + *The possibility of memory corruption. Can be helpful during this process. """ @@ -33,11 +36,7 @@ such as QEMU, FRIDA or Tiny Inst. Note that QEMU only supports Linux. """ answers = [ "Yes", "No" ] next = [ "harness", "" ] -code = [ -""" -""", -""" -""" ] +code = [] previous = 0 skip = false @@ -53,6 +52,11 @@ code = [ """ """, """ +const MAP_SIZE: usize = 65536; + +let mut shmem = shmem_provider.new_shmem(MAP_SIZE).unwrap(); +shmem.write_to_env("__AFL_SHM_ID").unwrap(); +let shmem_buf = shmem.as_mut_slice(); """ ] previous = 0 skip = false @@ -62,11 +66,10 @@ id = "special algorithm" title = "Do you want to use some special algorithm to select and update testcases from the corpus?" content = """ Usually, a testcase that reaches a new execution point or achieves the desired objective, e.g. a crash on the target, are deemed interesting, -stored for later use and then selected using a queue policy. However, we can determine which testcases to use based on other aspects: for +stored for later use and then selected using a determined policy. However, we can select which testcases to use based on variable aspects: for instance, we can prioritize testacases that are smaller in size and take less time to execute (following a minimization policy). -There are many algorithms supported by Libafl to choose, for more information about each, please read the libafl documentation on Schedulers -and Stages. +There are many algorithms supported by Libafl to choose, for more information, please read the libafl documentation on Schedulers and Stages. """ answers = [ "Yes", "No" ] next = [ "algorithm options", "special input" ] @@ -74,6 +77,9 @@ code = [ """ """, """ +let scheduler = QueueScheduler::new(); + +let mut stages = tuple_list!(StdMutationalStage::new(mutator)); """ ] previous = 0 skip = false @@ -88,8 +94,50 @@ answers = [ "Accounting", "Ecofuzz", "Minimizer", "Power Scheduling", "Probabili next = [ "special input" ] code = [ """ +let scheduler = CoverageAccountingScheduler::new(&mut state, QueueScheduler::new(), unsafe { + &ACCOUNTING_MEMOP_MAP + }); + +let mut stages = tuple_list!(StdMutationalStage::new(mutator)); +""", +""" +let scheduler = EcoScheduler:new(&mut state, &observer); + +let mut stages = tuple_list!(StdMutationalStage::new(mutator)); +""", +""" +let scheduler = IndexesLenTimeMinimizerScheduler::new(QueueScheduler::new()); + +let mut stages = tuple_list!(StdMutationalStage::new(mutator)); """, """ +let scheduler = PowerQueueScheduler::new( + &mut state, + &observer, + PowerSchedule::FAST, +); + +let mut stages = tuple_list!(PowerMutationalStage::new(mutator)); +""", +""" +let scheduler = ProbabilitySamplingScheduler::new(); + +let mut stages = tuple_list!(StdMutationalStage::new(mutator)); +""", +""" +let time_observer = TimeObserver::new("time"); + +let scheduler = StdWeightedScheduler::with_schedule( + &mut state, + &observer, + Some(PowerSchedule::FAST), +); + +let calibration = CalibrationStage::new(&map_feedback); + +let power = StdPowerMutationalStage::new(mutator); + +let mut stages = tuple_list!(calibration, power); """ ] previous = 0 skip = false @@ -109,6 +157,7 @@ code = [ """ """, """ +let mutator = StdScheduledMutator::new(havoc_mutations()); """ ] previous = 0 skip = false @@ -119,12 +168,59 @@ title = "How can your input be represented?" content = """ (again, maybe give a quick explanation about each?) """ -answers = [ "Encoded", "Generalized", "Gramatron", "Nautilus" ] +answers = [ "Encoded", "Grimoire", "Gramatron", "Nautilus" ] next = [ "crash/timeout" ] code = [ """ +let mutator = StdScheduledMutator::with_max_stack_pow(encoded_mutations(), 2); """, """ +let generalization = GeneralizationStage::new(&observer); + +let mutator = StdScheduledMutator::with_max_stack_pow(havoc_mutations(), 2); + +let grimoire_mutator = StdScheduledMutator::with_max_stack_pow( + tuple_list!( + GrimoireExtensionMutator::new(), + GrimoireRecursiveReplacementMutator::new(), + GrimoireStringReplacementMutator::new(), + GrimoireRandomDeleteMutator::new(), + GrimoireRandomDeleteMutator::new(), + ), + 3, +); + +let mut stages = tuple_list!( + generalization, + StdMutationalStage::new(mutator), + StdMutationalStage::transforming(grimoire_mutator) +); +""", +""" +let mutator = StdScheduledMutator::with_max_stack_pow( + tuple_list!( + GramatronRandomMutator::new(&generator), + GramatronRandomMutator::new(&generator), + GramatronRandomMutator::new(&generator), + GramatronSpliceMutator::new(), + GramatronSpliceMutator::new(), + GramatronRecursionMutator::new() + ), + 2, +); +""", +""" +let mutator = StdScheduledMutator::with_max_stack_pow( + tuple_list!( + GramatronRandomMutator::new(&generator), + GramatronRandomMutator::new(&generator), + GramatronRandomMutator::new(&generator), + GramatronSpliceMutator::new(), + GramatronSpliceMutator::new(), + GramatronRecursionMutator::new() + ), + 2, + ); """ ] previous = 0 skip = false @@ -135,14 +231,29 @@ title = "Do you expect to cause a crash and/or a timeout on the target?" content = """ Determining the objective of the fuzzing campaign is essential to identify input that triggered critical errors on the target. +Telling the fuzzer that we are looking for a crash mens that a testcase, which causes a crash on the target, fullfills the objective and, differently from the ones +that e.g. reach a new execution point, this testcase is saved in a separate folder for you to check the input that trigerred the crash. + +A timeout follows the same idea: a testcase that takes longer to execute than the defined timeout. + +It's even possible to join these two ideas to instruct the fuzzzer that any testcase, which causes a crash or takes long enough to execute, is stored. + (I think that by crash, the fuzzer can catch the signal that finished the program and by timeout we are able to catch infinite recursion?) """ -answers = [ "Crash and Timeout", "Crash", "Timeout" ] -next = [ "" ] +answers = [ "Crash or Timeout", "Crash", "Timeout" ] +next = [ "corrupt" ] code = [ """ +let mut objective = feedback_or_fast!( + CrashFeedback::new(), + TimeoutFeedback::new() +); +""", +""" +let mut objective = CrashFeedback::new(); """, """ +let mut objective = TimeoutFeedback::new(); """ ] previous = 0 skip = false @@ -151,16 +262,33 @@ skip = false id = "corrupt" title = "Can your target corrupt memory used by the fuzzer?" content = """ -Well, under some circumstances, you may find your harness pretty unstable or your harness wreaks havoc on the global states. +Under some circumstances, you may find your harness pretty unstable or your harness wreaks havoc on the global states. In this case, you want to fork it before executing the harness runs in the child process so that it doesn't break things. -(from the book for now, don't know if I can explain it any better hahahaha) +(from the book for now hahahaha) """ answers = [ "Yes", "No" ] next = [ "", "" ] code = [ """ +let mut executor = InProcessForkExecutor::new( + &mut harness, + tuple_list!(observer), + &mut fuzzer, + &mut state, + &mut mgr, + shmem_provider, + ) + .expect("Failed to create the Executor"); """, """ +let mut executor = InProcessExecutor::new( + &mut harness, + tuple_list!(observer), + &mut fuzzer, + &mut state, + &mut mgr, + ) + .expect("Failed to create the Executor"); """ ] previous = 0 -skip = false \ No newline at end of file +skip = false From 5c4669f64cfa9c047f34240a8fa9532fe62e6766 Mon Sep 17 00:00:00 2001 From: matheusbaptistella Date: Sun, 27 Aug 2023 20:02:45 -0300 Subject: [PATCH 12/21] Added the UI and changed some logic --- libafl_wizard/Cargo.toml | 6 +- libafl_wizard/README.md | 25 +- libafl_wizard/icons/libafl_wizard.png | Bin 0 -> 79868 bytes libafl_wizard/new_questions.toml | 294 +++++++++++++ libafl_wizard/questions.toml | 600 ++++++++++++++++---------- libafl_wizard/src/lib.rs | 171 ++++++-- libafl_wizard/src/main.rs | 186 ++++++-- libafl_wizard/src/ui.slint | 61 +++ 8 files changed, 1040 insertions(+), 303 deletions(-) create mode 100644 libafl_wizard/icons/libafl_wizard.png create mode 100644 libafl_wizard/new_questions.toml create mode 100644 libafl_wizard/src/ui.slint diff --git a/libafl_wizard/Cargo.toml b/libafl_wizard/Cargo.toml index dd56196b92..cb0b6ba587 100644 --- a/libafl_wizard/Cargo.toml +++ b/libafl_wizard/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "libafl_wizard" -version = "0.1.0" +version.workspace = true edition = "2021" authors = ["matheus "] description = "libafl's fuzzer template generator" @@ -11,8 +11,10 @@ license = "MIT OR Apache-2.0" keywords = ["fuzzing", "testing", "security"] categories = ["TODO"] -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[features] +ui = [] [dependencies] toml = "0.7.6" serde = { version = "1.0", features = ["derive"] } +slint = "1.1.1" \ No newline at end of file diff --git a/libafl_wizard/README.md b/libafl_wizard/README.md index 30404ce4c5..b12315ae58 100644 --- a/libafl_wizard/README.md +++ b/libafl_wizard/README.md @@ -1 +1,24 @@ -TODO \ No newline at end of file +# libafl_wizard + +libafl_wizard logo + +libafl_wizard is a tool to generate fuzzers using libafl's components. Simply by answering some questions, while learning more about how libafl is used, you can generate your own fuzzer to test programs and help with the development of more secure code! + +## Usage + +libafl_wizard has a UI, made with [Slint](https://slint.dev/releases/1.1.1/docs/slint/), to help during the process. You can choose between answers by simply clicking on them and visualize where these answers might take you through a flowchart! + +``` +cargo run --features ui +``` + +If you don't want or can't use libafl_wizard with the UI, it's possible to use the CLI version, but, as of now, this version doesn't contain a flowchart. + +``` +cargo run +``` + +## Contributing +libafl_wizard uses the `questions.toml` TOML file to store and load the questions that will be asked during the generation process. Each question contains some fields, like the possible answers for that question and the Rust code associated to those answers. As libafl's components get updated or new ones introduced, the questions need to be updated as well. + +For changes on the UI, please check the [Slint](https://slint.dev/releases/1.1.1/docs/slint/) documentation page to learn more about the language! diff --git a/libafl_wizard/icons/libafl_wizard.png b/libafl_wizard/icons/libafl_wizard.png new file mode 100644 index 0000000000000000000000000000000000000000..c12ddbfd91c19700946df6e90228b5d890cd2a86 GIT binary patch literal 79868 zcmYgWbx<38l*F~TLkZSGaSFxV3dNW7%{PgmVj9Yo(x z;`82YwcHo$XXktAu!E#qTv3h^6XfK%NPqr>5n&-?|HKu)RO<^w%7vj6j_adxcm&!{ zG!i)5I7G2scdF$SwHA4_m^eGT{4PRST+Jw{biY+`^19V+cZbi86A_}AVn*V7KCKNn zZ@=GQBVf{QnmM^eP()gfmUv#@L4K8UV`>8W`@C#n_z!Jt3~`GS8KbBx5G z)i4$U=e?IJ9{%R1?g;A&1H}3i_0GDT=tDB3BYzXT*=pT#RA`gWQ(5}@e?QB{JXC?h zXV%sBhx5MuHwbvfSKZ|_1*R@k%yulBWM(hM4-D(Xv}lNOnqNf#VQDg5w`-&Mu7>`# zuaK)WLFS!8a>dr<`J667{sZ&jzVn^`_iUl;b%XV~`}Rh=N3>?W`MgN&q2!q4wD8as zZZCN+yDaB*cq>>t%?x$cj3c3b`en^d7TLRT(|Ba5(jwz zqNQRApW9W)qOQl;3 znWfXvc3{HwZEfi$rCRF4#h7VF!%+RRi%=I3-k}i<;49HiQJc1cNjlyR^P=CD#V_f? z!6UK=VJZX)2=OSf=UrgAzFZDQzs)3d+#oNU)|ZoRGRaTDCZ(sM@1%A@@d{)_*G1*a zh%wYT4a}miO>~;bQ|4ULpu4GcX}$|iMQxg`f=F!IE>BE@)$%v)MMdX}F%JpA3%*A^ zEuArv0M^aQc^tmpZ@#PMJIj!yq4~6|qb|!{Z*^!@?!H;)8(XB-<0Pa>4VtuP;&a{Q zpRsr!VsCvUE0>{RP3rDeSu5IQV2Ych#kqnWFcqqxH~mj ztk804eiLP5XXfL;dAlBk`u33+ZnN{w841o_%sI1mb=A+~Af>M0ygVGW8|6vGtPyd9C_d?fI3(Med^!}rD|fGF$k)a=qX%8g)alD?D#{P6tzB7G@u{MI{5 zo$S8rFI5|yppyxB{>?Y|rTRUeAxGn5#%vWgGb!Lbl+1s98FW@=9rD^bN*GFl9cPtc zf`N-TxT7pKK#9uTh&b$TGv?E6BIr+I^GdJ`>J6i-8u4XbOFSt*R~SI`2@tLc&Y z9V}uD5}~W4L*AVblKRE#=NMlp+#sP`a^DFX8&e~>73MshC!Y?cOzv*f(YH)kpLaWg zD{IWRtFrKzG3nmn^jH^6{zdxiWd~o2qqxpxYPY6ZEmaPHR^w$ZiOLKz8Q%=LPZJ{= zb<{|m|7d`bHz+3rz{9Rs{nP#n94^eIgb=S&wn8}7O|H6j{}EMR68Sokxu@@tIGJu@HXV(SiDZ|N|7sSiOXGX@v$VmAI1!Le zo;@Soo0%a7rltw_hgW)I@NNA5z0vq{rCs-7OSBo(g(FK* znLY)woF#Bz0eGE{hoK{&`V9nkBG{tD%(syxjC*GW554ic(LIM(O}d#c9vEs0y-ZcT z-0YJ)k`Anva6R$m?lxe={eC3I{x-5Ds)13cPW7#VJ?4MT8R#Tg@k~%S*hG}IB}7g; z_uT4}4V=t0e38#FYwD59%5s?C#^`)|I>DNp#sHqH$SNa!kc1oZ`2HCJ_aR+jc=Vpv z2a|%B$bXM^*non976eIom+1*1u`=we(U{+Y&%8pSS|e}MQF#5UdWl_O4sF z%;`${9pIeZHhNsoTXVS8gXSH-&ir2C;qE$#w~ag442j#9jLxD;@wtxTJ%4yO5Pau8 ze=Ez!R6zOw2lqEv0MlKuo}v_kgzB^D+49L@SlixcZejZpD zyp>~H+0X`Xza7HuKzl=6-7-#wA?VHrK8i>mP(SiaGO1&E61ugjz~%mn-U6Uu=9d_@ z-S2>}nc1+8I016(MiN5Y{hvKB=pJ{%y26<|xRm0Wxz3H}5@X@sFXLg7S>on??YJ-D zocf1%R;R}|zl}@&B`CxlZydywq2LhtnPj@{mnjL16Uj+rhewV3 zmQ55+m09Mk%;92q?whxj!S}XYt)C$ESv>Jj#h?~s5={}8`+03(EaikD=k+zZ z^Fz2Ex4`yoAw^o-z?|*SHL@r63tPUMJ@CVYm#gscMYce-9=$}|b(`DuTeIimmBkuV zi{)}nIV7*XAd-24qAMyYa2uk+t(!i5w}?!mQ~`hwgj^U)f!N*OIRd-v0;|jQKzZC~ z0@n-+?R?*&CYwtyhC7s?Fgw0h3u@wV>^XLLZCiu203(E3a$jSL)G`ReU(h)7fanDa%|@RS$YqI4yVN7fgqYX)bfzfF+Z_wL?p3EmG5dYZVKP$a>~%MT z*9Gvp;c?*wO~Cs2;Hro#UR(}ATYrjdB>rw5vCvsTq;ic~YOjfO?yV29s*W!gNt<#Z zWS&@^1N8D2O+bxUeRuNN&?phvcg9=09b6MB^~Ifv~F zlu1qXpy&OSJ6^g&nu)CUqJq)H^*O+V zLS0yZ0?OsRsp_LbXG+n_FAVIiz1-y^B{m`rlepy1mjfIixGrKjWi ziQ%{IX1fy%gZJe}z?gXQ=&MdYA?dk$(+<6$?=AiB;9o_CpyXwma=e`79}X@tQCLlg zp4}e^_fvWop_&LK4TZN=AbA59W&-I;d@I{`Itg=f{U6OlgbwXaD(DX^#iLewZwQvU z($Cv*Q}AWARF-{R!pW=-G^yL0A}z`Xvs|6aOfSGD%pFULFPo1!haX=2L85&uh=6YU%Gi z7xgAO)pDgM|9Y4Fb&!QcVYAAD|B4iW&>r;Z|Gp5)S%l^<}=t zb(Qo%_V9!Ze&P2xpwg8-Vc_FI)_difHV3@==d+hdmp#$FH>HQ=@y$kR2XlYn%S0cL zPeAv#FPj9UDc6*j$(s6Dyzxv*Pp}w#w)WfPg`X6`17c%AiywwA(MuHyhyu4l$TIyB z9zWo1>$(ci?IcZ%`rGI^QTjc-I6e-Z(sC!?al~7<%iYKwSBPh% zy6eO~r3U>X*oKNQ!Y{2a3qrnQ9Iki2J@z+@;zkgiErH~@FK`h^U(j?S|NNBblHC6@ zpfITjL?us=&^)iXkRi%P&gfuG*|9>eusdZ8qZsAoXPaTe@C114aKkq@KcBbyWFC_i zu2g{sQm4vB(us`tD-Hys3;+0m*tevAgtaJoRBIJBt|HGv6ciZtlKc6JurGLWJL4L_r|TEHN^0= zcMP! z@Z=5v?Te&#1J{VSQNbn$aMB0BRC#|KPI zb+g@nf(fYt(jho4v=C#IL+cj zW61MXf&o8o+UfDq*xzvA%W8M%QM~*`p7eE#j09=nr9Qx;_1vOE#oFn+Y~pYR@N{Ml zXdE$QTv|~0TRMF+O{lN{22NSPh`dDD&R%o!URIj2OWGq zb5m%kjAj!Bx@9}-B6-dZ6MQJ2Qhd_hLikC3`MmP@3G7)QMqB{+BHxAI?29XG)|xKI z!dpJqh*Y;CD(_W&MHz_;RF~o4t?}9{bms5#(3=Rxf`tRH(o2Gs`#jFm3am{%xDs`;Ka*U@n54TAEGcj)*b(jhQWs5*z(tn@v7h__zZar(zYr_8V--RMDz=Ta9S}v9bFH?YqX|f3K zCPS&Em)^J$>_XwvtPNLHyEzE-8}FF}8=rJ-+cP?Ktg}A^dpx9y@hmgywmqa(wOx(i z&Y%2usg#%|YFTseO7(mtn1^C!v%^N?b=og3r3cu_gnW}cJn6O~vu)F2%6p@|Tx*~Z zR0j1F4h*x~BRW<_+?DqEYOV*Wzk=B+!Dokkcc8N6|J0QdIvDqhw3EsZa8lULRMU?N zeXgKj2ahIPL)7C+x+#e?<|*H#xtdnumYbaSeTK1RPRvEwjXXH z369MKl|Ey~Y^9u*qPogw6~@@p#tW{1AXvYI;Ek(CPb=@vP0TWHU*{t8LU_J=7fPIMVYB#73^PKFj-$kWAvuA z__kBn`MWg@e}gjEa2n3BMqSUvMjJdXDXcP5&NY@TjiHSFxSI@OteQXxV;2|#4?xC} z+1kY2XaqmmG>-8ab4!5_z0t5wAzh6Wr){G*h`Ql zHl1E6&Glm50qv&tG^C5iOR4A36IIR;m3cp9c^fB2N2Yv?_41L3XacA1PDL>kRCf5o ztGTq(P~}~gqre*FAgN@w^}ogX&P>e{N)o}TR%kl?a5eODEo|j-yiQ3tFL&^+t~3}fzjN__UsaRLJEAyBIuy?PRch`R|2EO( z3@tKyPM;W*We9-}Um#)|&h6u&iWASQ1sOaY zGWdkIvXVq-*QC$e^-d6-wJWP2mv#)BiK&^=B5!7pit)laS= z-nPLW5OFA~k%F1k{}XK;$yP|p>&(z}J;BQy3Shqtgls|vvWdbCrJ8|=uH*T#Np?XQ zlS#y9>OaxV$b5-LMdDhTTgL1%*XUh6wY!1eL~+CMk{q?KdWyue+ZGzueLN zps2oQ1}68<2Ody4|IrIcTd+?`I!gMOUj(x#g_@i+1D!?%lWROoArA6`Su2w zGXqD{$bM{lI1G7wN#5_T_wQ5!rlm>{w?Rw{?CnwBg~gR{VuFZJ#Fa?nsK?Ln=YwL4 z23ofXCQ|O~emk0fi>;~7AAR}xVn-8Cl@4;p2@k^|sF+qoNVWMmX{_#QJCVf0W8%d# zBbOD?Z=u3Zh`Hbyh}LChO?_B}buD#$A40O8AS zS%uEp6FuALF@% zrqgr#*Iw#z9S`k;NC3|$QwQEktuVsNX`RELCbJUZQud-l;m=OC>zuj-WG6C5tYqHb zn(7cLo1AIa?B8KQFIQT?T2283kA~>|#wJCLhfb`_ol~g0ZQZANuaJ&Xh--OB57$F! za;wr`3J4O?qo@XZ4%fpk<f~5)nMgOI2Zqe1{rt z!y9JMQl+_1WcC%L$hpgm4I`Rv{+yu&^X=}wt6I?m$o$@}_XpSdPVe#!W~sd$mulE5 za7UgSCbJIV)yw=B7SM0i=7HE!lQ+riA%{*<8lwmQ0=0Vd9ieKYF5B&_ez7p!Wy5Xt zxft~)I|KvB$g{uQ2taA5Om`wB8#cukhN;yc_0JbKlY};!*pry9+zk2$p`~x3i7_Ad zPVQ$k!0j{Q>K*eR<$opz`U&#e0xUJzBL)4KwK0OFC%jxx2Py!s>cd@6bHR zbUZn1(~<~~cok))B{KXD+)L70&3@%^kXbt7ZLo<9etHjkgc`+bLGYq(RpSf_8BV6%1xO|2Ng zKnjFy$;a7uROMaZx%qnTlJ$p3{WcqdbGBfc!K2416#GjiQe7hzY$`VG@KHC6v_m6) zl8!x_n)kT3MVr`Wz$ z(?RxsNCv6vV4RmO2#92tmYV-*rrYimVb&eNMp_IRr_f^`Uz2j;@Sz?*?s=}zS76t+ zU1n8x-6{h65BjE9*$z>&J>7PDI;NM@p^ATm$O+Cnj^j=9j!T2Guqo|UHc_<5+n!2U*)LTM-ZzQ2e9XXbW0pSu zRQ!en*%Y9tJO_KA-$$zb|CQfpSvT)VcfQ?LkzL$RD8WF)3BQQYSP{|1#8IwL!EPx6@`*?|y5`W@ju{K7X(_B{|twhY)Y9E2fYXdEMKpl??TnL6q z*i==l8sVwd7Wv?C)&dTI5QlHPrQ(4-?vW}AruYLSVtT-ufPbr15_t&+4lMqr8UUF! z{NjC%iCc<>RTyYngw9UGt=GU-wN2#C_GdQW{k1!#Lqj|fITGrm&N!2m-3U>K>lU$> zoh>D<`@jl2r87*iZa1|GJeVTJX!(R4$p4+?9yKf4^*lq z%i>HO718g}H6Nw4kjq-h*!ik>M;1c$vWbKs-aWYn#83r`n7CCuFkdwsBl61p0778h zk=sx2{UME!vh=$C2s$-1=}stmAv}Mc7zZtc7l~+Dv;>`QSy=3JxYKyP7e!NW;#{Q0 zO;Bxm!lv_$e1Av3CPNHp&mq~DSw$lvwEP`Qub@H=nT`USYcgZja|6SuU<_nZU< zaRAut4AT|x_SlQVZP02oWXFB%oa^9qbKRq_NiCPd4mmO ziabzP7DARWne@1}O^)m7zrpiAROh8%An7a`lFkNw%Z{JW{Wf3rIR~}oIr=!G*cx=| z2(DmdCqIraiQt^Q^FXNsjECw$SL+$(On68-g>BE zd7LamPq#sAibfuNez!T98kEvaD!^_;vbN7rI@w_mTi^*3oI$;i8cIuTu!KY~cx%36 z8^LrY&hZe3j}KxoY|qTe?jGS%-tDrLiLJX&-jh2v5_F&GHItq{J>45Tf9J88(32fc zttxvDJJ}2_FW2lqVo@QaF5Fn@!v6^Pf;>^j-_roL#Yi%}?v_iuR+URRAa@1;6S!!^ zu+oS?F{tsuMJ;62Q_}I_8SA{Yir|SQwl1j}xow9+Uk4cGFB{mJGLozV(m%a#BGdG* zpOn-)%~@Z7Ev>-2lM7!A-Lw!l+B@Z9&r(*#cB1zEO&kh6s*Cot&s5=kn8_c^x<9T8 z^g0~5&=`f#Q0&@!i5~o2CQwkxn z^O^E~&Q#owid5qCxMqXtre3DDf|J(@Lo1a&uy8rYvX|RPjr^KdZoJ|ejhK>?TpuQx zpTFWqYw~+{7|esIaUsd24Ho=FF8*E9L+4mJ-NV>{T2FymRd9J*fUWH&`NPwmVE+d! zN-ix1vE9t~=gcf2Wl%Q$*Jzy^kyV7X=_q_r)q@iy{oP_}I=DC-Xk+{T6ap`~?{k+j z*j>gxW_n9IAvK@Nb`l$FULG3jvr08gnZH^bq1p&bj-{37t;17JzW~a|j#GD6-Oi7K)YbJ&S{kp&<2l z7sE|#m4EFgHS6WsSNxwrd1==AoW&aD6l1?E3SB8k-!jlI+T0mlK%<`g=R}A0_P9p; zv|qO{c-Z(wK|X3r>GI+|GiN1vAn-7*qehW(K(tpa(xW7xsRk@y{Y3qyrbab(#^Kf* zhG)-O>)r*6!*3Gk*Tqz|b+F}GT%fm_mXSZA3J$;R5OBOd7?em!k;5IIoJdI8eXH!( zYx66|3_Tg&Q|+rb6HHrDdN=tL-^vjG*IOQHKV2R6e%%xLbcH8=73tgfCIZ)Gdjp=( zzCA^}w^?_Gi`mm635}^R%S0{a;y1HkmL^tD#@MF|?|a^Y0-C8N)!Z*|l>a%U(a@n? zvtS2JWtruNH!jFH#>O+bKVy&Wg8f9$5KGIEsCRx0=yd-NWzZl=6S4SghMN$w%{nodsQr{K`hVbd2T~WQENV};= zm4eYpTWWK2DIEovQd@rNLXdb86P#PJge&Nd4dLqg=>&tsTNk-a?GKEsb%!;r3RZOm ztU2auL&govhbAg5zVc%Ho*YQs$$*!{V!x5}IEWf`>Zk@~Pj+!-w>x4%4Ss@+d+Y;O zL4RA5-Dj1`fnUHMNEtv8rm%)a07g2IAxEE8m*`Uvyjkyi8fOKPpr!G?1LIl?d3$x9 z8Kq=P1n751!nn|;e=+;E@h6MA=#z7Wf8Q=viBLXHJGZ)2GE4p(SnY#OKIA6-x8-qk zsyxf+DEKrT4RHP|ZVWNvpYR|G2BovKjT6)LqWyk=MMvEShv?0FBy`+%(I#_8aVB)` z+idN_s!&vZi@m(PZla>nV{-=nKWw^N5r;268yeMqO5EcJAZI&-EL<+|#-K!(s z5g0qNme*PC$FyPMWst_Jm~05vOhqaF>W>0TP8TeG#(EjKQ^3$oL(f`#QrGDYryXoF z+Lm4WJglw_>X<-q7AZ~SYFDH4ZkgH3R*(d18SkZMACLoILA>n~bsbT6rqSRWsFO8$ zTzaMfQ3M_**k#>mG0X4*??2mmY85=+g;k)+qgRxWmDQPg>6|OOIVS7uS9Bii*+%c1 zZ$?ITh%Aw-d^#-VFVI}CJs4YvfL4GCk58i%TqW{w&o!&Tp?h;Rs!h7S;wC+qShh!l!+v8>eSYd5 zsm?GVnEWW8nX`%zn!6+50S^nuYu(_Jg&of5xmAJfs+zUm-2!DUPsRERkwXLixMLrn5#Mv%w!eOK%Ym~429STe_E<3`7xHEa>Fg>1WABSy8{U6y z738rHWR+~sF$yJs$xx5kDrDI{u1sh)Rr=2CV#b%0Uqsb8&_ekzVA6?!=431qkg(zK zDK%EpEH;}vIt6(-_w-NXtRR^L<7TB?X-|Lv41v!U|HDh9GzA+Db5sr*7u@ldi6^K+ z?~zgVqQy95r80ccRAmp0bAi6@v^#M5bksSRNNmW@F~x^Nsofr0SG5DPx~|9aSwREt zZE0)ObM+f-==9Q)_q!4_3sAAD<7=dm7t^bm9wt+9Efeo{Qbwu=@`tS9dT!}=)?Dvb zd!RX9!2o8jXXBxL6h!BKEKW#MBYkLGT!r3z`~_(JrIKY7 z;qnA#k$`98XlNyPh@P+$2Rks@TR($tIbk9rBYVeL;ijWcZsHM8(U!ud1FF6E{(<7P zm=+dbm~ahDB9~<;nCj1mR$5E?v6?zrG} z<_y7DTR&Ay(H4Ds%f#5F|L~d2ndTQ>ok+RgZbkjj0-a9lUmPEv(bw$PF@SCGFwX4l#dhh<)~^qhN8n+C6Bn z+4N5NH|~mdcpm`nl9Qyz+wEgm0f6hi1id2|4``;278N5l2rA7h|g#>so`B`Ymp1fdJLuY6u}9`0c1B7PMotxlma6OIPUM{a!mGDF7-s_7l@8)0@*CUkY(f)f+xgp0t>Uf9stgK1@ zwDUn_UyiH4iHX*{_PaxK$vo2hkkV=&9+*8v)2EkKzkP=qUbEGX9NqD=>ot>K8j^B| z8gw{hD5oFAc4FPEqAuOu6C*boN5MojyWTgYm9Z>hb=q{G;p`a5X*gZuK=Hnrx9J^M z^U3PqjyL#5M6kB$Z0}qKZ>NHm*8b3L+A>k_>X{5O2YnjajtN6Q$nBI?lu=f707rmG1 z@dfr-w(m~@0&GnM8PCvCdW96<6tY^T;h$+kQzAwbYjEjg@TqoEWgR>*6u42ag%}wY z!A}CLSMh6Jy_s2+K;>t?EJGg0;Smf+GeC`OO^3w+o zPLp~qa?V>pyM82ne^TO*qoyRP4ro7VEVD6_&+H`}c#Jn+{3Gefvc_ zFyb$`zZ47>kXn-mj*g0R7Uk6Rw84)P^TCQm{T zJL2*GF{h=bjxaUv#_8Rfg_Mne^$9dAc;0zmLKdX9%K?(CT63AREzhQV-cA2{dO3gI z&NrtI<^II2GMVV=)uznP;SMdR?901iG+9%3Gvf?aKNi|BInnL;qNB#G#OG{E%5D-21W64a) z$O3Kw++7&O#=9p;e=Ok6Xl{!1@`NJ_MIgns6m(njXr7qD+f=Sh*X3(x~^M6??nSeV74+P2w@LoYbq7(zCz@fL)BsDs_7h2v5ZAkwqQuY@>iYl;a!W>D7!>ud_IZUx{y@c!`7a=!B`-* z+`h=bK_(acie^Y}b=PIgMZr*uDk}Wj4L!ILnxT8Bsge(#7znA8GYKha#34YBUZ(F1 zRyY~_+W&aqXY&4)Y{LhSs*fTqGPMoWt$aLn0$hu+cnHZ|Hpy4oKsylUr# z>tYmxaZXk~i(JscwJ+JsOxZUE&D7wo@OPeoMl?3L0O^dG77 z`x*WC;+m|(;T}g)(ihKaLXbYR18^aXkPr#TXb}+ce82~kPArPy4LORBI^1x7By4&N zcM(xt5O^+A(K&Src>#)TspeZ!8<1=}&r|J-2V_L-7i!Iy^qTBG@O%e#3o*SMhctG- z>1fp)y=@$w=Zt`t&1OhTXSaSPYCMbk)Jh_#=&z!x z{PQ+Gys7<2f6$NVOt)`53kDkZo9+~+OB{ho4yaqi;;9!Y1nwf#zLwSR6FU;V`Hdmn!&Rx1KpYr= zxWX=2om`L@WfTXu+|e=|$NXcBvP!vqh3bmnwX?5vj8^Wa&o+=HXSB|2dwr3=Y&wZTePQZz}10FHTm9($m)Fc>rb zpO;e-S{=Rod)q^X&ak<7d12etkn1Oy#KyXy;S#$hb>ZsYn0ccy4ftoQb?kMr)gBJS zeD_PsiRvuLVv1&_ab(*WNb}uRV=vZDE&8`vnUaD}sgtClR}IgvwqK@rwiP5!7?1!h z_i1T@!3MQI{YFZv+RI#E`b#6t z9zOehHt$>>ir-(+E;k33J#s}fx$kiJOxh1U;LaBp+TqHBG1?7O1AAc413PUPJoGvZ zU_XXH@W)eozMMQ&8)+L3)z&O~-2yE?FNwhWl^})BgM!OdDu^^bv9V197VAiT>1?K^ZB{cd+5dEy1F`i#|RvfeWQayp|61CvsQ%fPRzE`x`^}hrEpdl zTE&^E3n#e@*MJs=tOP%5%MX}U80Z8IQPnE}F11TB)<-`hbqy1JRw)XyXuqA2T`1hQ zp=)h*j_pn`d}7$hoQ4xTpTpUD5#;X@jK=&sAWjp@>(&2o+LjapeD^Y2ez@1+&ts*9 zQ-TBI812k7?bMjHWuCJW9m$d;ivvGr7pTi_VtkQn35|XQmu5(bzI%enT4LW_X?`z9 zZ&|mkgYVAkZ;d%BCPnAkUl&S;jsYY_C`Ws^_H~du=r;)Qhjfx&;HXo-ai>q#s zm0uFk@qz{)3)ld)y)?w&=Ka!gMvEr8Of7FK_IrZuQ2YKMe00DI*g%*dPr(ucfiy%V zn?h5qL?)foNLdpjfD*^!g+L1vdtzUduSU7c5!K_rM~l+9^wEstc-^DmgEN%*puYw7 zx0CwZEAtgm(hfP>66!LhITk@L<&uN;0W4S(!qK-P9ZmXvTai!-oqwwyaM3HC=HR*H zfR`5q_5Oo7MI9*a=nakD=Vz&+7d|$lGj|drobTp3hU1bh1ts84XFosiOYxhIrdOcT}ob>2}^}HJ5fdd9*kTjiM}TYRD4=Khb{uzs`#AT5gsPxgv7$e?WSwt>cUF5=Ke^O*CwLW z77U3o`QR{?pNUfb6@uBNwSW@o8aOv)DgV!-n9%S0R27w3*^{JIu;&w+N&J_dT-y=u z6X1$XTcs8i$mApcuJN>zWxydd%mF>D=r2@+^?|kp&$DSH_2g_~EItH#P=_OvtENJ~pauArvIxgw_Guhs@cHEJH57*;*MY5yeaCD7b36<;Ms`SjETPro%|f#3U& zrZSwNY}uFGL5uO*7-uQbHya)H8S<_Umsz29P|nNEs%!R+-|tahxwHWrHNhw5QSxu+ zytHBIh5M%#7AmI0Te&v*I$OfL#}j6~ zTRk)XT;xX>^W(9>{VH+z5Tdv0Bn4_LLuYtudIRN>$@2h+zNTBT*}lJ|0|WSJZq#!Y zY70IaK&N{wn?I~rMVoF4Tu!NgUIZ_zAYMc2VGo z+6ylC7){;95KOgA3Nlo^>V((AFk??{BzK#2;H05;b_5)`c_?%P~g81)J)`VeUj5 z78~#Cghg$5I~`BcrjznB!McJBVnSees5syv)jhS&=vA)WM;F}UWuXo|l1bRi=1942 zf54*GRs*1&P9M?qDC#VVD~5}!@=~5^lx&+}@ZH|YlUF6NEG4^_t!Ypw?l#yG3ks~gS$UY1A_u(d?qx7&jKZ$`0$W7w(x+opB!*Y#t5&zSK zGB%?gpP4QpYX|Q4kNgNI66pRpY~NXX8qJloQ$w$epFP)S?Ze4 z!L~9X^g&}$G`!M$0SC-Unt36=i|eFA{rcJLqiV@*5P*`0kfC4ybJojk*7vEv`5V_s zmmFLcZ`V3v_isAc|AL}8%D;)z%{r!^bq|sS{$OhiT8&!1)^$D7GwIs&_6VB3iQ3%T zRqZA^nC}K+k@dP|Eq_Q^j?7`jta|5nLgu>ya$9zC9~&jEYx_QA*5j}Cwyg$8^ptf6 z4QM{FJ0fb;I~)X`!TyaO0p%Nuc1MI8vWD66A|fuNWd^5u(8_SRp`;$th`6J7a&YPz zO^nRIcN3+?zHY1Z(s&zq$_ZP{5tbo>ebhjq4>q36KXSul&EPmV7Nfi>>^G^NSG6W~ zYgwZECp4zclj9IGn@=^1S6W8<5(n)8t4_-kPXCS3_8+Dtij_vcxPs>!W|hjQI;W`P8PFCQ4Z z?mr->jZ-^+lC&h$NnPIiVtnhCja;Q*g`lmVE~I^=fr6<2brWUEiDxKKm>jS!(>hdnLl{vtm}{* zop8I`H=nRAABAsG!KejgztTf=Wckl!wPF?;oRY& z@n|d6^i_gdgn|7d{EctFFP;$AXrjZ$h!~};I5E$^NNjpgz&^4euyUrA=+NFXv6`iK zJB=YLFFO1w2N-8vGPjxC`i~viWE4stY{Pw3`$!1WsO^Dj`S7=r#z|5s3W+jA^%0?7 zvrJx!Kxp#Cx_PR)I5BDi?H=ea&F0BQ)ha$g?l^afgb}whhaYkg;QDcUC<;aW?$85t zszw%oHdz%|c_&9LDjAj;%S{#zbwX@m^S)5{S@vT7V;?yTIDq_l5HJK6jph#o6m_%xgJ})3{vh|A_l3eY;UC)wS37uT_>#M&v?*=?<)*yl(Y$*JPap%ST6*A*ht)lb{c z83paKlK=dwq1be^2Ajb?4cz+e_=gytn(%^bp|hG;_hA61`h__>r{iNIV{$w~S%=Aw zzkbfSZ3pysZP%;qCs}Ko3%EP%KKwZ1{241qH;!M5INVEb6)8a0`-BI}A ztJAr3Va6LTFZ7`Ebqsav9sSKuT+{CXhp3SUIF!Kfs2*~*GWh+>YEtXxTdExAbJaTigD$=rN0g+Jr5z1+x4SS zG*1qvR&IhUYUoQ2Jd6DV7h$VD_6K5mro_;H&b68HKJp{vAI5Yzf5ww=@;FbnIc&_XuIx4a6_|(4HALu{w`}k4SuAG zB8HEj%#4H+RBepjba3EPNzclBJHDkV)aIjY9CG&=QshYxrU0TtH(rOe&irHw@LW4hZGYt!L1J$X?!>!%RusOq_~qh%rLwd*r_gK^dmE@f0FO`M^r0U}fG z!n*MjEpjjGTStK_`U&c(TrTEijo1xv@4t?23Nf}tIteCTJ_N_@3{JSyYdFDH;2qT@ zA015kO%KWo(eOt|(eU;(hc@IY=^W|m&ANTg6L1)ai4FHClP%Q-_pLaxBe=u+)kn@7 zW^uQj>=m9fc>{(&$BJVYw!((KoJCe|?a61?7QkvccVg&7hV+h5DBuqJd5y!fw^ z;PKynkrmS$my~FDSoD`ZGF`p52HFB`F1wW%w#)l0)CIP%-}TAR4$PXKKMZomFAU4q zqrP(Wa3~sI-rzi#efc~Xd(sp2t#-Ts1zYu+5c7Dw9GW3Ir6P zM*)_~>JEWF?%VX&&CPW;7-suev`HPQRBk)~E1&of8V=QILNu)Z51O3AO};cOPw`#^ zlLF_v6WB;E(GdxfbWUz7-1Vz}!HnZR;m_*tOEnW?EDIa?4Aaol;G0+d2+DU37ql3; zK>eeZO9|V@jbCWxV0*i98=*Q_Nzv!sC8^c>YGAz|j}nS46QlP#mrgp#<&8fDd`RrZ z6bpFnL=4Zx>nfd82J>z>4T?sRpF-@@rCxIS{eC;q(8(eoqA3oV1+>JBUIt3 z5HKO|LG7V)U#!^od{@w)&9&C(xG_xK!{@8E9%A0fm75Mgz@**Qul=`W1w;x{gO|f3 zIMZ>@)@~w?+MJED78F*%1)u!{&b)Xd3@+Qvi)L>a?Z?M&xNKN82Yz(ZO%X3PG1L~z zVoJ)c$t?r@1TboQ1GEO|Y`nX~0|ap)w!@Rq5ZuZCV&lVjUz!$l#+!zw_sc}2K>jQ@ zaKsTvNAbCx#Ea+I$DA+`W?phE68j*NktNzeE)LD%qAx!!eaTfrCtfnEU~sjgC@OQhh zJE38teXQ`Kz1PF2KpZ`$HDY#nWduo;4zEN|)5D za!$5{ZJ!6bWsLW0b zMABNm+HxP6@}H7%8x(Yo>%rc=OSKlWX_u(!oZ__h)AzW)e&Xp{;iS`-!Gbf^GRMAX zV6pBZAN=U6H^cf*=r*+oNf3x7ZMtkCD_!K3k>O(5zo#O|$!>?|31|%LW58+A*bNI4 zDKy?qK5RB*mQL&OA~D)w9>WBUF;Eu)hT^%mMlZ96y{lnxjw5shDup0NstM^p7 zlBc6`BeWgfV4L@>^j|<`*PxygfsP3yS{_`OB{H*)z_TCUWlaF`c{9nf&rOAkJo|PQ z!?!5Lc+|1uVa}EFpWial1`Gc#p}-`|B;^ zXWtmDEGoZ3fDllT;?y{Z8iD^-?)l0e_H8`W5CfU>z+ggq$KP9On&9K#y#a6D`vN0# zw=2w$LKpr7X?^K|oaox+qGHCYhNSzz!4N??FZuj_TbZ=S=@(HE=kX9VYff1r&zK2y zFz=MD!uXB(bXqPuZe~%N_L-aZGP4UU6o^iPs8u&aP39zmaCg(B$qSBvLhmGIU2zh_ z-_Zmel_E@TbUoUuxmmAZ!^&6hfmd()H+=GskJxca9b~NKZpobCgaz(xZ~Ds3TbAxZ zf0VJk+5lDffJ8tM`he`#-fPqo2e&==PW8b@7`eEZkj;_=iJ%1W>|L@QUb^{TuxG_? zZh~aQLCI;FN7HRbgUDsYr0B>*TB~z0Jp@YB?V=uP_OQ{*HF^tM8ZeU1hE1PN5MPnD zZPv5(ZRNjT__?>ax0pzh^!1MRF*j1D>bKyHYC+s8VC%7%3*-+{_m6;u>|cG0LZM)d z6|^1R1l=v}EH^zA&GqA<1y~UL-2vGA#ya@#cm4sDn-B0k7zt7oU~z0Q3~nGW{@KI3 z_q=js?Sm^~vDw(@q3o`pAau8N!pgtC2TT62 z82nvy>`XY)F{`n=8L+F7BCc5{q;o-rs3M|WWUN$hBMZlkG8_zX!mFZ|;1pIc<~z}EF8@bm9~7wYSW7>=-$ z=;;|p;4@#?1t*^IE{2UolfB7#j0j-+x{+|}4dj#rQ~ew!hy^fM6urI>7)>(%GViD zIbrJS;^*SyHx*Jz6eoV(^$VeF#z_0Nxxo_)E6K=u`<{u%p5-RH%9Gj%#BUU*HjV?f z^?%vF`F9(eYrox-(^39TKkWW!3v7F91Jobr`8^fEKsPk3f7TZBY)=WC5ws%D{_Cde zzx!{v$?yBJk)6(Ogf>7yO0tW)`hHK`+Dq+yrQJ(B! zbI|L33a5X$zwhrxLZ@hMxFsNoouc&NXLzAJw8L5BrT92%*wp#%fdOh4~v z7T0RLTn4^HSuG!1+Iu3_-Y+rA0qdrMfE+?*eZp~n6acuNj4 zYL!&5A5J>sQ#k#ickl+c1911ZJ_Bo)FN}Uf+qDJjuZ9Zf5*l>$1xI>n zXAFA7FZlLZI0n#)(u0)l^}hRm(@s3S2Suny2QUJP&Ef%;**mjwNGy2FeJK&Gc|BAOA|5v_y6nyuK--NEt zVqQkbUMz6bnUCcgDytP(n^z-VUn3lUVl6EHcs!ON&$*i#YHqjuTl-wkoPhD*Fd`gX zj~dg8N7s24c*}G8gj|!ioE>Acj$L3}#>jSS{tWWOM3h2G(#;+^6EaGsqV|qKVx0Oi z>K7{1dGuReSs|SGwbSwJI)=1$iK*5__=}9+pY8Q6ePHSdak+vx>L#fN5*h*J6qnH5 z)AzzXdwAD3A3L~hH(qs$WKQ)v&ph%hxpV^R!i!Tr{J+=XgNNSIk-59F>{}d?!(Jkq z{ydNtq$6vBV)aW_{9uR)6=2-@~JAAJrZn9^YP3r6oH8iqMn2 z2jeLJ!}~To@Hhc4+OeGQRKoWe{v1W z)I7tPS=T&q8h8%>Fc7`P)T$94Cp%aEQ$mHL?6Zzp$B1#~#uE7U7k&VT_Hi?NYHV^mf7T)R%s|ex)v0C(3bKd4$$D)r;7a!3kj}9K7D}>B-6y-U&&K zG-)v)PYlS@6xcz5?sjP2@eXv>?`2tI3u^05ia;O$TVCG)uig0{sNIWk7sSy|ZuyCv zeD)ZrahIX$PoPaOmlp{Gt?M{Ma&cdq_mYjeX_Vuk~WVELo(!TY~? z4ceR9nC=xXJ;yj919aEpSzpT}Cu}^n#<-1E8)AAEwo6OrzK|jnMu_@qm_BL9E55aw zjD;re@zueMxqD#4>e+D1^|wNGWr=Hkj;$|r76;u{Kt#gOFH*2Abx^|s$V9cUi%nQ< z(J%<6LbkWWKqYa3M?zUJyYP!R~H_m2Zi&5*5$ZBf8ANSsCJ=N&hjuFoyE^YXO)I`}LH_(KhGEY0aMeUw? z*a8254$V5?u7fhta-gf5t{2z)GVtw#Xci?>d-rA*Ko-W3PcIz7j@h}g=hjG` z*M{(}!m4jzRFkZFFa3yO>ECV(#^qm219K2+Q8Vv=_83~)vqu<_3i&!bb+8fsh~uft zwvY8#jx9U}PAItsM&(b1th7Av25`FtHx2xr4ybI|340qhK!>jy)>Xa@ja`)@IF4{+ zwAiB1w&+kddCq56T4M|5!W~k(Bo08fFfrs{O_~Z7LhOb9WB%-_nD|f-tN8W?ZHkuS&&AV~y zi+1!%Znr$L7NV~CzVE;g{|tvZZ5AN%Sel!KKqR&l#WQWvys8lXZiXr(0a0#dns+0B zO%tP7e9$_q1&^jRVKg{iqhoA6jqqjdJ&=@_#m11aKdRGK!9M@%u1KvcZz6nc%0ICX ze)NnjE-i!EGr~jd9W6`MufU4Rr=YrhuXThuUEk(SJRQ>VO5-+$oeIh?&4-h}eGUv7 zR~E%M5W2pA@sz>CF1ljqgjbyEQr{0O1Y+FO8(1KuQfuztwdSSm%|zyW@{W{39>HSP z#eepExCP$F+tIo(9y^;mdODlO0>0%kl)DU(%y~ZYBImYi>C9}XhCMG>)m*WhU7rvf)DW@4`Y1ivfrJwjw3C*;MrY2(lYW0{#H-ng{{=>fiyT~(53K= z8PCF{7RZ@_1#3heT@GixwfnKys4EEh6FhX#6%EX=b+%R&2yjzv397bBSU( zCWhMwH5D)aY5%70IX|az3?u{;p%0|qbZE;x+gE>lu)XCXw`X;Ut@(Z>sZd1bTVeTQ zAMnY!pK$X~NKc!}WxLV?xs0H)vO8QXICPVVljrDJZ z#-_zeQ{!aTOdQwfL_e$Oe7J7GBZ@pI@FV=LI*32o)8d)6&(pB4hp4Q?OemR8l) zgM7T3kJ~wx7lcjCb-(%T-VMqF-Vv*TlR**s!0AidmTYLO$@sz6<@;*7+E{ccw@z?; zq7Ontc{RNE%a>uvU*3TL#$}gNf8UdO5IXAi+4q>>EpIRrMvprTH{bJb>%3BMvy~!J zgZP?8$09ajSe0QzWSW)Pq26$w)h|L^^nz~DK#QILI*ru?k3ciqGk4Rdc)TPoG1>;(`+N81`zom;hhR*-9CE&5#=YKCVX1z(%~B$Q<1)wL{B_`;^6 zdOLJC$=mW=wk2lR_(1N&08MY*_adx(?0smf#fW`Tyt_Ozz|NM2yYAk;3il&aN(BTI zp%3t0-qF&Ki;>?BwFUg6xo>Y22{UhByom+DIJh3oe>6wvCeSEKic?l3qfUMqNqCap z+CKDjPJ_$7_&UrxV<{9C*M+ibjTgT}r5$5tEBn0}Q2pOp`PQg=UGM_43`maAiqSo2 zW-d{u(dmv)?j$}PO{;+_=<@KRX)^JmLvrdRb|I$A{uQ-E7=$bi9LBz{^KOQ{z87F! z;CGRav55;>(8n95=AIjBfnI2ve%2x-;P)k26X7c}9z*kcURXEFx2EmjCobC=dp4YCpy653fVd z&+K<}BK*R%U%>F3NfCS2AQk&Vlr2C`^XI_1W4;|WEae^Lf%Ycww^m0tY-7kR-7fTx zk^}1dzkLI?y|Ipc%me9!{&iydCV$sOcWhhn-x$PEk0cQSiqMm&v!W4oT~p1_zwY0% z4?{%q8$co@In!Z2xevYenPsr!y~H~C66~VjA(2yY+Gx1wvm3$d#qh8=Gai5PPMyXj z$XOPlv1Oz(iOdB+PK0XYL?==C9PG4CVY9b$Q7ng)&mw;lUbI3H;OIJ3w<)CjyCd#U zxyJmVzhr~C&dcEUwL_(6Ic&hQ=R1S{hARIWbX>zT=tldvNo4N!M#<~RfUBqdA56$v zWKZTU`dQj{<_x(AgXKtXd0s6)CeQ!tZnVDP%`K)q$w&L@tN*zKcD}obcQ;#S(y0jN zfk$XHc6VKJ`?giD_CyBtY+@sz2tBd;Cno7uHdKxMTlv;~0d)8_O!Ri8NsWn3d_ma! z%BQgTwY6fhaKmCTi5cZXc-*Kh@?GjAX-=>hPQUmAjVx!*-DuQ1-89E7(aILMC0sWx zwlg3^s>A%9j@bQZTBqo5O+nNyg_EP57-3atSjD4(l7g{NuOF&BYhjo78Ti!yD>wje zL3@yEzT`NkIc-{0%iv)PPuyS6n+ji__6&^AK1u9LPyyn{qLGHKH!Xg&#Y->^CKnqo zGGkVKAy-Gu4mZ8nD|z_I#vrWv$47ABlih5kAurQ$Qz7%9@9sDs{b?4v$*=Mx9|DTd zldsPrO1!qQdepxTZr>gV2KjAiQOw1ZeZ}A2gEjwNh91Cfn6Gca3kICE%UQFIz{s(O zg!+fapN2NV_=(%2fgwVpNW%|(&F}qk064}kOy5le}rVd@tEq7e2E{$CsZSB1`R z9r&M2MlWt-tm!K}N70Fo_GoCa~`cIBq9qGyv z39d{}0h~7c>+qE+e}^Gi=o&%;o#i#vtN+smVEHlMyT`xiqL{47VPinX5(wf&F5ox% zAN18*AWiZ9E0*dS(ReMKEJAp&Z4*4Y`8s^s zdWn-a;WS9g$2-mYInnxK)G_1Xm@l3LxkK`!mL}8d`{==G^G}KTLG?hwBA^I8VY?15|uDR(ZtgZ$;mur(~Qtn!n zkN(b$#vJ(h*Dtvh4wg@Fj%*hTN!tpf=LA!KL|G5>TDMW5Wp{TYmE*~B^a{raeztT( z!bURPL}}LHr?<7E(gAM=S_Rgj^W7)V8lbSi?(}{=q0-ouWqLj7aN4jNV8QS&f-itZ zC&GcgjV7W|gvfbTkq(32ZurUS`Jz|3{Bj$BTADTVD99>vibNRKp&zlZ3=9){+AZfn z=@foFx?}W4-K?MK@qK`#ep=s2t7_^^1eD3WH_`2*vbVO>75@F;_N^f@my>oR0k|2o zeARAPftq_d^g`rFv=xUW<6>7oUyv}#5?Ie!6B@st*012?#vj%p0pTs@! z2cSIoCXzYcyeG(4Pl%4M1npOg1;Xfpqv56*Pr@lfZ@{C7daWrk(yk5W}NIVl1xWN$rL-9J*j-#bfU|cog?Uy7)dD z40PL)6wOh`&msuOyFFY#z2vGb@Z_J`k@OoOE2kZfKd~LkhNB}^dJUwf?}MDILU{F= zYvJGl(;eJ8O`08yLuS=@SvRjo)`$fT((?*4n>j(-F4pZEYyHWh^@%T7H}V1~CID&V zt?2MZhZl06h(|4ou=fJ`d zUxzU{bHw(zRm)toPuF*0Batl}jMuHoJYFPopT~<%gftddMvgxNAS^O}d&f_Qt-yF4Iv~iws@$`!qAMaU$lKX|7##EMK&Q zso_Wx8ClKn;));QB!~OT9uYp4P52%-xVIF3`kiax&;eqkNZO4ca|M{R<3*#UZScuXA+o?&lAbNV_w0=Eel61e?=oM&hL*38tV z)r&bl#ZM$YtxHZ}XZMmXD%QG8*gqEv?Rp@9=4l*b319%3VH9=@e<_@9n(tJqP zq*R$FTw$X1c<>y%e&R>g*tTIP-20vHKuZ%k63V1*@#mE{Chgjdsv$V^f8WVqROx~zun(+g{jG>(XNdVF-}dg3J# zvual*y!F!;;EX#ify}~e7mFgkAfrWLRcHIPKi{>c?T!g^zMgokQxdsBKoPndloBw{ zk9MqDTHo0@U1|(YPC}9gYxh*b;`?5P?hZV9BS<0kDZdYa@sqioC%buiXh9HKTGAjp z$B%(!%(=whx{o)0G6C+s=|<@G7uk|hXayip5;0YswMTnlt?*`IN!i5Wi_}y)bKQXi zPPd|w*E*4m_O&bcqaj3DGUGF7^&W!y;3lXHev0cP+MCxCc&Ku#v1do}@+q#p`{2ak zSEAF~jgU?|Myz;Yj&Mcfy0%5rOihRo=JJ|bl4`?|cTf=h)(e>nLJDtM{!mxQ_eUnC zZI{>KJN{od{mx4uyNKf&X<@|M&eNfemajducSF^;$IiODKjc?+_6z|<=sm-)U!MN` z-VJ}**3ux|aKrXv^+HMWG)=l&F>K_z=T|~kyYU=tEOTMJ8g6Aiw<=rXx(E(Q7o3&_ zZEel?gInY29!N(;DieQv7D3ZLdh=BH^<7t>MxVhK3AW`D!BFkQHhf~YoF2^}Mpz}W ztU8l2*TO^l^z1?{d@tU_R*nlD^haPsX0F`1 z_As+LYahUv!lPky&e1R|XBtc@nh$9~yt>rnw&04(HBuIf5Id2ihr8`6O7y3+7+^Vj zTUUnrBhWAqZSZDBe?%-^?~7A8ysLsxcd(A#!7%^EMKJ8B(FVhmxeRk(ZO02;o;f09HKu9_)Od0(mg@ zN~9)P%F1Y-(P%7xw;FHci()Y;SIk2eo!0P5${uubl z0}m$RWZj4btT5}neAA@Eo>&`@L`2%`2Tj|ZLDIsR!B=Z@NJh$S;e8#2fRfkvzgP=~ zUabhAIo-1f_v8T(v0i#WWwCC^PwzbHq0$O3k$_-N`>XYcB5Rw zO4l&E&!Q1hETkeetfFBzJhJOb9r|1b7C;F9=R-2jpL%{&*hJAiam(sOVab+5avyiy z$uRlMqePFoT|#@{oRSgeTu?gp&A17r3hH$Pl!o5x5XY~AXAbZD@<+9mx4N2YnFh$o zYA42I-|_wyE(jwFS0%(xaF-=@H{-=2jfbHfud2jD@u8=5+N@ns$Id{;4qDvAh8VQ8 z1fjJh1G00wVa?J>Nah!^sgA)B$Hfia5kme{qFgh|(q@a-VtOcc8~%r;bUJdz`@|>@ z(>vv2LnE!8_Z+h|ppZv`YoHM?Luv5u!s^MhjnkGE5zV2`^bT+OMUljF=8!XBR`CTe zsqjQRaz={~?)b(q*Up7oElO?LXeMq3m(b45vc?1xo)~DXhc)#tTfQK20i9MfCgI7P z;NTlGJgs`-Lnsm)rJ?t82e_^N zotgs+UaZ*raWo1Ei``sN2e04#d_pS{hj=+B{WwJx|&jC+2Igas6T5NXxkuTO4rZU~W40idXOqP8Y zc{DXNG(cB(C;WB)6=)?fMjF&tmpASdNGlxCQ%U>yc@N~56~OsFzY@~2@#2{%CXsZn zx9Y}G)5lE9D{{UWsgGNwstZRzY3NBXD%Let7e89Q?ISm$>L>e_nnrm0z84dQ%%yC6 zK0%XU2cDtczXG~jtgobuV%~vag9JfnY^j^w<@SW&BM;Kr+~fDdvgPBMB&4A-o<`Cl zQqS~cp5_rnnx zIDYuWFfspRn2>ioe&)mH@e9Ay^ko|@8p-;?;&Y3}$$A}vABKoZU##}94bb>~OG_(s zb#=k+j%8>uK`W0btJZGBCaq`$Ux>ufvg78x?pdB7G#zPxkMNxOsoy^jd}%&m+t6?9 zSl7@M43s=tzGWqTJF90hsHgh^0Y&J2fpQP)_~*eLpHLVPr(*QGV_hvB@D83yZK)+Q zbTqoIQ!TN7ub%|{EmhF6cL@Z$>MfUlEOR*a!u2ix#x z9d!5`SYCcij1#e26-}R&UtB_jpANHzEP_$!*fzKHBHUugWRcTkx#XANcwKLlL&$mL zivl(B)>U98cloy%44s`_(AG-Me|R-%!&8=*63It03P&X&nR6^?oposaen#r2+4XN2}oIeoK-rdzr z3&eD9HcTv>4^s!90z=X#!LaPfoD2-dy4;m#%k^&7n-Su%+twbT+yFX?wjzdbHZ2 zRa^9?(2Cd6(MTRTj<y=10lxitE}-&_lCy*)-(v>Rq| zi)v)@w%-R2mqA)yI=ppI7u*KzzH+Gb@5ZL!K6upD7i0NGIjANNUP(G0rVm;Kvr0~f z!D-`ByF&uEvO~)zx?gKLf~PqLvX+HR{@NX4HWlPI0hP)~08=&*zcWg`oXUH!tgfs8D6mkaT>U=JoeH!K#4!Q37kyD>Y;HIUt zXv*ZCpxys^)&6t-cceTbnMs>Tya?*{* z9;BSxN0)kVKNt6~$=Zwmtyp$4-20Q0*`DsNetkX^7YE_!qc>}2XSsiT_StLT?Zsm? zDB>Yg2v>)-vcn!MJ?+QHc6G1|+Pnv#I)F}tv=u;&#MO!$M!fLXJKuZo1c+` zbjX1PBd&%8!>)$(K(26r;|m}s>yQghbv@kl3kQP}p53A$jNtJD=G+yd(on>4X`DxtEvti1BAxgZz+&TD%~U z<+vHTa=qlDa!JB%7;%Wq>@v}#d%8b>!=0NVwt&V(R_Ro&oo-KZ#~YS-msh*58n(T$ z9;RP7SM$(u0jKxLgF7&k9-I(wc~p5lM?evJ&oPX934c4db+y5%*ro>UC=q_Yf8{RN z_0d*FVhJ_jU_)rX+}~Ck(vZUqxKU%s)-i124?_mD0 z_SosLX+t60eeXNyy-v~B==lJgbM9(*;)#XAl-dh6WSf@JS@1S=UaJr6z;o#hxEH?1D$ep1zzJnn!SN+mK$f>i)W;cATOu)%j*NvH z&W*ZL#RGh~A?;6AilF{kfn+OgX6bY; zk*LJwN$yyi->1)QcyTq1K5hc!4J&k2FO7;;zkl8@cdvQmhvVl&-VStCqRJFc1RU&w z@vKUf57+=BtYWa5t>Y!w*C)~s5Lo~ z5PM3PioIwAPD@LJPFpYd(0S`M|0;ry-yRSD_{Rn2(^xt*I7LjKUJZBN^%N8r;UWM( z=;{~@mt68S2w(&=CtcH|QyWQ8%=WC`gr%D0_ws{oot|b4;<638(TrZ}!F_PLFWezH z?bn+3hNXW%NKXFSpqx=KYtZR+>Vy9zi{0dawISt(h;Mt0s@hBfRzgs6h#tM(ZTSdi!$f?hg@%zGIMQ|2IPGpz4 z=-ykaw&)j_Clr@{mwM(eK~FYf$5J z{41KeBjuGkU+ey5EOe_Rxk!^Ikq?CmJ#EBS;H05ng#TN2IW%^aM-+)j?YsqfuzblV z$o7&Bok9e4{D?PHU6O(Y%gVxX8n8-Cu1mTJ7bgg*CnfQ;*>{9Az-osvRHLc{kFalij z?)L?uMm7^un@1JQhRa9a5BcdOOnH2v{0`Vq^_I2qSJV2;$FagyJbBDY;;Pp&v?yk5 zuY&HwmSIp?M=)ZiBU)kJ;JD9hw0cXEY<&75(io5}#N`Q0EIt87X3vFLWhX(AZvrk@ z$TJ+p);NsX#qV*CVxErA_^{BnDe#P3IN4Uh`c|0yorE^kLAa4NUSD4y;&7dV;IhWY z;nVtObX5!EK2zL{l~GwmM_rD14(y#t31RM_JUI8KpT*;BcwtV2WP}_S)TN`2JFjH) z>i7&ARZ33~7}z7VC&={Svu{Uq7OqVx8U{O zU8XBDb!V-4pU8?udkkiWNNo%~87^I98?$~9lJ3ociGz-Vp&8R)SnhO~SaghbTO0$3 ziEnnDeS8G0Q7Md-Z_v2z8lRh7RY-VGO%7`;P5_z20oqbae> z?2=AsilmEHx|*#+y6PM0#hLc_(yQQ{k+(2Sm`@RWcAZ~#1$=nuuiTt1ljY>EFVUK; zM@S%c4p;#vrT_373~1`(L0z=EhHj@s(L`JG`*ts9qE{3uhBOR?d%n~Br%S%hgE;xP2$feQM zrgFy<0i~hG6U`XPT3%oI7@tfcn_gwnfv#@Y_~Iuq)YLbRun7~dKJ9A2yR})ntP>IA zknC}A<>dSMHLn&qi94p{o(0!TDTe2F-32XOcpDqDqDIy-L;K>9_wA)*JtAqhuxem< zP~$Fz=_RM46W<^hk~R@04?Pyry2){k-}c5xQ)=JB?8&%FDvE+e+-Jihwl@CLG$06-lqC9>UwylNZk=jFKe#zqxX=99A z&Vn#{-UKK>hp~5m{Xb|$)AT@2WZhW%>~c7J`elyIl=lh{dhgX9dJG?!>iCe#&}#@N z4ZYW(buRec9jjlj?rcBDIVaE2)!G3c{N^>N*m6ieySsh7&+@e$`V`}}Z;MzTk?1v( z{s?39j&mhf(Ay2~9{3AvZ+s7`TKD6WW7_XF?y}pL>9}se)Q3|_$^<8KnhNXJKE=Btj6B5$_|M#u3*n-X_d06ZVSS3v(w%5Wx^}>h z>gCXacYJTHSb}G~59vtWk+qFp>zG|Te=GLr4P=eqvtXjAL8p0hVMyjk7*#wSaxgH9 zFPMWz#iqiTK{Fw}8@+=u4?U~h(k7h#+&DU#+Zy+a%h*_oU@{j1(7rfbBWtjPm z8Ta3*5xLc~{56!Z6+E!*&9$%^o#k{M5N>Krl02afn0_AKs`rJH*pW;+RpDkFA5%Ew znlFu<`p+b3?0^ze5qdv#=PO6{9{*pl61buxF4Fus`TUC z=1n^mOKJ$`W9ISYgCEX$3vbgd)Xna0B@P`k;^e^9sUTj=Qq{c|cGaxq=fyFQOLc2G z?62R1E_Kbg&qp!jX{zSawVaq(X~GN57tDgexg$`+o(g%sA>hNSLDL`~hU5*${q5Oo zpW7Qq7wVhzbk|r=oVDlW%aFI4N4^zFxzKu@mnJs2F_zWEG`FfNiuyUBMLKd8TC8z^ z^>W#;zHYIq<(65shSM>$PIjhT3l3v08p&pD(+jY)=I^+Wa=*t-eSh?IpMwQI_=eVJ z_Jl>JG5E@bE!c3}ZGUq;toj#T0jxjg?sga_Nj|UF3#a0Bt0U%&b(UC+Cxof{tD~o7 z&CDO1c$Z2zw<4)?s6F(4=)T3(hh7neT}MKrccgOD0a%YA8bcZa^FncawjY`XT}_pm zTvig2W;L%2qf$XZ4D##FoXfpjt&(&o@lAq~(n*|H8UKVxhMDMTBE~>6^g9m?irRF* z#{$Lpkf`}yFbfze76~B{8S$g{5A*64apGkcuv(b6cW8aA5rZpL(bQ8eh}Q6gCD6tT zN|-mjlv~KeM7HUL(4j6}9@GB0hK0TqEswt8av?>6hJ@wK)Y$=a>V>Sosi_g@LKSn8 zr5xy310Q0Ln7R)1*Un_}2&!%jY=J$ZN+-9>wL^tG!e zdV+xP!s$s7>e*-zxNqktPxym@Qa*Xu8uzp!yE?jH$)D&h1ha!zEKCuNq%r30#>-)t z)@#=~FU%cuQH(ptH2KSR3;ZNG330Wlm?={{H-{RBI$m<(^=E?5pN&pv+2HNYL_$x) z&oY?lR0|}dJrlx!`ioViTT2;uSJcOz&=He8iaLPI`E^4>R>!DNGO)Q&^H5;r89xj= zE=JX}AM0^s_qnW^V`0@$n{loA4e0CRehQisqpnLS?s`p44JUJA7`YY@))bO&S<~b2 za^)T9^v21Y^$~TpAQsjY@>v~b<4->su3h{bCv*N{nGkjRZUtdDYOZJAc?nQZ7Wovf zGI^&~Jsi}gj+PEs_7|Lkbg<|hPxau*t&ryKuCpFHxb3LudMQm885PTw-DB-l>0*NoNu%r699I2MB<~c?<@+j zELTUWW;k6fU}Q^l1TH?3V>=M^7Hn$U~?_FFjb_xIxy@tgXJ$Cbdj_gw))CX{ky*r^RVv)%_UTpv|& z7_Ed`UR$HRO6>N(2o0p~*VI@2xsSwC)d&RQH>wq+jtIO_RsNz=Cep&VmKlU2TMpta zYP+2tNvQ9GeqkQ9AQgK5j~;R!pI>8{?abt7B56AX))hcbgs(3|QJqT z@b$T^RwsN=xJ!|MFjs3RQ@?_U%tnT;(3ipZ%tlaIyyo}7^U>r_=g8}7>#aT4`6dY4 zF8Q$bA^6YXZ$d>I-fvHK6)}#i$b~J6kzDCJ+6%rE&z6rm;aF|4><&y9xlp*Q!W=mJ z-piq6VyPyVV~AT9MJGZQiS3$yFNf9|R4$}Y4(AoIcQWtVzA~y98;Q`~WR^h@dLQ-P z-w$m2I!08Q;8Y#67~&6|H(yN-H{yY0S?ou$Bv89X=gsBJ6pzEpb_8$5C+587jQL!64l^t8)!^Vf;ulqg=8ya8JA_~gI09)(us6z&=kqF>1hu!s$JX<$Di?JzVh3v)FlcvCk7rF$wn!-^#!_$sa(^{tx*eAO}gu zy`>=3b#;CYEt43dSf#!|Ksm+r1d_N}t z=upsGcd~9>vuf|?G3nX5X~4*g1q}z?}fb|Z-=obP0_m_ z+DcB5z1CW2d>(hUdvf#>F3TLy54dt-y-OYR@oMcIF`ZSwC zeV#1v`0?16B#3C+X2qkz{2j)zuE|_is4Fvwi%d+DwIN?OZPq_3wPL45gt=T7VruIH zH+kI*MZE^EkvnO2ezqrGTV2Bju_)$SF zY%l))j;I>y>CXy*vM-CZg{==K6vuLS72M?`^;>ujVB^* zhK0$jP6iXvz@jlD;mn`^2rhZ-At)M$7ug8MErwt010*W=_;wP&(3zuP`nj{UcOl9` z5;i-H+m7ZASn=5V?sm;s=LF%?#_GT9Y-vyy;a=`p1#m9|{A$&{|1pnHHmv#Jj>HFR z|FZ&Gs**QWbXrC}-p}4-`LgGx^BWfV)`Kw+sHH+}t7X&7E^xFw_Z;F$w|vK{GTh6` z=VI4U&_v%do^w$tGoVY^nT9Epdj17(0C9u1K$4ln7mkD~!LtQXlQYytb6) z_Kh&%%!LAc(%OyQ?-5Y2e;<4B4M{!gvg6_4ntjl4xISr4sW>&6qw0b3Pxj)4H9KI; z36tatZSyG4k0Bg9&sOfHSntlKe4K<(-`gUfH1u8^9Dh5o^?RNE0CR-1pX0^Mi2qb? zKMdO!Z)7ijq$44{C~}XB_GIIET>cJ+r4DZ$PWBz_dqb={O)HF0y(}+G+oH-W(A8;f zksC##CqT$Xna++<0v@G&D4Xj+}*x;C@t^M>-zq!oU6KwZ6LX zN%-^L%VBFXk1i3(gl@;+#2yJqY>3%HYC3{SvNz^(jH-@~QBpg#G*1;~^hj z02db0vohfL>rVx8mK#`!qq+JYAF-=tS?g??sK@TK{F}tl9>x2S3%l;l`=-q|)o*=zV8jrZ}Y@vdx7HQzL4^BZ}=y$7R zS05cc+tK(sdz8A`Eo?8Ly{)>?w2T0Nn;j*d2VbQG@qOXEGV{fL{cjUoo^UDSZ6baW1Md-cMCEwY+ zWP?8lGo9?O{N)J3TR;9URPCtHwDT}6wwL6Lcd^u-y0v)p)P}e`9v^&Z)Dw^mC9LJN zddbepfedtBN>39Gb0n00WC~Nbj9kiO?y1TpL%2!+tjO8?cG%TvUU*o^C(Dv$$Y(6; z6(8#J>dIu_it@s@1kAuoHWUptZz~uEfHAKOZbX-%kQPqlP5-j)VdRS8bRC@aW_12FaMS#Zo3PjU59vTKtwvYxnS;xX4HPJ0H9 zB+BI83w`<5@+~*wR5#Pg5l1@p=;!yH?`?*v?G;e^eZO|vAkKV7UvWfu0YDZiPBG_p3awhTX~|CoxBKN2~8 zhw6z~=Cd-98@N|jf#HxiF@kZfWI084PHXx^+cn}#_JzLO(BImYj=>xpDzpQyCMC~w zIwM|3PHp(RBy-+Bm{;5^XQ*Bi27kf-b>byC8=7B*rw)G=UaPzpn!3ZuoJ$pIg?4cc zPX3t%`LN)Yo8TK8KZ5z+`zm5rB!L7@22s{G*8HDTgv@tlbHzex z7eRKZ!#cc4EqUqN)FU_vXB3Y`Vy+A8D*l4wEmh6$K&QVI&MUnOp`bM-CoR$h`CZrT zkd>7M+1YpNAklqlR${I4Yy4uPmg_&Z)7&N7T7GY&VofCW zi%vkiIL1~B7Ug1ydc)c=Y;9t(_R;(_1YTr9C)_(a+ri&0?wZ#&ucEuHg~t_`~V z@w&iX*x9rcwl}>G^>~(?he4%FJ4|g8xEs!&i!8p3beMbn7hulyS3yQ@j?p@J(fZl1&Ovg+~o;mo@)7h{5d8y1dN=ViLMy8IuQ<&0$N%4CpL z5qg|^>E$DPFMX@(K#sKNhDW~=Gblw`!e93--wExFZNgzl9@B}lP<>b&wKubLDzqP7 zhwT%@AnMmNFZ_F7+cNl|{vkN6=(~&;C?cCYOYFyU%Pp-f?1xC5O!3-YyEc=^LM<96 z`A{;O9pT1`OQiC2TpV%VI-;psuT@*HvECX$%OSHoHf8G|7=2f48>6cv~ zSV6D7$GanA9RSfkS2%Jolua8Bm0J!)|8N37Aq^3g+bW=X+aV~yJ#{NGXCLZT+s%Ie z=_~7xj61%lbWZ{|FX=>6gdXQE`?R5&ZhjD2qEQPoR3+x7UGGx>nef$YoW<(X;%E-f z9y$|R53dieSEp%jZhQ;c@rc{GrFY^!qt|Gq5csrXWU;m&H^Y&^SelTQVBh&kO7&2v;{brb9fruAR z)mQ!+`{=Sn>8F7phs{(p5SrHaZTR1j{pVxc;#b|)yyKmX7@*+;x7m{}U(>cX!QWQv zD0flDa5%Q$Dwvvkrn_JjSR#=+UAPhYHx1_%dzTP)OpZ-Fj^fxl^tpJ_I*Zu>&!!+| zrErP}7ojY_pA$B5A@f8>3ki`pnbXZ%KXTo}E-&HkO-6PXYodU+8xFQ@gu3p1P}#N} z>VxHQq-_`G_uIl@S(im_img8Ov;{EcqeM-#mCewrO{_q=C{hzKY`kK+JA&-O;VfF<8eku8-C@XBrfhVIU8 zH`$XWkKP&_=xBtdE&tPYTCKU16A6*Pi0s*Le#t$M9?a&vYo$R7B($$|6%xUdX`cQ~ zL+2?Xd#hx4)(yeiQToKM%TFoMMI$Z3tpTkd@`xb%Jo(y$)3O?>I=6Cfc8R;Nqno!=^xsFipvQ;(a?Dq*hFPD#46+9m zYn{xO6_k3^AqoGU)b6c<*MIcvfC)5X1l$7!Wd(5IuRo7x@7?)Z=clDFyMM~O6BEAU zl0-m7=yB?(N6WX|ySAz39)m+ugt9;U?d!0ARdQX88Vgh%Xm)R_+{7ksLogW~L4*hZ zCxnbLxOm9@P>?n(GNB7)n@SCcNPK2OqrZJVB>9XiHi1f#H^iG4ayTs@ShffYj7XgC zilcO8%XSc9OV4upoz8tTtfVPCjG=W>=m?$Bq;>=>oHGOItr%+cV>sNt0k$>0&q$r0 z1QYw-dXH^wfe?zFZdjLuIWO{WsZFzRZ~WLBuYsIW9x;$tLKDA@`9GEcm*~%6zbwA* zC8*eZAkig_S-v?}&V!j3ALqDek>qn>+1OLh8ZwfuaZ{;>2&g^u9s(#IU*A-Bk2Xo! zlqu)z>K%und^P!kSd(0wMC!L<^u(Gu>?r7LCtc2HUehQbC{sOX~ zfSZDaGY!K}%mSf3=O745(9R~yejpO-?(*Z0xJW{${E>{bA1}$>hZ+TGk3I}kLK?oE zmMQyClSStyp}!zR17ADt5aKZUjR=|?(@4XXd&K?#5;&4Je#A-6GSNyVbZm&S$Rp1N z*8w3H^EJ?lVk-f}uoHH+Er+_!J+QOoBmDP(C?mX1N;wySOxGq4qNttV-WOgwG6YeEkp6w7L|Kc)Z=YcHr6Z5TaH?`-8{$w>2L!~8+l!mPZD*|J9us>U55OR;Xk6r^u!UUrYVM)pYZjOej{ zz4$LuusnHa$-6XxQJz4zU+ifM0@ll<*T^M(+s)b9;30Cher5UC(-SR!h@TYnLc6CL zwl^$+I@k>x>)*z2+;8<*9V;^qa^ca=`Y8b8&NvlD9ybS$x|)tLB?}R`9~V8%NqzGC zO@D`0y0Oe5SrcO7Vk+gGdC^>$^SKjs3&2PX^}uI_j-9n=@Q960c&P6qBcKR94kP4S zn?DX&G&!dm66bk7>Fryw6Fz$AOgqc@d1SPYkV_4Rco&5^p@XjS` z5fZs||5*+jU&4FdBQ%5-kSBcQRLCDXh%F9V>so+L#Z+t|Wgs!<4QX>sOHYGKes?uw z73OMQ@3s;nC^=r=Cl5@;BMvI{2mwXtJ%SJ5!98pLu&1^8Cg);;(9zfquif=5P~7&^ zOF=xFz8=~u`7ym{Q+|30OwBtBrsSLfMQOu18JUBw=t(rn`7SO5Z$5~Uw(DVhR zF;=A>6C+6h5hDV3ZD0LVU3dFcZmeG&4Q=rJxBdVH1By4 z1&}*`an=lZryI9q`1gE!f%e_eU5*8AY4RL~>ZZfc*j)kLo;JK{6a(x)HB_~fLv;t9 z183F=cL9T~v~sx(#9`K*Lg$PFGcUggiYJbP85prGEnDy06lG^6{3z`Q0TFx(oYQoq z9$xu?d3YiVIGU%3lD`aSwXpfe@!#l%awgYw{#-+mEq#fyB5O$<9Y zuCU~aYer0YF7aBD91U3O&`Pd;K%S$?Vn(J;ptH59S>6q7C>gOSZMByO|^aZ zi02C23SnqaDAu~vqS>)+q5Vp&JBR^Vh?wbel8Tny&>E{7Ut1EY}V+A zGD>%jmGxB*U`9pgG4`k;^caDAsdCQ+Z&y=XX6KoeUf=T7yQ3nl7{%)U$As#dhDVf! z9W@e$A2kNjv(jPJKR$-emUhi_OcPlCq%)zdVgs~SY;=L5iS`-KaaJMH><+fW`uhJd zBK^4TVMv2qm{>d)3IgMyBz*#m%$pA00ABWjhuowRZ((uP@FRVK>rK)uZZvz+(Kgbi z1NhSvI1Go{cR)*54gTHEh`J+K4>cX-7+q~2=4fT51cIbVi7P+t&X5Z)cKvyCMyN>g z@)17b!dD*#Yk+Pf=#LH2Q^Ss#4I@uD779m{!Nju{fsc;w=|?jA!!)i9e?~rv)c=Dp z@gI+5aF#^4zsrH8kQ>DHf-MdG>w$?Vo5xgE%>RQfA zfEb19<;SF{o2s!07RpGbaCi}$fF_?c3-7JQaIAtT_OILt``Ouh`85A6Yv@rhXzDRA za;gV*yzvfBP81fCNKfa{&OP8X%F%waGC4Dgdl0&y87~Z>SQYexPgEh5<6Z1&kOw81 zqo6c*0;C6Wa1TBMA4r2V58bitgRC@+Qir5Uk>xu9qp_hmGeG~M$-5iNYzS0Bb<198 z_BUV-4D>>Va%lmuBWXQZ3Qv9euF{PT(H3dWH%^GgQKYwwNPL*T!HlUe_EZeSg}=|Z z;zGz7B7?dZCD4}^-VCEmZWgh+)h9vy!Fo8fVL$i3aJfA03lM3{?q9VFj=y1{X0@^wkB?ev*Or#L8}W~O z`$E2fR)=ZXH_)2bJMG!q)|B_)?)6Q?6UM+Dq58B*6*Db=^j+A2cb+HO%jO=PkX9+& zvclfUypjSq_6sM%$YaL~Z6fr7(o6mF_x}Zr6%Aok7L6!|voQX1Mt(NaoSP0EhLwMQ z0yaPYiq7mDqVt}4Y3s_N&eP1sQs)g1KWf%`L;Y$vz2zQC7dg#s)O->2W?8*TO-;cj zl_se)uiilG|Y;9-b`7N`v!$b|vHwLx)7x znL68&@E-4IYJ>mX_Kd5u?frqn3140alNL>P9*5YpbdR^@|E8Tdq(9_L_Bs`z$IyfS zw`bksyIPyBbMt8Jt|RdJz0W875fe9UF`IcavNK@#(PQvuG>kreBBW)|1t~;|p?zgC zxz+4G0$ z*FKW-PE$oakhgv}2DunIZ4`_;c5KLbN<6^L!hD^`KEgkDf4Eit6^7C1<0cr^2{LF5 zSpw*cGyTZ4?d3P%)5o8Nn(e!+do7H-#0N|n58cU44@a<$Yi09odgFev!L+UOVApH% zZmkGLag7!Yl6T1TN$8+90SZTtfMIiwf-=0FEDiU&T?sE*p?CUsD_4}Sgv#DS1V+vo z$IR~C7G`%oDljB6n%>|0_5a}PdoROS0JKe{BXvRFBafW`M_qOttbJ}}4<(BK<1IC~ z1@^zSFz2fIa%8fW>68AQ{IIs-Z}{EF_)9XdOH_m&W&eIyQ}L6Ksg_ZLZ3#8IDxiAj zktl0OjO@|~O_K>}2P5Z_DV=Tpu@oW)@qzAhPMG)s5?*&(7wlQOlkM!8J$cj8eNcdV z?#$^+lpXSnH{psi+mwsWVLy!r55u+>Ux#)7dKTInbwPTh3|g;*WRn+-n9+42IkO{= ze!pCveb?G63YTq{ld(2LbPR4VqhkiTN|f#dFBml(#+|wV_qvP0n~oE=Ik{Ph=$p(|PwWvg%d;*BsH7aY{yNDgw;B!3V_yj8t_!C6B_FX_+zNw&Hbp-0(c z+gj^xae6_d>1fj{YuFK_WKFUib^GbMVo3&(ZMgaumFA|6FRg;k<~FX$n zWjk?=wqO7#7%?1<|K^wBxNm+5sy1$gJs&KC>a9Cr&%0<1iC}IFSr0nX*7Qa8v5kr+hLqHLF6ocX4hjv~4aou4&uN0Ym$Vx9t)>JQuN6K zo+=_Q?rBgu6P;~zp5`?>cEhf>-)EwAc zXvpuxNSQM(oa5@g^j5$B*i{Wj3XUr*#fu13a)W>(bT=r8JZqb(eky~b=%@McNj?a> zKHL^D0#p>$#xbk4rpGJ}_?0is3ndfFpmgd87=Q8<$S%$?TzTnA5C#lWSyAKIAmWMB zXGUW5dOa{{AqC8EpI8Y}1E+?b~r=!M=XYO-z40V~u zhNgLily(jPGg46hgqu>Gj2G?^R5=q30XZIMI8VUvRl~6a_};maj8^_lD0M z3zP7g)*X16i<1?quP~u;++5uZ<*RnXn0XT;szvg>`M9>?r})@+`bx%RuSXHO%N|@@ zec+@QEBB7IdWXy}OiNW0Y%N=;pY!$V^1sMNN{{BSMso!V z);))D%1OIpOK9<7zazwDA=yd$96oClob{ti;GCac0n^T#17&zKQjf`;+DO;L;y>jp zc0mgU)Uir*SMro|B9m#q!zBb@c$uSgC5muLjsb;$4?W$dpEui~O|;#FH?F<4fzK{> z;}bupW2C2k|2)V;6MSMMzUm;4{hc3JFZRuH(i6Ymw-JMQspJL$Md&V2T2+5!SVzD= zojE-bXIW@njJA=?y4$-kGSY5VYGUyKf0;@q4TUrBxEL1Qb`c|SE4y7!2#jg92u8)0 zgOt1J1M9(2Vpa|HP?SHAsUbbLMTFa(Mii1Du2Y8 z+&;71(XHBk2pzHbm4=)M`p%3>FAV?BnCS1~k%M8;4=%uSte+7?E+yk3R`sbz1cqe= zI=f-_lI@mY4aM{9b{A2&=!!ng(jy%DR8m#hfItA>ovgxK7&@I6+Ez11h`s~p=TV7^ zX1>E^J;%uTXDC|ZN+%B$^FseEr1f&v>^XwRPwQ;E&Ghb-y;Qk()_~~aUT%aUbQb{c zZfU$eVm9(a5wGCEwR>HZ*gIM1h2j5&tOH)$r#kxbC?vQyPe8Y-_zAoDn&%#&8q$LyMsZCn3}rB*eaQl2aas*?@NN@(gG(2yd>p< zUt9?@ELy8C)jKMfcG_Qwg}Js1pAlow8_z5=&5=Y0ttWszQp95I{Wf@j>5DzwZo2gH@kX|ym(2^iC;e>K8~-B zlDW%JvE=~Jr82HoBv>SdgZ+lPl2bRAB6NqoZ|LrH^eAD(g)idfS3h-O{EE+DTpHoR8pb!Wlz?bN_7mA+lC6mgS zGmQ1A6aMbd(a?R%$lB#51z{pyVOlhDkl1&p7=-=#4&w2<#haMmPCNS|Xw>LW8>%92 zf4YHT0OwJJ9-(s&wzphOUpo$Y%&`5P&FmI3r-9kiu_VKQ(f}_*&(#a=zY^wr{zS;Y zYYC0AI!fJBQ7oTtAg4F+f?7%7LnpnHzIg`F@imnc0t$f;0-9&H@DLk`!B<#hL=o25 zh*fB&S@WM2;K#YgIbk?weE;U)u~FK$=8K2kp0OfJ)l^vz4F_X`lSedoF{*QG*Oe$>rI@GaXOU&YlI6&X~#0&N`k`N#(avwLN7KkaG$FkUz8thKV!j z=J!P&PnAGzdUXv3wdxW&h0StVd`xr0ao3*YYLC7*J3{&am4AYPxB}e5V1ERU=ibxS zd_`}{l#E*)o?{n>emqv6U)0s*SoU5P<; zx(o{-u5ASI%EV*fm}^hb)*w+`vzF{{nUY^25F-L7e034K@zCjo?`TGk_jmC6RhNt9 z+>%1{V>yT2sMueLPaQ#MscV7#E9J=;yTu6qJb;Ul4{8n>J^T8r0SQ=d|Mg}9f}s~_ zeN*kXB8ez9aSEWa?Tz(pZ5i)G=C-Nm?Rw6=m%(Y@JC|v`C(uze(_P5%t~a*wJi6;* zH6uJLiY{W9edP&!^=*JD{+PukyLw6?keCSMBAK6x?>^mg?v%D-e0RQ3j;vNl&6qBC z8I9Jy{!TP6u*5xRIn5TAt<(&Vy6Fdo~OnU&eQ!@v9MY$LYen zB_0uWcXmNzMWe9zg(mSyi>9LE-r#LQpwm^r&jSbW z^U^`6!++>%PI@G-qyYUoX0!9t+I}zNb-wg<(i&93fPzzX$JspcooX3A5&ZPO}UqhB0Zhc_N@${O)|Y5wA_V?ih$Js8gY$>oB~b#8WY zLtj{}dvYUMj|4V9EY=~Fct0~a#Zi(9Sw?mS%(-d-o6wb#7FX1Jr7-To7}^%8+I|>b z{oymP2?Hht{Gmmpbk3wcm7g|OHNvWYd<3uE{vT*8HwP9&C7IKG5Vfv23(rsmpjW1f4Q@}=7MN<%mG_$x>Do#|@N58sN) zZFCV!Y)qxsu&KV1@uhIuEf?Tm=439D)P^{R$5vNw4r*zptJriv$ju{L(a)%P6S>TZ zCw6Z_l6+-{c6-=Dal>;f;gctc%(>M_8;k6hNS(>^lScW`!*4?uJ4O}K_>&KqK9*SD z4_Gzrhkx?qQWi9Z`l8`bJ&VG~Q+Pi#RM7WmC6iy7$}{w%$U}?mk}1O+d$zZcp!uR3 z$4&Vsdt6k-EJ;OMn(9hiWKO9piqK8n{b@tBqq&_Pq4>$$-`?Qpm}xhf^yEC@#t(Bi-+3YC%rfgtXeulVcxunyzw)1GEeQX`Vf z;-9?;ZM98mLFX1o9TAg>{nLLhjmpA7PI1c~d5@XrnQh)>7gC5>8}4^2d5`nS`Ec*Y z+g+5!gUl?eul$^g%qf*c5xS|ntGn9IcQd*h4%R_u8=kr5yN)p>dUC|<(J=pOcneZy z^6q|+d6rh!`ZVgeao|Z)!z-qN(bo@&iGTM;TVdx1TUhO}j%mH<)w`?U{a?QhL04f( z`?}GISs$BCus?Qxv<;n1aU09&qHseqFf=Om;fKF{13%TR4jekOZ2CwH9#5I#(d#|K z^$_~vbmE!%NQqehF~gRYI<=2(0!q!eIzV1OvTqt&65Fk8bz{DI=VAV&`-QOa)x+m} z89q4X>XW#Mx@Ye}pFXXhWV+fq*aZu+1u`UMZV?8!==aH!Y9!(NSB?>$SadkK3K9#P!FVsbTa#Z>wb@44hwKQIxz;q8HGIruGur zKkwJoejnm0NU;xVj7wF_p;0)#t$lW7T*|a6q^rFfHoUN!eU&OhB33Yotjck5MGO9( zB=U;ijPc#wBqGP*bH=*K+KYLlO$VUyaGgfjc3Te88FyDpBPwAkNdy$33nX^5G-TpC zFw}0w(XSNIcL-O|AwrM#-5ZH7&(RnPHCYok)AE&c?OvlML2V+3I3LA`j#jNmRzRFo zphRt#=*UWRXte6b_=z2aUAQ;j)z+CZLn2n}h`=g0$9{T7)=Tf_!8QBP>s>g=MG%PQ zwxPI>o{`<3PPw?a6kCrqyN+nm+MetoOCbL2YHPeER;&l&bBfSKuWo3nIh!$1BoY#P z=+$^;(~oB6(5Q1iG{)jlu9LrgwuqqR{<%cTDNi%4eRi28TqTo+@y~mvWF%6PEoIq^ z0axC<_c?g;p679&7%dgawt!(4-XM^9Hl9Z!t-8Gv$^5`-yj4r3hzL+W)a-HbhaT-LR(7%`4;ufv{yeaHr*kvNHwgb5d*Wp0yuF-*B@I#ClR(Skhe80BioULU;x9u(ouW4qZ-?Y-!IDyqJR-rg~;xV8=J{ z{W#|H3ost{Yz_kr6+F+r>-{abXsCevvI6!|&uU6Ggx$+a8fqQJYPYkNumv)zV8?&y zR45ubh~1R-)=yr*1to2J8Bt|>%=rH8Td^1Bf7K7(^vGkA^3z2-{dGZ$L`k;&$d*Ge z{^Y4z6iq7>rL1UnzXZR3#68jjH>c9jMc?`%Q0&;vIH7l9Xu`Vv(Ru@W;3&LY!JD4O zFQQ^gPyPZX-{gjoz}h?6(HN^#I%z0m4a#M+d9rRT+m8cIdmCQBz$@r*!Ml;`5fnq) z>q|aDuicA_(>NTP#0a7=@A`!>O?SBljdhxICoG%}bg%dLg)@?HygSYcam?UB&-4b{ z@@O|ar#KG^M&ijBQe1Jo&AyC$akzJQSfb-y7&)$~vOc1W{MaHuMqU=X>NpWn%}(5Q zaH$Y9bajdqWFko3zcMI7NBo!9RgQ2w)6mM%DTlc%PUhG}IOABu+bB&liCa(L?eK9Qry8KYR zy)rJxCMTXe4JIxk!e;hcmc$N~#UFjqx@4>)h~aWOZ3U&k^SDbzRmO0@9ISm3bPqY`2(u>Mdjv^Ta!oI#{E9|#7ACu48-hRll4 z5!L$c4rE)0#5^=`1Pof02t{5I)=vO+ldJLfP{JE^SvI?3ctRk(l7r)%COnW)7h z@tW6o1t&>Fl*q}*-+@u_SO6m4cA991VED{rOAQBWS)A~mrYyV{eeTsKY74kz_73SO z7Cm{M?H_j;BQ6?<7vHbKk%P5;WoaQQn;y<*++&=N&&q8F#oNlKds}}A%s%eKDURm( zp0v^Jv-E0_^5n+1gQjLw%A75%ZYxjXe2UPq^Y*nhpX=C%^lso0kewg$(3p`DkCqmM zL1Rncj5{xeES+Nzzs@RoQ+q=jyE2wf+Q!8RojotWy}g83;`au`ILmBfz60W}a8XA_ zZU)vh}ct?=BvVuosq=m4SELCq|UVYIHVrbNYgysO)S_-gCh58bDZ% zB6I|yqND9JCroMLqWyE)hT6J)Xap$4hv` zP#NqMVDjlRxl}@V?<}1% zRvCkVJ(hx^6@Gx`=Y~N02_vV7{8MD&`Gy}o+VUB>!0Kq>em}O(cFduX@1wK*cyx&9 z?T2p!>S=iGcl82P!dpZ${%dwY@jO=5P59eFjqWa;>s&(e!MR8DJ6v-VV2f3uylkk(HN z*ZzKeNuJJ@PW<6x)G5_=w$F3QlM3G}LdRb23_UY@BN*AXm2uFZd{1n zD_KZ+s;3i0E?%yNZsqAtosjZ`zNGH(M7N`n%*|GbjW=O_E=32Gu^3Q8bC_~57~R&N z2>Dv;S`1=H*Bk9}heQxEt}^Jf9K3H@pJb>?atiBd?CrRU?6xrB&k>7;F2{HNutGlg zRf-D&)|z&xXzg@~_=xo#I^5Fz36WB*K6ZwMACFW%>h>HlC?fsYv(&T-a*T5^zS;wR z{a!>|`XU(%NqItV?Czf7v~MLlw!Xa9a%izBUz|st`#HS)N4JO`2xqb79nI9Rnmy)Q zpm<}4Oc#op4Db)z(cEqr&#*S||5Wd}zmYKn#0QUQ)V+`%j$jjtD5HYSg*}K4w zW5!Uqdc+ce;_;=r&yB#+w9{1C$i8QbOugdZurQ5x^JlMt^nT>#~{<`nIz?rc9g)rVEe6Z+1!#`D|^f{IPJf3BT7HazaYt46rH%#ZmT`?{L=iGwcO|=h<|Rn6|bks--+j@ z2k1hsr`W{ud?6nD%*c_qo*989;yt{6KPy(AG-2e9pLaPpkI_P$ER1%EJGql3$_wL9 znT7#uCJ5yvmR7{?nU=a{XhucCP1@1gc!8UI136F16FQFC!EQRZ4R0=z$*j?oP8|l* zFPbxO=QUxHqZsy9%Gj`({2Z*Cy)HLcCsH0hrFzg=sGI$mQx0n9(uX3E#v+x75;E zI4oQs3>rOzkNgDaTM7f~Chci!Jk3qMft)9$34L>OExWGB%|2o+o#Qm+rS~Ee&6X#B z6K`H+p=1VV5@uQR{yC>QJg$b}A}I~XfFf)$6NHx9W){EQoU-zBc)urMz@Wn67=PXy z+nHl&2Cdw3&=mbwsp~zN1?U|r9*a7LP=q~myFy@7&4h|X-ZB~bHZKrH#@q@<22B4Mg(w5UUQFn)kLgB;O55aU8f# zhaTftRpJ$OxU=nCiwLG+g3=wuZH?x$nL!x8U=rT_jeAWoIu#`zA~q5sThSfGZ4Keu z4#jx)HRJLDiveve20?$0SC3L=KTmu;8$-C?G`@u0=N@hU@vAEVsd9pKh-UnhZib@>>uuE$M*Q?syi4&KSWWS2k6-+hb-yp?DFFDN_c; za?II#8RU4Xq|mi)8$mUpLDgnDu0&l*E7%iI zJ5Pm4jLdsg+bb+h&Sg_|7u7|h;wAQbp-Cs5h1$awbUaJW5FYnB8OH&2*QjI1i}1bC zb%+e2M8QAS;oa~uf?_h_5M9fAKX*D>y+%4*V@i0_oeIq^$(*EaJY46B%qeerHa|Y+ zW;?Ps5YbO14S4ff5d8!qO)t!fi2qe~w9V=bd6K2flqU4L?#{_<0&-Zf)?ly&^I$sq z$`jcA<|&a7pCfoYLyJ9D-dh7$+BaQvr%4DmZACa7K;aq-0qan#&;{WRRyxp|2yE6a*m$&PsWu*g! zlD|rkKEsg2 z=zeo%cEtb46ExNdF9}$a(@GroDraS z7G-#YUxo19ael%@4%&xicTq&%W|r3N4D7cqT?}{^HS}5*3OSvR-v8ViA0@Qd-l6xg zrmKB+uL+R^1*a^b?{00(`^}#9&RvA#r}+qaSu!v7AiH?wxa&?~gNg>1X0jjP`-inG zVv`Xrug^E&R_VaRa{~Olfv^A#JZ`X{37;9`7W3!O%hrvtY8cDjGTY)w$t}j$;6ieI;|E{-pTfGcGu~N6p}i+iX{sb5_2Im@GXjbbYJy1AIe|Ft&QggW{E>H4=nfzmD zP@EoVKGF~>DZ*xYM*dw`kwQ4KlLHE?X5cJp~+TSq_JNDTQs=9zgJ zaL!LI(_OV?Ju`V}y!xD{eED=D^;C0JlL+--KW7t`G&gN+sVj+Nmn2nD&b^yd&2cYm zr@!0P=5H{7$3&W1*<>{DOQ*6IqQ4wP+_x^iIh(7j&#z_`rp}(Izau=T3@7wNn)agW zcdk`4M#pjOgGq~~$K>&DRVxc4ieF^rWx<@Q76@~es4qG(Q#Lo@N2e&x`q3q*sq@Hf zJV_k6DSqZfa{&UlIP-HVw(?A;veGf6tjFg(Ugh(Nq_D7C9+^SaS*nWm)|9=ZC1nY{ zwyX0fH!}rY$U)jEIS!RhLyztOzE^IAN$nmow}+=RE#|ZvB$GQ&cW3yeG&HsJ*Rh^> zp&8N$gJ>3?1H+FR#ivZ?c{8F2L^X6qf8j0XL3VLS^N-_haJ(Q$*m77G;ER`6T8J9> z<**R7^~sB7Kt6`-CB=enSethCESQ4UmFnH0@TgV_2bDE!76rz1CUp6{AEVMGN@_(P z47bA)t*>JfMee?qBW0c94t2JKZ09zp)7BL^gAJKb3bQXip|AUuGNRTdf_L|^J83P=*_}>cueWETP}c)fBzQjTe&mpsw6)2ZyKIsKI=yp zL%~S$H{nOIREhxs#Eqcyrukq5o=qQ#aRZ2ODbN#Lq(c4)v`C_8agmdU1;L6Yb+uD` zc=M=_riA$AB_EdVwhkOuXl1ZCZKJQL-R~b3znYV)q?Fart2;ZUIdv7iNbPtj%Q0U- zlVQpwPUbWd(~*%-3NctpZ9RyI)i4Yg6a$FSi8yePcJg=5hDi(g>*2O_Y^;dP^xn+9 zYCaT@^C+1~6`99v_K@!!oiL&89)fn?vYqV6V5CGLibothM)Z-pUgeIUiPL$FhZ|TE zo#vhT?ym8113bwJN?Ahh4g`xF`wGYMFbup=G6nDYPQgSkjvoV2bQsQH>l~geE-M+R zFj-G)^lA9sdNO0cOyW4-&%0p}%){fEJ`6D8Ch-6~+++Tjs~6yYJRTyU1%Zy}-ISy9 zxI;j0^>lZ1!KY6zbtE~8JV%Q)PUX%dO};~JE_`t(ZG3V`LU$^yx~n~9_s~<;j`R1t(MPr(;^sXnUBvH}*af(40ft z3(Pv`@XBG{qUc&XaB`<4p*Q)v3I|RX#=j+UW#8T236)#yoo#5MALvPLy=0)*w%M@B z_Kmv-)*iaKKf^qVY5M^kvb;GVB9{^1w0V|oMX1!<2<%_6ODvo$7*1%hCw^@aWEVw$ z-+ddt%qkrw0#u&f-19>@o-I zl#b_M2YQk>T4mssmgYn|4uJu_N33l<={SQ0q|wE3W&7pKmyS+F4D=C^IPGKCq1uMJ z1QKwA8kW1x(~xQ+Yj^l7!w7=q^$dkMpZoy`wTBOukgP zJ{F;(JF3G79a*eHOnk{6V8(egh#Z2jErXW~@WqX5jQS{}47S3S-xh)Lr=D|E%!@4Y zlSs7G&Mpsfv0}t5+gs`ezP4e}K`BY-?STNlT}7n`2n1pGM_a|k5Z2k!G6%k8OHPz_ z)`)frNvV=TpdS!uZy?eY2hmK6sWc1{G!&2AI-S|J6T79lsUKPtxyp`~@EZ^9p6Cb! zoUg`CxEA(Ypp+!^Hore*gZH}~G89m!h3-O*pmk;GLVCI_H`(&Z2{Fy)JT{9l&GZHr znnSWRUdfxV2oQ}&3jC5^RsdeIpv7Qrr$)EcHOKmBuV6+CYhyeN2l5Z#wrUEdlq7UK z){wHH0o{)A@=tc#k~uqljZvzG&ZOATsgbPq(5dAO6||4Z7+ocWK%XH%$IASj_GiUg zalbhrj-JILRA*~fLWS$4g>@G?>AF2tf__qiVrh4>Ka-M#-Wdq!uP#dVKI|3wD>fap zUELFR6=7J<%>3+LsXGx1&9=E(w5^UDbyQLa^eqB(x+2mVlFZWwKH0-V??!tOJ+9ar z58*;J6wSA98yBIrKo`ZZcQ!k;2NaAl(p9$JQc%OfO6odAQTHnpXMn`_jo} zF`M&xyMKG5{KBC{mc?>M9hDRUeT;w$Qfr_)81VR7wA(@5ZJp3?u#R7X(#OqmsxF8} zOWgPc;OUb9tw2)0a4%M;!Uw?jDXF1%1^ju=YrFx_yD>JQet$KzHIU|M^E%_l<4(cL zI}+_}kFmXO9xE7OP3U@0V>jifJPLt$AmB;Exax2xQ+XObG-6$PuO0JvtV7p)I8D<5k_Ke_7j8ypYFBIiXlZ{`uTGNxuHpJ zpr1XK@#|3|qAM%SiS{bpMzD(WFjmE-I09)A0y|~oWJ4Zl=oIV6$s8%ZCnvj)|L_)c zcPHM(ELvB)47H4Nd`fPsrlf|BgJa+yppJ5~lka>JI>R&^uD5;Km+pnJ3oxcP&JqKj z%*7gqIS1iIB-ZiV0a~i;;%P_O2`alnAPNLB^6j^YC!R8e$Juve^N?|l?o@BCO1$&u zdPv-Qx#Na`+Cz_GEG2bTG~1+P4Eso(#!Tx-T;;3xL?r6csly>Xhu)PG+O!Z&%`de+ z+S;ldVt&Kb+U$4$BczJ0FYAotPpZ9LtZE0usDKvRC1hI@#woywG{);q{6a@0&|FVX5@zxIxTW2 zOl~xjXaDuEs(BzGP%_y*;AMLh=5wjtd(b~-)G=cR3Ph6W}lp99dMB`1B4ba`D)`&fXSv?*V0zpX2 z&cLH-`Ib-BmsfKG8uN8=@`@9SQT%7{_{6@q%44&DF@S*W$nbbEc5UjVlq7U?e^l{0 zEyj8aJF?<#?~Ts5riz(a2G1-URvfm=KvQJ^eGd+AI*@v^hiY;EAs{$-+=3~VGVJh@#o zXIj)d2t}HCqQCg@#+8}eQ9}<;Tz@~bW^cT!ROKlIY!P6i4mIz=<1k{QMXrwKcBt4` z?))x zJu8Kdd5WXFD~-9(L3y(IUR=k=qU(jqT7%aot5^u2jTkfOU1^HwRz8blgWDb?o>s zS%av(A6kb_uHDYg-pu4q|HDN>2RgeZX2PJ;Nah}jU+>T)W$>Q+hXN&3Oz zRy1l544*mLfCc}GE?U|nGTK9>e}}uf{0WO`q<7CObfzy&Y3K>tlW`U-+v}@}bCF43 zTrEaBbCU{&7Q)c!BY3nGXKS9DB9kgl>C|DiA#V?FIw&q`VfM?UYL^l=$q=C7C6ABe zzjMDZAFopl>1T5E?R;-DG?Z6G+;-M4KCP|@P84Kvirn9bIz6wrHBsd5OF2?fL(fUe z;O^WiX$X`@xH46Gq0oyzap4Red?rQtDi7ml=MJ$x`y1%?!+}poBXV`gl^T5tfw&=1 zhyh{Brr|={l;|~G@wX2mzOHhsjb3Xn-YS@giRK~taum>@DGX7BYfIJv$w_x9yp zmL(C2?{4pe&gPB?t9Z`d^umui4jph(*_=!!PK?lHB-S1y3T3=Twz} zy_+Ht0m?CYWJe|JLH`c>*Ouocr`RLg4ksjhv@MWn5qjB1*p!X(l#+y=hSc-W z)(?JeX5$#t>^=g13PM5mGwCJ*^UE>Xu<4agAqQ_vq!6#{x>S6wet$JoY&ry;t?h33vR{CtImwrfbmhYG1KR#zU15NAiyW9LnP;?aZMyidI^dq37dzJMi@hYGX0 zL{KLXPLKyy?}3SnW~AH+fPU`7MOOy zTxE9e&jD^#H+E1pTBH{L;wA8RbhA-4eAZ}KblZh|l;H)#<>RY?v5@I@>#rPcCVTCxxBrN?^sHh^jmfI zzBQq_!);Vb32QpuqmZ7L;VQmEmM?Wfd#5a+m!xMc*#Qk-Opy1mf5f24Z3j2EJEazJ zaf?$v^Y=1N^s7I38amMFCYChi?4w}j#m7Y?by{>Z9H@c4csz&V%)40t=w&IHSOz2J zjE@-pmd$Bmkx?+L(6T8!PY@ao)kAw@D_&&dJ{U$U*r;csKtK$OL+kc}zthiy9pe8T z+OQv%{%J9s`1LcGrkSi{&KBF~|TCtkd2)yURf^ zwESMn$G+m<({;hLt_=imVStN*uC^}x>44UnW@yIy3_2Rypbf`a|uW;ETf+P=JCxRv!8xGdP`j6yFTv|}LVNnt`y!^?tGIq{d>t@D;gtj_xiG47(nlY8?VP15ekoR`fE zhx`|J^99SFo}I~#{nXYh_kHKIcY`ejv74;R6svaEzytlJ)k6G^X zGDk4c{i~l`3PaKSZWjr#SE1BagM9lZ+C*&#y(^LRU#H`yR!{2*+v<6v#xJB7TUi-+ z4Z@ zgBhXQ)mbNx4@vDQ79i9!@kIdpbo2=mVfB+s*j}>eO7?FTz7HQi^d_8n_ocYs?9)uV z(VB;25?EUe@*50YYuBQ(&=~eWE1s~}i$v+gbKAZQAEakx;66J3o{oFzbOou;gL~@O zKKz~9N$<5Ujm+~w{x4!gL0l*w{Y}q#aR1%oHY}_Fj41*9Rbh0^{Y$WYSYGki5;)<8 z)8Lpdo(MbN+04kjv9dv~1jJMmdb9FM3thpAb+nGnE{J6sa8-VyXG&Q@pI0=rHPwU5 z93~H6mqR}dCj_UJeLM#{=fIF~y z;FRy43wfnfcMOTP$I!(6=`+h?csSA{6h#sp2FaXH4t8Qu;7uoIJ6ts27*E5y*)#L9 zAtN^fGH}m36E$=CHzPZp1+ys}J_y@~w-qvG=R}{DnE_MJI~t~7f6xU{bn;-=hg;GA z#CR`z(U`%m+LND_zRgv}0h%eLXPPXpueLql7l#`MXb(qd)z7ebY}&$pdL@pcv`gHrKmys|ms+s)fpoSu=gN7e|QlqU52w2WOHoo$2IOA`wV z#5AZA=b=Lz%3V(wX<6y6G<2GR_OIFnht~JpML`zR+gVIfSr za4s%xR^ax*&i`-kI{@4&j=x8ztGeEMzw^1<=iY5_0UJyw0n#A7LlQ_x0;EGo2x;X1 zrI7*&p%()NV{9<)HpVu%_j>2+y%&8myYER)I-T^M^wf9Zd_`Mke_LjEb_$qM$+n)- zXnn!IBc>VAar@OF7Mi)j*0Br?C!Xf^Sf)pqZMJ=#sCC|^E@UumHgV`3O(Z)6@J%rV zHz8-K_P}}Ez)h9@^Y?8} zlFXPwjuYW)1SdvoQMLhU^v}P}? z|HaGj%D0|`!)y0KB#z61uP=v{Kfj5I?p-E?Fe^IleV6${I73)7^z0bZn>4nbEz#hd z9p`qQWFE5A^qw}E*c4$;?P#QPCytCkt;{!oCU>m^d&gImp^&g??1(;wC718g|}c!@_~lv z?yPTz576S^#cw_V@BDf#3+=3Slg^7VeGqJY*OT6`X6U&wCdFwk^x3-dc0n50JgK=l z;td^@bwnD8Kr+Tgca`doSz}Cldc$+omiSy70(3F1S~&%(mQP?xUu+j(KUnvJ7BsPX zN^_ zI0jKUYyb1R;Ki^13wHl=6W-h}@!Pu0T@;V-7B6cGN*a#W;%)Oa*nnTX?cBkV?OZ@n zdu|FW_~sQ%liZWU-q3w$A>s+GG7dHtEp`>grzhI{Wwd<@hk%ET4C55mN^yML4IMc9 zZD&jfPY5~*lT(L|I`z@O$oxdD$SZ`QbJ(@`w0MX|g`Mt}ZinVgqy#m9Z-nG-v~VVh zQiXC{U``Pnm)yxkkcVG~(439TzGQx_WFUPg{ymB|(_}YIW^DyCiXjCx;j>VYD+$fA zn7uW5D#V}K(Z>UMMI+a;WT~M{d>Zi60NvA53e#ZO53hxoM9(E*WG_zk=FCNFkS9VY zYiyqLUPx=IATEAakayQ(^245?r$j}4&^pk+*kdGvsDf6Eu% zFdmQ+a+0B|#ZizOtAmgWd(JY3&b^WeFavG5$m2q+c>FcfAq`#oZhdS$bdRDqO02T8 zu^o=S`H@A^MK|jxv<9K!9qL0r=aR`4XWO#c9q+j;6{OD+vy))y53WOIZm)Ri{yZ_z zEnTCjXrPS=(G!KX?MeBm&PkKbEtRIE^?}$2U()26Y{!?Bda12(@u~mxQq=)jEiv*A z$zEF~(3KdN78UJ49xC_-Bp!MY6-$959D-xLA=MwPq-j=bGTU2r+!yK-RNbb)QiWp}^ zrk+un1;sPVpkz)ZWR1yzSdz9eDT4B?z}m3=d$#1?&F4eKlm(GSdWLY7xVJKU^{#F7 z9Rx-z(vpHsXIv%uLV`Zr1w(fQR;YiT5*fpMcZR;>4_u_Us)sQ!Li1@^!(H9zGLbu5 zU+&)+)U_0Zxp3lGy;zM-KS5V_-~zt0y569I5QUHVR&h77J)icXL4t^GW@Tx~#W zjJhK=(88YNh%{}1j=V7mQqiNFnnbuxNJtY(acaN{F+bdkh+!jPLmPdSPIoTuKMR#BCTT!kWc3#U%EN0s-k?k7Rl<>V2k2Pq zHc9d5&%9`M1$qt~&klAr!G}Dm*^VUS#^+FCl!B6@1bm-Y234_W<}12ETK*KUhQ26~ zZ+SZOlLtGp2`5J1?NCR=Z75U~q_a6AM|CGs~@6X3y31&IIg=!#b_^+)0J(OMV{cZtO&FZf7t~ z!$D|1OBZ2VEcAY|q<)ZsVSJ`K1Ej3z*zGz&7}V7WhK|FR8X3DY^*zZn<|rJ%Z)1)<5CQiO-iXv=%MJilq*Fl8jbnB|k8a@iydUQ@$F^ryET zXYQj}zvxUb>XAqLfKWg3rWE6W#CiZ4trns)Gdj+B^d{{j1Z4@q&~ex@qGQ&c?1npn zas*WpEywqEM|2j2K}bXziGWgknNpO_M3kd$I?`rWcen;JDv_a!6yOL*OdG$QNAWd9 z{gN4${nJwt`h;Kp!|Pe-)6q_9zBmxe^tIQvGHk7ZU+oSc3f9|rvJM(q;3Ir0Ojnxl6HE1X@D^lA~_%(>awNVaYE zSSwyVPIBwA(CbsP%21Xe{Y{dcjwhv9O<`t_>fp8Ci@@n(1e^AGeU}=;)|+9TS5;vFR}T zBIZsv_c2Q+qVilh(*>Z!jx{*{qwrue_sdIR+^VT?__e)o25A_=@|IY!E?0*w!W2@K zqyXFjhQqUxwSWPv!4kYRAA+P_!O*3F!gbJ&Q-=pW4#6ZZ;x2Sisx=uY*n>z8Hg*0d zx{2gWDggMOYmhn{JA`7KYnc3=L*~P$w;prItSLn4!mlmI+i7t?9CY~|+YBwI8=>j6 z^|H$Tu7i|-m^(Q~qOYibyvy9=W+H>9cW&~nfX-%_#Dc;J&;81BsJ?YBzOf&JQ|}#N zH-4=t7vrN_!oa$CuP{YKeyFwnP|YuPYH4JXqM|}Nj;^eUJJ8jy*)2Ocrx3|80&?V{P0{vym_yL6FFE>43vpIgGD28@@} zYWGM=z~$>oPkE$8e-4%6_B^!>Uc2{cc;oxepr{>jlH0-CQ7pzc7~S@Nf^ag>4Sk@eABN4tnl;u9 z9!7r(Lbz0uEK5F&c<70Wqo)bm4NzH;>{gRJb%_*!2uSN*9;ceU=b*a@V>j6)BPxoG zT~!@W9pH{|i18Ys{POXz>cNl0Tr{DJPEdMzbcbZ=?r-Oy#!?ghz4?3-Z2ijySpV~v zfSxEK=oleM%89OVS64IVJSGfe#194|H(2FgC{NMsGK-$VsH#o0U1Q#=_~fiGDS7ntyrO~er7=-AJG^fB#DQaYw^r+he+q4(6(;&kiGad0cLIQKy_D3JmY z0q*0R#)*dSz?%1^OQ&>5lSrPhY6>J|Br*}RKa!_lHI*?}-B&U)UTW_}psJ?A3+KtZvy`RsRG{ffD!+)V0`nJEk1Dk&P z2D*|Zi4+e?Lrj}!nepj`BP0g$-kX%4BE9|dx*Q1>`11n5jKp*U_C`FJT zvWfl(n1FHKuXx~ke9Lxy@YG|D5K0$5I0Ku0vleL^lI+tNi)LQu#-L)MqeMRFmAE?8 z>0|500Qs?|*Yuz@RO%26T``iME*SH+v`Rx|d~NzM(5EdZ3qKtjtmY#jiHd%mO3F`m z%BSVqOjlEvwNd{*!|K=hV6RDH&dp~U;Di5-bPG;nS3JKGWSfqJyJ`H>Ry#;#6?}X*xVZaD$IdJW7J^|IY%wwC1-rPr?m@)$(5)#m6TkQD{|N&Fg!R2TOL~n{oRgrP0AOK zWhDY(f1tV3-_wW8d=0drG{Ndkol{7zY7ejb2wuMHKXCs2QxeUbk&;Emgw@mFx<@~0 zF>mwMWRT~07y6gq{@0E0&LgkG5V?q@H+2lYLh+hz z%+ZtVQnbAWMWXUUpxQwZ`Mibz&G(O9+Jg#mfA0wGYJNwCu2gf0J@AvDtojCgw*W{-Zg;Cg++;bI>FM3DGleHk%XZs{! zz=&;UVdKNEB2(uQ1yZ=3`{iXAS&jQ}s8~GC_5Ok6Q+FpMru^4y6Cy|}cI^oxNIT{( z*%K2|pFG;x`g`YhEO%@7Z#lCDhR(MJI?)?BLubFamJd^&DX2I^E+7NpebFt%rM=PO zsY*j76rQpR#hj!0u$D1wM|<6rk_^e#Rzm|Kt8NG=nR6@JQXfK>rK34ji;9Xw$3YmV zL|PWQ5uvprNqoNR@pqv10BW^MiQda)|MK!2v&=!%Jm2y6O%NRy3;8ojiH-94iT}l? zCo-G$ZU46(&hI%Rt#EnuyI${F$miG^pzcTwdskm_&uaFZM{8yxzVGjSb_Yfx%yGTT zNRR3(GmAyYRJ#EX4BZZp%hK~(zHw+vKThRn*E37YboPH<^eLk`(IR9FUG3V&d=zV$ zC$)t%ljXGn@;%3`pb}U(4n>A)QXgsob59^@a*I6PK)|A%J!FRMf8Gc~gG18oaOAv= z#IT|c)vdij*l2aK+qnVG?mU6PQ;v+tWlJ^L(_6C)p+fAt7$be!EqK_zdOBa5Oqym! z(RVZ~{?1i!aLpdr`^lSKcJNZe`iz-Eo&mr$AGbs<-ih zu3pP6J{0F#pl_xY{RJGe3;4#|DEU8^VuXz#KN9V^{hu&eB6=Cz^Iu!jYpW`TnJJlF zcK0fn@yU6RoFj|UB>_CnY0`q<@wbgEvKmvCV`oaPs7B0n@m(uX{LO8mO`Y6U-DrTt-&% zHBzg6PePqlH1bK=EzpeOhZ?Vu0i9;dX;;Z`o4IUlikOx8dZ8;%{(K_ zd!>B}vyg6i2W7Df&vcI3G}Wm?9<*Le@F`2hWo*K*Bu7mW|1sa1D#H@ii;rC;H0 z=TM2PX76d(`hVym10Bc6$*j=cqcwWjJy!$85NCanpSz?t_vpk}Sp4l(u;Ia1ptFG= zUij@BmE}gkGhGG!2zbz_-2XkI!{k;yi|QBoiGzWZDL9+=>Y>{WD8kw&64bZiERW zHdK*lBOB}=!uLx5F?7zz4A9fo1*g#IM`}?9>yHCJ-e|QT$tx5jNWv0q#Ky@;Fb6)bDm5c$imo65Zh2ot_-t44c zEeTmku<{o-GgG(PLl?Lt1`iA5bwQH9x2+qt{b@ah64o|XF77|g*N-orBM|(?<2A7PF{Bf3=JK(F zM^)oYkm8rj`rKkjFGo`^xi6Ba%CZ6!OCcIP!!7>KDqz7+6n}5O)DG)^_L4PJtTgac zWm-ixEd1sQuQ-?D&7k+X@+@ZK?>up>ftZMh6UA|f-9a+dd`_n8oyX@S1x|yhkujUS z5TD3D9YoWd_SzN=ZS&<89nUphMN)$R&KBHd4QN~ID$xeq-|b#FTUT|f{haP_y%@^1 zM-k4I;(zb_=Vn;{i8HVjM8RJKP{{xno|#U!Z25UHx8s9_=Io$a1g5Q}1XelFpM8qy=!fa3LD z^kQgb_H^LG*yJ{P*Vy>ff4R&Y#u;4iJYftDirvvP z!kyb*;DJV)v*XQSG+KGT6VRQhNa_(Fh90Rhm`w*dm+^NZi9(d(Sw-Gt>yOsLtKa({ z_rDF?#3|Slc~^Vy4kbPZI8JUn2(R7yG<4v5x8qo5 zW|)X}+tWTVUt-7VhlivKv56*_f(+XJ>7Wgt$u6fB!vX)Vj878Y;hdl)7`hX1K9*bY2K!j|W4O!tt9u6KYE)yb)a@jd zN?w+#u@E`v7(xZSLHr^YkMy&HSv{zcVqo7EwG&KJ4;$*0;f1sL8(l@lDXzP9aAf zr-JDvF!h#sC=JrSeaj;IbbKFI9s^`jXijeY)vM5S@{;YCV~hgw=2keZMAs=h_R1+N zPP$6$dY7cfRD)a@#-H$Ip9KK6R5sG?b<+0M1yU8S_>*tcBe3HQ&nAMwHru?Y#O_q(2Ife%Xi zg=TJgLQ7G_;-MbVtwnQ^z>sm;%}U{zFb-$liRA zMNyM()(Un#{;F!u%-J;?VAAU8mT}=Ij7)o<-33S9+>hcYxjvP%j_{*qq$}|thCSVZ zQOHP?Z`G;bw&ad#q_C&S`L^-G-9ec=vyGPMpwWD`0mw3iTQc(TCYsaAvY~w87^$dd zlOQ=a1uZL3QXqMbbJh=b^zJ9Nz&^Z1`juv_eZ{AgO}~8|T5DQtMwRm^^6VD_6_-!6VV_wO3LuBY z(;X6UcS74bX>&xdSilhF8A*A2@+}3UcC~ za(i?8SxC!nLakPn;&(xk7i<0~nEP$6q#}UW4T1M7nY6K#k5-kYoXs;83zqht6Z9UX5sD9(q^f ze%d9u3^8S7cH~z)vy$R;QyP5&wxB8K&VOuzXTS6~lLA~oaWuJ;Wf)q~WL_HEE;hsQ zjR!D%=o)zO>;Hm%&+kGD18#vO=e0dfT5E{K=dbx+TRvh;+y%|`QyM?aeE7;9IQ1?n zMoRYV^fxkpoB65vn(sOG^PD-78O52C&CJ7JO5zfJ?QUPgshsu)(r`jY>g&9eoG)!? zx_CeqJ88M)1_E3|=;f-bnKN`Xyiv{*o8Fxfhp;u2DY(($0xofQ)%fuwcs4C_6 z8@ggb(44M9ZR1{4#-gAZ%=Ve-S}3|AJ>1gGt?^VnEd0h5=)sTs{0_9#fhL;U|GEL{ zkD+pxC0QvYv#ohwS_XO3iY<#m*;i83TJga3unQH`j-&7MQDxu~J0{n#=l7guUz8$I z_aqwQjg$M;0bGBiFpa5fK={U^7w*(eDa?X+&wNA$t;?b0ca z1lk-6M0&&xUB#$epHq4eCv6SQT3Yn}x=^Vg)tW`xFKAOH^C()FS`rmEr6>6B_Nax} z0LvQ{tL`8)h)f`$63!KhWxx1aS29N;&ZIM~sFShbmusM_t~GGFAPE)PE;PZ~`<}Hh zbEd(sIGV*K$HA39z7g`OWoGW+*oIgT2D86#87#i@N{B(`JX%uT#N{I(a~0dtg|1dR z(AK|Ofu-^;t`0gTJJ5O4p}wURId`WlQ%CcF6!s3IbVg3pi|LsOJx9l|oJ$)8rn#Jfhk!6}pdb4GVdH>`c& z1*k*2?tn-*=le0v{N~@k1%tg5Sx`RJT5q~>cr#u8gX@3-knl9h-4Z)1D@PX1Du?U- z@F|#Z^)zbF<$~%cQw%Kq{%X5t z0wZ}l*`HYi$>^$7W<-);V3Z+OpsF}z+pojXSRpTBw!F2g znOCavV8x~s)a+N82nzBie{jtneh6il0u;@uV3FQflB~S10yvQg|2&@5g zf)f$((c-kc(<;df`)q=tYnTGrF|q&BkUe0sG7Vgfi56d68fvm?lhkW$B{Z`~sB|pj zPB>d%B33Z74BweAv-mG?*7lzNZimf}z5xTMz0L2oYF<^{><-vDQ~9fh|r zh)7#)n}xYZ;YlocXMScOHe zLwB_*#(?0MkeL2U%|wQA0d-f2Fa}83^*Je7cfV41_V!?dgA|;!CerjJk7uqnB(3#^ zL;i>;*P=(l!JUJaPw~USFP&cn&8HjTFxp%@lkO1nJp2ABXgu8j^S-zgvL_ZOn65g< zAzJ#z-<9z>36;%u|LZ+Cv*S1`t~^G_j&tbyv|Hvt>4GZW2d!rfMShv-MnpzJ*0_Ag zM)S5A*zN$@xL-hpIP&*EQ3ZR@u@LzgAZ59Jv^5{XKs*!~&4?QHk?7QgLY+oN8_{u* zkx4n4T!_?-_~xy5qR4s_NJz{6z}(-W_rO(nph4$x?C4f7ql`rvltZ(QMknnhS(Q1E zfnP37SNO)$dwW6EQ+oG1l(JJ{gJyHJhGKrpDsO1An@TN&kkSm@ z3M_SKDIDf`jkwvXNyCy;5;b}Km527#$v4e{hGR9*aMJ2+&=EZ}SGt-o$j8I4FhAqu z*3;$2t+8W_x8n7XZf`aF&%w4ozm4K(3?f5+m%c2F9sfWKbM_sJpd8)0^1t((nhvUV znJuN6bby~CqR=Nf9T-MU@{@&KUHlerh6W7h`YuX1h`Bq&7W<)hA|L*7=p|2!3t~dA z1(gmDy}Ab`UOR)Cvl(!&Am8#k(0tFC*q!=1b|w04XV-gIBVd5MSkqti?sKTur~k1p z#1UJOS#VphbkTC7QlSWE-zSR7L}ElWZ|=c@hp*^V>&ty;6q6xe(W$l_nhPs_bR$y= zqs^Nqr4)ky%;yT)f8$&0`%i9xw|@Kr97FGN6gkY@WH0OJYUzX%?;K?Q#y9@zH7Qcu zNCr)mkRz5=Kf4(!h?z?jQBDQRMVHXcFDFwI)+)yqae&t<{D_ej|!f z)gx z1r)N88GnN&2Rz3&AQMM3xfijn9e;lpF77)!>S2@S`}{90h0E_<4Jl}v#g7^4o7AyU%|Ssd66p>@r?8qLxrcyS zhVJH7(LJI(EyZQskTo_BR{iuQbf@|TG@omfYIS@tktM5U^Dqnka(dfwNH5ER3cStH z`?D!Mo@tMpfgWS6bqsX%u;4cIu6%CSDLe?&Fs81&5-VMiD!WE+!m~fS2uc@?wf>oj z#)IJSgd`TuCHUBua=2et6cl8HZZt6yPWNHBCaCcuq3Wm~>^XlwJZ*_qak{rS(opl<<-4u~MN4Ym(1W5gGLeiQ^2rdNl?1DPaWlOA%U3Zf8O6>X zWs=zNQ2q-sX;}e`O3}@ZtSO>UNsJW8=slN0+1e&+{qjwlGX&dq$;NyxI)ceVWiQKx zTw)->fHiwhM{#soQ3li;plF5GLDkwCs!QKl5=O|C$0h!e zP0b)U_>(rR*2La{gJ?6<+COjPw>XwjX|@&&bH^4Z#bigZ_L6U}WKr6f_}vAdj+O}% zr=yRA4h$UBe6|rf>f0SKbBO^+^|Lo{i%42}(Z$A#(fJE$UNdGc%YlPnZ7N}t-_zsJ zL!&iuWFsQ9uVLpyB4LN)m@!87S+8zYD5V`FNnoyV5p!|_Y@!H_WT!4MX!@Rvp?5RK zMyN!Ic`?si(3kE=+MkN9FWzv#ffd1SUee((owM)^rcyjeV>PfdOH+1PV zlz_}{5xQnwc-NJvlqH4xC5Gbih~Wtp-YskEn20l8Z`h&B<5W7&iFUq<~6>qC(R%CI2fXbamU}ulOip;{^NQhX+HjY5P z2_S70232c{aN}05wT)0$@r$1T05`WuL_t)|ul5aHZ!xMr@T3j95I5}Azqt)&eReUv zv7?fe7uSRQ_DY`GW`24hw)+XxoJNMBY?Cg5!6*K(4Bzk|_w1-l1}`|4kul1jR>BTv z?w&7u(cSLeXLm4i%a@E}-{rdKa9goNq0iuKlH#~!N5_gFEFLUm@rLdJcq_9CZ-2G! ztQ?!sgPOcsG$tXAMSU95;4x0E>6LdW56;@jafq5k&U@JAC%s9kDHBL}lsuFeLgliF zFlOmQ=xXd>j%dzoJ&wv<7?{KX(XzW%M~qh%*V>mOy^aDDsaGza2pJVQn*GBB5_XPh z;r8{t?IUf`b=7jWYn&p_m7ojPU7G(4Skkck_kB|#w9!LLUcvT4?yhSpuUAWTn7}J9wF>*?i%s2H$?7oBXn@e zol*oR@Gaau;fet$E&(Y>QdrgUMOAQY{Xx{$kA*69jmt;NmEgueG0*=H4*P>Q`zRQ? zhv?2u&i>51O*H{;mmZyzpS;P?sV#cvCKJNGZf&ODO69lncyJ?zo?e!X!+elMRHJ}6Oe5aKPJqX=fh*Dr zesFhK?il)YS}=4EvAij#?C`e^ZQVCuHc$1iDz6rg!W+64(QYX2mtFx4TziV zbvJiIZ%5CF8*PMLC|ftHAGH{bTh_Q-^hbZjCG%BQVv#Q4nACiD4u%H?A%AKykh0>0 z)nuw>wM1~Xr{u(#emf~C-4);0yW1gGpHPa^VMs4e&-)m=M!2h0Vku`|fx8us>{Kk? zc&wsb74^Ci&_xF*L#7IYiVfHu{{Vpski1#T_Q~pZX4{M&_%1V z{)pq)@>Z9-`gcb@=$Fi?lnztwwLub>bGuIgIi*^B_e$m_SRN+F%$)X2wik8%uwvTx z+-p^oQX(K2x(@SUb$01-)Xv1ZppJ3KfHy=^^UmYr$X@LK(LEppdsO|I)58sXeS z2cW{J3N=p_s?FQN2)A(VDy_=4i!Bb1G)6CIxyx9~2mRbB#i;G>iO|*zd!OFHZs|Ns zt*gXkF_V+h?sJt>e69`w!O+#=rzw$}9&AHI<7zBN1?YW@2Jzkpu!V0<=C!rE3o3GP%CF##|hJ87+nTF!u>qMQ^+fl^?m&h}X(4o1{mXR^GNCAiKXUtK;;cFWc zc{XS=W9Y=|FyJMQ>b!qR&HGaCW01;zbEWJ_?*yGw=WB@2_GsT*SJ=C#zS43{_orXa zRsOjCqkJafYyRe=W3t53p;@0>>gm7~^mTyF9umgz z)Aw^Snu4CJbzLsQ7FjbtDepT1mDRD4pZn=2XNF%x*^}BSYh)e5YEC5z*Aay9RQ!}` zd|GzcheBvsu-sB*c8)r!;c)9!PCmO9xPG~*Wh8!As!Cux6G-j((5(1$0{DK+eSj!; z2uR2f(xy~r$_h-;{_Kk5v}jTq1ab{(#_85E&-TwIzJNp&@^wn*h>*DK?dO+_tLYi* z3Qo`v{mJijOd#y*{<2$P@8o_A>o&;@v+>n}s@UxTL8ZrscsHw<{3=}rQ}LcM+u+hUQoX z{;jc0!?J9D#`{R2gnOARWAbmn+-r>B+3nD@aP!>W|*WIu4E&Zkwi+tP>el0%Low{HWOZQq{IZuMp7y zlZHdiZKpycPQee}PPb!pr`;0$lV7&Q_poL5I*RLOoT1Vk0^adv!&f4hI(at?3Ki!C z;NutY9i+wi{?C;+qf)Ph`_grNF_QdX8W>3G5IWObZ1V(>n_DnJ)y;W#Sn9lalPil< zUvCC}8~i|?DbZiGoo=kxczzbrOL`k!l-I?78H{(e`tgU#;e#W|w|GVhpn3=-!P6(} z>lE_O2XqxFR9ENiv)%*Qf47CtLOt*X9p|u~M~wmhwfeu2#g{887Hvh>D9SG~F5%2a zu6%^^qmk*KDMtY>pP)z9wApY;tcxQEDeq;1Dhk0BW)LAHLEfgraBTs!yDs{d|Dvvj zMj4}VQ5uz2A6sO}#Df~a?Qw~WENy2HoVMD0IV`-Lsh}Zguo4%(puz)H%kuMfSte|7 z314STo;kCQLRNSh6xDiN$ReTTO8GgEZ1KXx90-bX7H1I5bsa!7Z6`?gxl}(E&H?$iK3icH%2{VHMWxQ$~tnutg1&SPfIiNpfouWZKDPIGZnxDIC$E{&EG9t zWNWu^dR!`7+|Cs`dUPb-?ylP5XP1*3i2fYQbSy3njwWTH#!TJuAnY#bfts?s*>iLq z<20q&GhTgLX(a^{!^A51VP4B?>4P4psNUgUGIab=Iz4FFLCMzne4=x5eduPhTIjHp?i$M2_F#wdCd zjMhwh><+`w-*h>2JrYq-k5kwCMo0M=FIy~Jzemy z8DsIGlQQlSa?oHMC&QFO^bRr8r}^L_U`(o%1NRuEZ$-_sQJ_4VGN+h}#48b@85F44LybEcuOq}m{UHo}%_fW2~NUY>f|%`71F6BF2pCxwo|VnO@g`Xi*OxYF_} zzs!K&0~VXJeyl#vk_(qp?V4iMz^1#S_9K_?T$q!+SWGsBUj1#`&QEj9CClN#uS`A% z<-SS%CY=9d)#ZR?XoPmGU92#I3*V(%;K|h=VWmxrs6;Dou98UO zrPw^e45a`$z%Y*^yd`osa=ADA`&F7tw0jLgff}-4Tda3&Ar2Xr_Y#tJ2={~}^vb75 z29eC@3OlvXozIfADB|d_Cu>e^X|ed>hc`063L7bK-=!V*#nD;#VyB767(}z+ZLv+i zU6^3mxR|jT;f#ZNUL&9Hj^e+snwS|gvPcy8S?gF2pLC^gqU!{jTPe{c`oJI{BZ^2d zZq4RUgLm_cr$Ts7A^xS`K?Pw_EUYIwR!GrH*+6~*yn zdjzL;jA`w8cdV;!>A_v!KH~Jk81T9vYdi#QO=A)O>#eI?wH{94rJg%8w*a&ZOMj0kROXb6mjK-iVfQnC00lJph7{+83?BIVt0 zD6pcgq=ihfxt2Og9x8TyU6XW(v zdjY%H+Hi7~g&Y?6Sw4wC1k#Ymuy#f9W^(?oxGE&X1UY)JA}>obXrY=EuS7!w(H8;u zDT}ggX7DG$nG}U8O?lB6pJJ&?R>-L=6goJ?S zaGh_OT*W3U2l}(H}-mMlCG*$tKuf>O_x9y*@nFZQxf&g zXNCPw_v+f4crMnJ$?T149}`uFolrP67u`E&exTm0;|%RR8;6(j9!4gja*s?6hKzZg zuU%l)JXFW|0J<-SYIOZAYp3Lx6Fq+dw$UO!lsU1^Zj!Ag!746`q>YO%B_p^J% zNtrK^*qTe=!3!^}yQ>A$n{Sp~X{aJt!1j-BEL1}G2u=hX7$&Iu3n8UH*lXI2ec}_0 zPLG(y%gyVvwo`h$VJ8BaX;Jagq35;^(v8_r5YgXmP4>TDJM%=_HLu>Kzq!^|-(_U1 zTN_I97bK@W!I(NDR;B_M``te54@A`_R3ngaRXUHY8(PX*%$0PTeq0*>as|VhjDFMc zBqmo8)%P-7C7f2;+EG9pY3%I+wQ=1cIp13*ww$4j0J90T` zB5n$la6u08j*c$VBojFbBZGxVh7lL%-Hwg%6Wwj~GN;IZ-`dCYkn3eg+je@f;ZrXD& zNi@OSGx0b_K6DuzopBH{J}so*0)_J@O%xW62xJ+rk9GNtOjZ-ai`GP)e?S8E1ECT^ zcJz^6UIuw5^JlwCbnP`Na5p`tH)1)CRcQs<4(&Z`V1heIQw4BZ$QalqIcA&JE2X_Q zrt-Dwy1l@P1#sE2Z1wFglAKXLcxd}A0XizOl;^@J8AJB3k)ocuA_H00Qwt{42I^GV zCcgHvb0(exwL)$O0J79O=NkFqheiJisXQv^bql0vg|Y5jPPebCN@P-s@f^{o1+*l~ zNbAZfs=2ORW}CkzZ~lqnj_AWx#KR;!HfS*(c9COG6s4v4qv-Q6TI6Kw3W$&Jt3ZXa zKH#pjZiZ3+#Fb1u1PcN}?0Mg;jj`^oCVBLv^^|jD=qQ)6-FK~!PI^qq6dF?L{2{tf z`G@_MwJoxN^0$BNb}NGXt8%nr`3wr4^Re;jx- z8>w)b(TP9N;7~>T3K^^!LG53v%XF)ZuGy@O#ke9{Nx-OmEkJhV6{H)f?J7{ol_rlm zbCxBh(M&)GcQ%aAx=nXS4np_&^be$+DTeN*3M*ek($({{);8qsynwmd^*x_}u_6#k z_Rj^GV1ozH?YFWroszl}T5k#P5u~^LhvN5Ae!qCULXjnA-2i zLhe=WBE8DbMbsm`udbZ(at7}7lG5X6_eQDRGd<%Y78=6?S1xp~SzDvoe2=TCLcqKl zX-xW5H6K=ye)}6~soeez2s&1HF&wD>wFB=`FW6qW4Eu0``?!+Lcm#hzoUmTQ*l;7+ zPaBTj*CVfe&4z&>5d}}R0{>QI$L!AScj8o~ckkrBKT0#9d-Hn* zc0r+|)}wQ@A7#=usJofSQ)Oq1SVl7>f*ywznY;;ec`$<%Lo(htda;b}8Tond0Py?N zTy*sJFh01-uVbZ6@eNJjtRm;HIk_snx;0U^(xrI5wM91k89zkVt2EH&&^SfhT95>X zQ8tVZ#^EXq1)Q4=E!DXX)xu)(eEb$>V0G)pvL`l{MpE~Q4<>XTLHDJ4wapp7#YI3N zM6EyXj>PqNgJqhl2LIn-tXa4?d_3K4o>UbRiAwFDr0J(Z%@#d9Qj<9sYA?#bVQPCx zAfLBW?-l5*>K*2bcu-VSB1X~rVFuGpB(-Fno*Y8AzSo1j@vyZ)C5plFEWizKsoL5Ch_n6jrI6*y{-Gaz2Qc9|3qHgdVwxaD3gwWTw?3yS5>H~ zg^`(xFPbO>{wH%J&2HJ$?o-qxzYPiX4rO$Iy&@t+H~PAiQPe~^B|nWJ>jcXE15ymR zSLD?|`;iz(1t7Y4!BE_D-9(i=ic?vW+Z6u2mML5P!g%_yT-1{FCvx89L>*IGB9&Q` z1P|An-y5ZAvrEQLuOn)qY49{AO!zOUcFj6%x2Mjgh{8 ze}fowO<-&CT(WeP0Gbg!1B)8EWYy+d9j2;0S3=IjRetR4u+HmlpZjdZti|fU|8^9u*MHgf5Q33PhqBjhuAbu*E8Sb%|k(QpGxWK6g6QwOs6G4!!r2LIW4#q?37^<*no0lZ*o4WB{h#3 zGl!;5*c9sx&So%AET+6#!b&f>tBfkh?-&f_K2-4iX*rjCEE>bb=*piuOjkCU2tW`Cl_M0$VZHqgeMt;(sS zVE>D7QM+gQkB%c#Rf;i@+Y_rnl5q|k#JR4bNIjPG!_r(2vFn;$GRPTkFl7Z_BEBOZ z(yn>YG?ZgRX?5+{H2K0H$0rdUNd3z~j)92CJ(0DM(63myPjIoEsIm?Ndf~ox&NC`Y0DJxP=7zB^x z`df{M1Gw9w>-8uG#__0*I!Y0RGk+dU#OW5Lx!?RcJ5VFF2h`4663{iqHWmI6lnjZ5lxS_lfN<8K{=;Vjc6_(Plsn(u2?<`=^tZ9VYH;q z&qmpkD45vfDO>}j>L};^S(S)N5Bcsr*v;X~)?X66!Hx!?rRqsy4F{NX#7>)K`u=RK z{3FEOJubYBwWzdhC@6w7A-0`3&1q%F93MOF;46e@R(=_Z*MnvRJu&ormQZ)%%@<)S z{gN0OoH>=P#uu_NYngG=^<3=JzU-{-n_?pCfI12cfP;6 zNWdCHIMp*qImaNPt~$}S-_|CKhzOvFidVeJDEQZHbol2z(^A`uvrNmo$cl{ah=V~0 zMfRls1(JE~+oi&YI(}c9>$K@-x9|TlRNLDg#|ov_A5#4SIP5%6G_1I-W6-GRu~fQi zhndv*@x<@xxJset6WJczJtdcg0s9BJ0L=8c1eWI3n z;VE%9h=(a6#JbkvVh$RFPuGi^R?rj@hlqte?V1(W`o9Q`h>kowJQ5cr7ZwMb+E11-r}V_({x=&~PDncW5_xTs zDy1~{-TYcVjxQK*72CXso=fm7YKI%giodq<~nHcmjmUOX~^M*IyBiSbQlr%_e6lqXtg$wbbF2q_#D6(qw7fJ(&JF*E ztVj>Met{N6NX-VUIK>GHg)rpjl|Nj|=Z<%0*EpOj z-N=L*SeKR{9VgsBDVO;0xRUV)iC6{n<@}aR_~Fn7d?lTxIaYfBnNyju$}s)EIEbm` zXL#DIO{q&oRl4n4^2H%=PNRRpZ#_I`WxW&9C^N=06OZJz}Z-*dNP zc}Yo8++f~`aPh&-@1-k;eQd?K`it4q=m>F^Vo|)(2fp9ZiVvsD6~}Kb{1ohq$nsYH zo!RFo@3lccuoYfBWYr%`m(vWZcp?QbSxt?1oE^)*Ui8v$Dy#u~go{)KU))0OITb%M2p^@Yq=Nqxa)Sq|;EgSrEPff)AyD7e=Po-m zU1)(5cm2VaW>88@HF|`N|L^()Blvlocn3rq9iGBWKSw?pF8AbshRKx(WMhB^rPt!naesz))Y*&fj%Lh|ApQdfbW$H1i40`U)8e)8Q z7FeSo0H=XEAKzfb#4Yyy7oe|q{24P!0d?2zszlX9pp5DL`({J zB(9)N3Rj)o-iJA^Z)`tg({-3#qdjFTWkafSpmb(<>jKgfmxSXur@moKA@try?SX`g z>N{o3P8>+M!x~HczpJ4k7oVF6C7~Arfjn;+dN4_~d9b(-6llL?&gaEBV&T)uu;qK0 z0L6kZ0D5W7AYd&;Ck%JQ;K-Ss_u~Dz7WeX+qt7KaD7oTMA=mL+_f%wqINc@Hd~_0YW5GNpt~U}O`5+W>D^WM zj)A83w_lR7*{f+ZVuN!#v3Xpay<=DhUg3eBV$UeO!aw}YE&c|zSFF*uS*dc0V;^%j z?@J=_A@$HoX{u2>q-~uXCGHc!+61-f3<``&4Ui+MP`vrnb(p|y-mG3uPGr)i0HT_o znT30F7$N-)UuO@toRbn_q|dnrj#(nf2>0Y|1`6#D(n7sk$!B-_b!s*m9hGZ}|(5 zr4kaPCADwfJ*0CwuDoO*+`2(!3pCN0qjOs_SFv|tdUKFcFw<19(tA?}IX-59V;aWb z$MogFo7%wg1(E^0@9mh$lF~lA?wuv1WJ5x3wuzTT_F?a$m>$W)M`9|zaS=v{vzU8s zj9mJ5(2z&(x_LQ&QH6o~Vr|q;0T%ZN`+q zXmj37BQvuc4y{u-K}x2^Rq%H>v11YBHI zk$QmfSR{<3;5Yx`@aW$_?gsk>J>yekeZ3U1rIn!l=U~G;spq;&QhX{XI&k$Dn3r3p z{Kn5HYC%2Bya&d$PkIjQtI3?LdS_Gq+i6l9q6TD{(~nvU^XE~FOy1QkMSn4554|q_ zl;)o^#2LoZ*i2F?oqC&e#<+L{!7)AFh@a0Z^~m53A1}HYdlWW-6AO2#dPy1$GJH6N z;^n{u)Vn;oIP3F8^0s)VKgxI;&ccNnkIOC)a}X^S=ZrMZ%=)O%;{&cU&F%znd(Fvw&vt$Xa%Wp2w^k>Vn<&9R>58b7X_&<^*|NY6 zLJhX=?&OoHbnz$Sj+|SRO*3h4I%!;XT71sl9|phW7^*1SYab-{?|c1|G?Q4iBc>YE zfbGo^Blcq;;!gW1|CRo09R#Ia3>BFCi#e-rouChk`(K__7w*9@vjbH4-69b({?6L^ zXa_VI^wS7oH{91f=WQY=jLc0?(N6q#Pf8172`vPe&(A01wP}r$_kA$0bC%i>g!!@c z3UT56p>M@QjT>Qv6+oLjFG4nrbIVEBgIN^gB?cnOAbkf8rt{1o6i<`+zyY=+(6JwK z)z@d!Qc$ljv4Zi^B2dDH>~L(u zP9VGju9tJ>`8rKq&{(gpX3tYD|MPdO4P2ERDU(2-PHNtnXW=nclyg-3IW zYHBbYDAI=VBY0)#r8}%Wh!FyQ7X;41BSJZXM& zZQQZp@A1>(99^n80;vo?<#LYQcIk#S=y}GC=sEK#N^Ik@4Wj^q#f?yA?t&oq#}v`g z<{YHBRZb^+MG8VMZ)*eJ8SaYUive25qNTr=Oe9p$Q?NU@Eto}bepc1HTC}UEW5A;S zD*%#$+*`B4_%ipue%-EKUHvV9ZMptWcC8T546V#_F&!GV+*=YiEqA^9=KRyA_y8r> z<=T2-hA0b~Xa7Fm<&`2_rZ^_ROjQtZw(O|~8YMGGBr@hDE2o6vxDxLHQ~G=P{;(T4MX6x)bg=vPyMWt^Yv8H$i4P8kFvM98<`hF1FxwRM3+LXh9v(Tr4pMl8;BV)@qloVtSzjz>oYcBBWB>!&dms0CHqx&TB7T~BTorO?lR?g7%>nQ3foCPU*8W?yz)CU zaa^gv`oSRLY?@W?%XLO=c7i|9x>NBqvan^Gd!dxo!q+tJw~HAS<$YDUHi4WQ z3*!6)pb9+V^0>2ToXgTZmwh zx-D!hBVGbkiKo3@+%c1#_o`W2+}@%89p(^JjSb#ZVJuSO=7}WZ$Sue&KomMhMTD<9 z%NY!*y7g>cCcXZ^gVp{wLu&<(_9NSlRdK!zM=xIm#;(epHC%bMVL+99F0Is96iGVH z>*!pwxz-_kRldm>H^u}X693-D+TTu&!cOcG%9`V>0%)-`q^G9=l#X4FeT9u^#~pbB zk?;Ly;}3izj85Z^&c+JFb*3iK^ZzXJPpq;}@8%AK*p?Jz;QQ{0%CIbY2W_hg%&u_U zwRXehzQ^GT@n#Tj6I25H+iaeG@|P(tlAz39)#?~gp*ThM)+t@SPp{=pOC@JKY^ZL5 z??}qiJ6})XNSt5Ps$FT|h?nf$mgaJBLc367iaoXQ=X39(T4^3CGda?0xO*-%8Cj3C zk;NAjfRo{yX&IP}nn^ITGf(1hbXjxd*$2jUxS#ZcaBnH(%x=xYe(HZl3%uPcQ||QF zK=W^p9c-$nyDTucJ?bE#1T|_W{enI`?*3qub<|=Umgm;aN&Xt+gB!krDLkc+Ms$K0 zL=@ay@C z{il(5AC+)038=>sS9 zAjBAKm)7QG0hN`V0ekDu=AZZPG`3%x)98OL>+o^K&}f-aZjynRNPa)6HxbnSE4OONiAg@YpHHT#dBfg>hA#eN6qI-XG^|_* z!N2FO!7?6a##bQoIXCY)?stIT#-mV>gEcR?vh+?B<69Jl2E^(kUk>YEE~*_3*!n@F zD;{kzniPlMLLjY`fbH%EYCrbih|p2ZlgMk z>@ZfdT3wJnN{4a-_pdtusi{%{fZ;dvxjSNH{Pj)1jy$49SlJZa%uY4+B1fzrm~>5K zvgdinYVlZ)VSsm|lMlby`H@N(!}&0TBiC&+L?JC%=K$4^Wtk-1q3FZhg!TQZ3PP4N z*M=-{p4Y}N@U6VNM@9qB_3u1wMMX~h67+T13BmT}>j^oKL?0u%7+NNxCptHeI2Ha$ zyl4Uvmvl`S3gk0QYDY@>gW1?_pLb)yfs_D zDQhJR8BTgklr~WHQuXY>w=NNv^}Mo{@{#w3Q7752P>&_3$R2k58?D{Qbu0Q%VE{@A zU&*k2!5`e;$GDxEFi=q;W4-fj*Vkq#U?YWr1>^ZImUY3@mg@*Xe7QaKD#f|AY$=JV zA4*O%MP(%6&0O6~&TuaE=QsczH}Um&JyC%Y9&n&YYi&@@Lke9-h(ffEN?XpCJxLTV zlg3R>m%kBXzXw}vn!*=dDZKvirBE|N0o+%evSVC8fRFNh0$AyHmK2o#o5+8S-FHa$ zxpDwZzH27+`J1=k*p8&Y(LSf+Lw1E+LRazIsR8%z?g@P0#bj!_vBFc`_p=M7ZZDL! zGUvk4fc)R`JWN138D5Nps0CPNMoMpb2|6k556Ic}H)#n;y8g{U`p-cCXn4#rZ`Hl3 zm+w5eM~eJc41RM285n5KzZQa_5q6AsaBue$)PCvFx{s1uYXJE3mz@$0z@CDWHAf6L z&_#oW>5KoGnLW=YaCrZhvd00K-lk6~B=xPl;4Um)pJ8fW%(wWkq{vvdtc6ahMoNf0 ze+s-oI=+T%B84Oo$?!L&WNq>a0C|i#_O?ZvHbdxDeLKB%t4e2CHmxQJK_}<%VT5y5jy>UKZXW6n# z(GO|Z=AfP=%ZZg#j#fUTI2$8;MmBh`+RSWE+elWy=&wvy3PYhEoF!cz@{JF$eFG87 z+I8L1Id0jx)KdPFWEUQyv(?*Iq{~W-Bwu*9eO)c@CBN&dJGQT{K01q@)7}yMP+Fv} zwHbc8NLx?Wp5BeKNo?X2>ZE_Ru$#xm6EL#;#wcr_xVq8bdFug$_=_8cosZw@|}}UpUK|{ZX!ReQ8>N z4$3(mPNa6w5nK*4;AOUl?8h50`R$scdw>E1fel=j&?}y>HXLL(>QlE_9<3akLfm$_ z6k&}`?W8_rX)DUh85aEixe}fc2X@CAU~Cx%r@{lBGPVc&udUCG!veQk9NYp!5O$Eq z!Y6r&99Mxd@F&a=yd&oqff@#QAX1+J)xpAxCY`M)uZzj>l%bC40=V}(nX}*jNZ!1z zn`YX+c4sWi7bfZbSBLgOOUIWXgX!wpDDdf=T?;HMylOZ0WjoGAm-;jgg>?$rd+9_i zF(^43OG&P6Y$FQP2t>D|4-n(^>VEc;Ec6rOi4Jv=vLQS?3>fWzJQNKOs4h2R8{$Vp zmHJ}+XNbYe&I;8dg`a?nf9vrfI&2pm8JI3^wvB_$k42s^RFauq!^L%Knsyl|f6?;8 zCu|^Z_P~y-JLY>YHn`pvEYV0LSy^-LRLo7gQl& zXgQo_YRL_+W1Mti4`pPLd#d**^5f5Bu)9xmXZBxa&aWQ$@R!l+H@srXdP9z*!~PEv zOeFjtbi{2HZ1#z=x~7BeQ{DI&n)!9LVdD+>iI6d+^0sufmC4WZ+f#KJ&^52=I9K5G zZTO{nWSmskCK`J!U--k%A~rJorMy4+V+JVp4am&Rrp>;N!lgio2lhtv~nX&VU9}D%$0s-%+=#743B~Xt)rne&9GXkPU}X=fiKwh z4+**YOC<{n;U;1vWvlP&7x3KH5)?GP9P~9711_-i(uLsHe^^M49j%F`CBrJ>7!w^{ zt`rk3n2JjH4$5+VP<}$r!%{lHmee?C&-W)(UKw5T-!w>uFm~Yi!sO@pntk6WtM1$w zc|XrO8Se`N)wwTh8&K~P>(K8&Kfo}VdqJq4QUC26E?<-0&zB`B!#Pw`LYag)Y}FzY z!G9AYBzQ3t+dsj?ZnF09nFc1*HPZAU;44kh2x4*kkVBf@fC23yb ThRq}(z@LnSqIj*SQSko&z>osQ literal 0 HcmV?d00001 diff --git a/libafl_wizard/new_questions.toml b/libafl_wizard/new_questions.toml new file mode 100644 index 0000000000..677c9e7ee2 --- /dev/null +++ b/libafl_wizard/new_questions.toml @@ -0,0 +1,294 @@ +[[question]] +id = "intro" +title = "libafl_wizard: a tool to generate Libafl-based fuzzers." +content = """ +Before starting, make sure that you know your target very well. Choosing the right components to build a fuzzer depends on the details of the +implementation of your target. + +Knowing what you want before building a fuzzer can be extremely helpful when selecting the components that best fit your options and the +restrictions of the environment. + +Details such as: + *Having the source code of the target. + *Implementing a harness function to fuzz your target. + *Knowing the expected input by the target. + *Providing an initial set of inputs. + *The size of the target and the availability of memory. + *The possibility of memory corruption. + +Can be helpful during this process. +""" +answers = [ "Next" ] +next = [ "source code" ] +code = [] +previous = 0 +skip = false + +[[question]] +id = "source code" +title = "Do you have the target's source code?" +content = """ +Having the target's source code is interesting for performance. With the source code in hands, we can instrument the target, that is, +place coverage information to help our fuzzer identify new points of execution. + +Without instrumentation on the source, we have to rely on third-party applications to provide this infromation for our fuzzer, +such as QEMU, FRIDA or Tiny Inst. Note that QEMU only supports Linux. +""" +answers = [ "Yes", "No" ] +next = [ "harness", "" ] +code = [] +previous = 0 +skip = false + +[[question]] +id = "harness" +title = "Can you provide a harness function?" +content = """ +Providing a harness also has an impact on performance, for it allows in-process fuzzing. +""" +answers = [ "Yes", "No" ] +next = [ "special algorithm" ] +code = [ +""" +""", +""" +const MAP_SIZE: usize = 65536; + +let mut shmem = shmem_provider.new_shmem(MAP_SIZE).unwrap(); +shmem.write_to_env("__AFL_SHM_ID").unwrap(); +let shmem_buf = shmem.as_mut_slice(); +""" ] +previous = 0 +skip = false + +[[question]] +id = "special algorithm" +title = "Do you want to use some special algorithm to select and update testcases from the corpus?" +content = """ +Usually, a testcase that reaches a new execution point or achieves the desired objective, e.g. a crash on the target, are deemed interesting, +stored for later use and then selected using a determined policy. However, we can select which testcases to use based on variable aspects: for +instance, we can prioritize testacases that are smaller in size and take less time to execute (following a minimization policy). + +There are many algorithms supported by Libafl to choose, for more information, please read the libafl documentation on Schedulers and Stages. +""" +answers = [ "Yes", "No" ] +next = [ "algorithm options", "special input" ] +code = [ +""" +""", +""" +let scheduler = QueueScheduler::new(); + +let mut stages = tuple_list!(StdMutationalStage::new(mutator)); +""" ] +previous = 0 +skip = false + +[[question]] +id = "algorithm options" +title = "Which of the following options would you like to use?" +content = """ +(maybe give a quick explanation about each?) +""" +answers = [ "Accounting", "Ecofuzz", "Minimizer", "Power Scheduling", "Probabilistic Sampling", "Weighted" ] +next = [ "special input" ] +code = [ +""" +let scheduler = CoverageAccountingScheduler::new(&mut state, QueueScheduler::new(), unsafe { + &ACCOUNTING_MEMOP_MAP + }); + +let mut stages = tuple_list!(StdMutationalStage::new(mutator)); +""", +""" +let scheduler = EcoScheduler:new(&mut state, &observer); + +let mut stages = tuple_list!(StdMutationalStage::new(mutator)); +""", +""" +let scheduler = IndexesLenTimeMinimizerScheduler::new(QueueScheduler::new()); + +let mut stages = tuple_list!(StdMutationalStage::new(mutator)); +""", +""" +let scheduler = PowerQueueScheduler::new( + &mut state, + &observer, + PowerSchedule::FAST, +); + +let mut stages = tuple_list!(PowerMutationalStage::new(mutator)); +""", +""" +let scheduler = ProbabilitySamplingScheduler::new(); + +let mut stages = tuple_list!(StdMutationalStage::new(mutator)); +""", +""" +let time_observer = TimeObserver::new("time"); + +let scheduler = StdWeightedScheduler::with_schedule( + &mut state, + &observer, + Some(PowerSchedule::FAST), +); + +let calibration = CalibrationStage::new(&map_feedback); + +let power = StdPowerMutationalStage::new(mutator); + +let mut stages = tuple_list!(calibration, power); +""" ] +previous = 0 +skip = false + +[[question]] +id = "special input" +title = "Does your target require some special type of input?" +content = """ +Usually, libafl uses a map of bytes (BytesInput) to represent the input sent to the target for execution. (maybe cite some examples of data that can be represented as a map of bytes?) + +More abstract or complex inputs, such as Grammar-Based have their own type in libafl. There are many input representations supported by Libafl +to choose, for more information about each, please read the libafl documentation on Inputs. +""" +answers = [ "Yes", "No" ] +next = [ "input options", "crash/timeout" ] +code = [ +""" +""", +""" +let mutator = StdScheduledMutator::new(havoc_mutations()); +""" ] +previous = 0 +skip = false + +[[question]] +id = "input options" +title = "How can your input be represented?" +content = """ +(again, maybe give a quick explanation about each?) +""" +answers = [ "Encoded", "Grimoire", "Gramatron", "Nautilus" ] +next = [ "crash/timeout" ] +code = [ +""" +let mutator = StdScheduledMutator::with_max_stack_pow(encoded_mutations(), 2); +""", +""" +let generalization = GeneralizationStage::new(&observer); + +let mutator = StdScheduledMutator::with_max_stack_pow(havoc_mutations(), 2); + +let grimoire_mutator = StdScheduledMutator::with_max_stack_pow( + tuple_list!( + GrimoireExtensionMutator::new(), + GrimoireRecursiveReplacementMutator::new(), + GrimoireStringReplacementMutator::new(), + GrimoireRandomDeleteMutator::new(), + GrimoireRandomDeleteMutator::new(), + ), + 3, +); + +let mut stages = tuple_list!( + generalization, + StdMutationalStage::new(mutator), + StdMutationalStage::transforming(grimoire_mutator) +); +""", +""" +let mutator = StdScheduledMutator::with_max_stack_pow( + tuple_list!( + GramatronRandomMutator::new(&generator), + GramatronRandomMutator::new(&generator), + GramatronRandomMutator::new(&generator), + GramatronSpliceMutator::new(), + GramatronSpliceMutator::new(), + GramatronRecursionMutator::new() + ), + 2, +); +""", +""" +let mutator = StdScheduledMutator::with_max_stack_pow( + tuple_list!( + GramatronRandomMutator::new(&generator), + GramatronRandomMutator::new(&generator), + GramatronRandomMutator::new(&generator), + GramatronSpliceMutator::new(), + GramatronSpliceMutator::new(), + GramatronRecursionMutator::new() + ), + 2, + ); +""" ] +previous = 0 +skip = false + +[[question]] +id = "crash/timeout" +title = "Do you expect to cause a crash and/or a timeout on the target?" +content = """ +Determining the objective of the fuzzing campaign is essential to identify input that triggered critical errors on the target. + +Telling the fuzzer that we are looking for a crash mens that a testcase, which causes a crash on the target, fullfills the objective and, differently from the ones +that e.g. reach a new execution point, this testcase is saved in a separate folder for you to check the input that trigerred the crash. + +A timeout follows the same idea: a testcase that takes longer to execute than the defined timeout. + +It's even possible to join these two ideas to instruct the fuzzzer that any testcase, which causes a crash or takes long enough to execute, is stored. + +(I think that by crash, the fuzzer can catch the signal that finished the program and by timeout we are able to catch infinite recursion?) +""" +answers = [ "Crash or Timeout", "Crash", "Timeout" ] +next = [ "corrupt" ] +code = [ +""" +let mut objective = feedback_or_fast!( + CrashFeedback::new(), + TimeoutFeedback::new() +); +""", +""" +let mut objective = CrashFeedback::new(); +""", +""" +let mut objective = TimeoutFeedback::new(); +""" ] +previous = 0 +skip = false + +[[question]] +id = "corrupt" +title = "Can your target corrupt memory used by the fuzzer?" +content = """ +Under some circumstances, you may find your harness pretty unstable or your harness wreaks havoc on the global states. +In this case, you want to fork it before executing the harness runs in the child process so that it doesn't break things. +(from the book for now hahahaha) +""" +answers = [ "Yes", "No" ] +next = [ "", "" ] +code = [ +""" +let mut executor = InProcessForkExecutor::new( + &mut harness, + tuple_list!(observer), + &mut fuzzer, + &mut state, + &mut mgr, + shmem_provider, + ) + .expect("Failed to create the Executor"); +""", +""" +let mut executor = InProcessExecutor::new( + &mut harness, + tuple_list!(observer), + &mut fuzzer, + &mut state, + &mut mgr, + ) + .expect("Failed to create the Executor"); +""" ] +previous = 0 +skip = false diff --git a/libafl_wizard/questions.toml b/libafl_wizard/questions.toml index 677c9e7ee2..c03df17130 100644 --- a/libafl_wizard/questions.toml +++ b/libafl_wizard/questions.toml @@ -1,22 +1,9 @@ [[question]] id = "intro" -title = "libafl_wizard: a tool to generate Libafl-based fuzzers." +title = "Introduction" content = """ -Before starting, make sure that you know your target very well. Choosing the right components to build a fuzzer depends on the details of the -implementation of your target. - -Knowing what you want before building a fuzzer can be extremely helpful when selecting the components that best fit your options and the -restrictions of the environment. - -Details such as: - *Having the source code of the target. - *Implementing a harness function to fuzz your target. - *Knowing the expected input by the target. - *Providing an initial set of inputs. - *The size of the target and the availability of memory. - *The possibility of memory corruption. - -Can be helpful during this process. +Description +New line """ answers = [ "Next" ] next = [ "source code" ] @@ -27,268 +14,431 @@ skip = false [[question]] id = "source code" title = "Do you have the target's source code?" -content = """ -Having the target's source code is interesting for performance. With the source code in hands, we can instrument the target, that is, -place coverage information to help our fuzzer identify new points of execution. - -Without instrumentation on the source, we have to rely on third-party applications to provide this infromation for our fuzzer, -such as QEMU, FRIDA or Tiny Inst. Note that QEMU only supports Linux. -""" +content = "Description" answers = [ "Yes", "No" ] -next = [ "harness", "" ] -code = [] +next = [ "harness", "observers" ] +code = [ "", +"""let mut shmem_provider = UnixShMemProvider::new().unwrap();\n +let mut shmem = shmem_provider.new_shmem(MAP_SIZE).unwrap(); +shmem.write_to_env("__AFL_SHM_ID").unwrap(); +let shmem_buf = shmem.as_mut_slice();""" ] previous = 0 skip = false [[question]] id = "harness" title = "Can you provide a harness function?" -content = """ -Providing a harness also has an impact on performance, for it allows in-process fuzzing. -""" +content = "Description" answers = [ "Yes", "No" ] -next = [ "special algorithm" ] -code = [ -""" -""", -""" -const MAP_SIZE: usize = 65536; - +next = [ "observers", "observers" ] +code = [ "", +"""let mut shmem_provider = UnixShMemProvider::new().unwrap();\n let mut shmem = shmem_provider.new_shmem(MAP_SIZE).unwrap(); shmem.write_to_env("__AFL_SHM_ID").unwrap(); -let shmem_buf = shmem.as_mut_slice(); -""" ] +let shmem_buf = shmem.as_mut_slice();""" ] previous = 0 skip = false [[question]] -id = "special algorithm" -title = "Do you want to use some special algorithm to select and update testcases from the corpus?" -content = """ -Usually, a testcase that reaches a new execution point or achieves the desired objective, e.g. a crash on the target, are deemed interesting, -stored for later use and then selected using a determined policy. However, we can select which testcases to use based on variable aspects: for -instance, we can prioritize testacases that are smaller in size and take less time to execute (following a minimization policy). +id = "observers" +title = "Observers" +content = "Description" +answers = [ "Next" ] +next = [ "map size" ] +code = [] +previous = 0 +skip = false -There are many algorithms supported by Libafl to choose, for more information, please read the libafl documentation on Schedulers and Stages. -""" +[[question]] +id = "map size" +title = "Do you know the size of the map at compile time?" +content = "Description" answers = [ "Yes", "No" ] -next = [ "algorithm options", "special input" ] -code = [ -""" -""", -""" -let scheduler = QueueScheduler::new(); +next = [ "hit counts", "hit counts" ] +code = [ "let observer = ConstMapObserver::<>::new()", "let observer = StdMapObserver::new()" ] +previous = 0 +skip = false -let mut stages = tuple_list!(StdMutationalStage::new(mutator)); -""" ] +[[question]] +id = "hit counts" +title = "Do you want to improve input selection by adding a hit counts map?" +content = "Description" +answers = [ "Yes", "No" ] +next = [ "feedback", "feedback" ] +code = [ "let observer = HitcountsMapObserver::new($)", "" ] previous = 0 skip = false [[question]] -id = "algorithm options" -title = "Which of the following options would you like to use?" -content = """ -(maybe give a quick explanation about each?) -""" -answers = [ "Accounting", "Ecofuzz", "Minimizer", "Power Scheduling", "Probabilistic Sampling", "Weighted" ] -next = [ "special input" ] -code = [ -""" -let scheduler = CoverageAccountingScheduler::new(&mut state, QueueScheduler::new(), unsafe { - &ACCOUNTING_MEMOP_MAP - }); +id = "feedback" +title = "Feedback" +content = "Description" +answers = [ "Next" ] +next = [ "runtime" ] +code = [] +previous = 0 +skip = false -let mut stages = tuple_list!(StdMutationalStage::new(mutator)); -""", -""" -let scheduler = EcoScheduler:new(&mut state, &observer); +[[question]] +id = "runtime" +title = "Do you want to keep track of the testcase's runtime?" +content = "Description" +answers = [ "Yes", "No" ] +next = [ "crash", "crash" ] +code = [ """let mut feedback = feedback_or!( +\tMaxMapFeedback::new(&observer), +\tTimeObserver::new() +)""", +"let mut feedback = MaxMapFeedback::new(&observer)" ] +previous = 0 +skip = false -let mut stages = tuple_list!(StdMutationalStage::new(mutator)); -""", -""" -let scheduler = IndexesLenTimeMinimizerScheduler::new(QueueScheduler::new()); +[[question]] +id = "crash" +title = "Do you want to consider a crash as a solution?" +content = "Description" +answers = [ "Yes", "No" ] +next = [ "timeout", "state" ] +code = [ "let mut objective = CrashFeedback::new()", "let mut objective = TimeoutFeedback::new()" ] +previous = 0 +skip = false -let mut stages = tuple_list!(StdMutationalStage::new(mutator)); -""", -""" -let scheduler = PowerQueueScheduler::new( - &mut state, - &observer, - PowerSchedule::FAST, -); - -let mut stages = tuple_list!(PowerMutationalStage::new(mutator)); -""", -""" -let scheduler = ProbabilitySamplingScheduler::new(); +[[question]] +id = "timeout" +title = "Do you want to consider a timeout as a solution?" +content = "Description" +answers = [ "Yes", "No" ] +next = [ "state", "state" ] +code = [ "let mut objective = feedback_and!($, TimeoutFeedback::new())", "" ] +previous = 0 +skip = false -let mut stages = tuple_list!(StdMutationalStage::new(mutator)); -""", -""" -let time_observer = TimeObserver::new("time"); +[[question]] +id = "state" +title = "State/Corpus" +content = "Description" +answers = [ "Next" ] +next = [ "manage testcases" ] +code = [] +previous = 0 +skip = false -let scheduler = StdWeightedScheduler::with_schedule( - &mut state, - &observer, - Some(PowerSchedule::FAST), -); +[[question]] +id = "manage testcases" +title = "Do you want to manage the testcases in memory, on disk or both?" +content = "Description" +answers = [ "On disk", "In memory", "Both" ] +next = [ "via cache", "load state", "load state" ] +code = [ "", "InMemoryCorpus::new()", "InMemoryOnDiskCorpus::new().unwrap()" ] +previous = 0 +skip = false -let calibration = CalibrationStage::new(&map_feedback); +[[question]] +id = "via cache" +title = "Do you want to load testcases from disk to memory using a cache?" +content = "Description" +answers = [ "Yes", "No" ] +next = [ "load state", "load state" ] +code = [ "CachedOnDiskCorpus::new().unwrap()", "OnDiskCorpus::new().unwrap()" ] +previous = 0 +skip = false -let power = StdPowerMutationalStage::new(mutator); +[[question]] +id = "load state" +title = "" +content = "" +answers = [ "" ] +next = [ "monitors" ] +code = [ """let mut state = StdState::new( +\tStdRand::with_seed(current_nanos()), +\t$, +\tOnDiskCorpus::new(PathBuf::from("./crashes")).unwrap(), +\t&mut feedback, +\t&mut objective, +) +.unwrap()""" ] +previous = 0 +skip = false -let mut stages = tuple_list!(calibration, power); -""" ] +[[question]] +id = "monitors" +title = "Monitors" +content = "Description" +answers = [ "Next" ] +next = [ "stats" ] +code = [] previous = 0 skip = false [[question]] -id = "special input" -title = "Does your target require some special type of input?" -content = """ -Usually, libafl uses a map of bytes (BytesInput) to represent the input sent to the target for execution. (maybe cite some examples of data that can be represented as a map of bytes?) +id = "stats" +title = "Do you want to see stats about the fuzzing campaign?" +content = "Description" +answers = [ "Yes", "No" ] +next = [ "stats in ui", "stats to file" ] +code = [ "", "let mon = NopMonitor::new()" ] +previous = 0 +skip = false -More abstract or complex inputs, such as Grammar-Based have their own type in libafl. There are many input representations supported by Libafl -to choose, for more information about each, please read the libafl documentation on Inputs. -""" +[[question]] +id = "stats in ui" +title = "Do you want to see the stats in a UI style?" +content = "Description" answers = [ "Yes", "No" ] -next = [ "input options", "crash/timeout" ] -code = [ -""" -""", -""" -let mutator = StdScheduledMutator::new(havoc_mutations()); -""" ] +next = [ "stats to file", "stats to file" ] +code = [ "let mon = (WIP)", """let mon = SimpleMonitor::new(|s| println!("{s}")""" ] previous = 0 skip = false [[question]] -id = "input options" -title = "How can your input be represented?" -content = """ -(again, maybe give a quick explanation about each?) -""" -answers = [ "Encoded", "Grimoire", "Gramatron", "Nautilus" ] -next = [ "crash/timeout" ] -code = [ -""" -let mutator = StdScheduledMutator::with_max_stack_pow(encoded_mutations(), 2); -""", -""" -let generalization = GeneralizationStage::new(&observer); - -let mutator = StdScheduledMutator::with_max_stack_pow(havoc_mutations(), 2); - -let grimoire_mutator = StdScheduledMutator::with_max_stack_pow( - tuple_list!( - GrimoireExtensionMutator::new(), - GrimoireRecursiveReplacementMutator::new(), - GrimoireStringReplacementMutator::new(), - GrimoireRandomDeleteMutator::new(), - GrimoireRandomDeleteMutator::new(), - ), - 3, -); - -let mut stages = tuple_list!( - generalization, - StdMutationalStage::new(mutator), - StdMutationalStage::transforming(grimoire_mutator) -); -""", -""" -let mutator = StdScheduledMutator::with_max_stack_pow( - tuple_list!( - GramatronRandomMutator::new(&generator), - GramatronRandomMutator::new(&generator), - GramatronRandomMutator::new(&generator), - GramatronSpliceMutator::new(), - GramatronSpliceMutator::new(), - GramatronRecursionMutator::new() - ), - 2, -); -""", -""" -let mutator = StdScheduledMutator::with_max_stack_pow( - tuple_list!( - GramatronRandomMutator::new(&generator), - GramatronRandomMutator::new(&generator), - GramatronRandomMutator::new(&generator), - GramatronSpliceMutator::new(), - GramatronSpliceMutator::new(), - GramatronRecursionMutator::new() - ), - 2, - ); -""" ] +id = "stats to file" +title = "Do you want to store the stats to a file too?" +content = "Description" +answers = [ "Yes", "No" ] +next = [ "file extensions", "events" ] +code = [ "", "" ] previous = 0 skip = false [[question]] -id = "crash/timeout" -title = "Do you expect to cause a crash and/or a timeout on the target?" -content = """ -Determining the objective of the fuzzing campaign is essential to identify input that triggered critical errors on the target. +id = "file extensions" +title = "Do you want to store them to a TOML or JSON file?" +content = "Description" +answers = [ "TOML", "JSON" ] +next = [ "events", "events" ] +code = [ "let mon = OnDiskTOMLMonitor::new($)", "let mon = OnDiskJSONMonitor::new($)" ] +previous = 0 +skip = false -Telling the fuzzer that we are looking for a crash mens that a testcase, which causes a crash on the target, fullfills the objective and, differently from the ones -that e.g. reach a new execution point, this testcase is saved in a separate folder for you to check the input that trigerred the crash. +[[question]] +id = "events" +title = "Events" +content = "Description" +answers = [ "Next" ] +next = [ "restart fuzzer" ] +code = [] +previous = 0 +skip = false -A timeout follows the same idea: a testcase that takes longer to execute than the defined timeout. +[[question]] +id = "restart fuzzer" +title = "Do you want to restart your fuzzer every time a solution is achieved?" +content = "Description" +answers = [ "Yes", "No" ] +next = [ "restart fuzzer llmp", "restart fuzzer llmp" ] +code = [ "let mut mgr = SimpleRestartingEventManager::launch(mon)", "let mut mgr = SimpleEventManager::new(mon)" ] +previous = 0 +skip = false -It's even possible to join these two ideas to instruct the fuzzzer that any testcase, which causes a crash or takes long enough to execute, is stored. +[[question]] +id = "restart fuzzer llmp" +title = "Do you want to restart your fuzzer every time a solution is achieved (LLMP)?" +content = "Description" +answers = [ "Yes", "No" ] +next = [ "schedulers", "schedulers" ] +code = [ "let mut mgr = LlmpRestartingEventManager::new(mon)", "let mut mgr = LlmpEventManager::new(mon).unwrap()" ] +previous = 0 +skip = false -(I think that by crash, the fuzzer can catch the signal that finished the program and by timeout we are able to catch infinite recursion?) -""" -answers = [ "Crash or Timeout", "Crash", "Timeout" ] -next = [ "corrupt" ] -code = [ -""" -let mut objective = feedback_or_fast!( - CrashFeedback::new(), - TimeoutFeedback::new() -); -""", -""" -let mut objective = CrashFeedback::new(); -""", -""" -let mut objective = TimeoutFeedback::new(); -""" ] +[[question]] +id = "schedulers" +title = "Schedulers" +content = "Description" +answers = [ "Next" ] +next = [ "queue policy" ] +code = [] previous = 0 skip = false [[question]] -id = "corrupt" +id = "queue policy" +title = "Do you want to load testcases from the corpus using a queue policy?" +content = "Description" +answers = [ "Yes", "No" ] +next = [ "smaller and faster", "fuzzer" ] +code = [ "let scheduler = QueueScheduler::new()", "let scheduler = RandScheduler::new()" ] +previous = 0 +skip = false + +[[question]] +id = "smaller and faster" +title = "Do you want to prioritize smaller and faster testcases?" +content = "Description" +answers = [ "Yes", "No" ] +next = [ "fuzzer", "fuzzer" ] +code = [ "let scheduler = IndexesLenTimeMinimizerScheduler::new($)", "" ] +previous = 0 +skip = false + +[[question]] +id = "fuzzer" +title = "Fuzzer" +content = "Description" +answers = [ "Next" ] +next = [ "load fuzzer" ] +code = [] +previous = 0 +skip = false + +[[question]] +id = "load fuzzer" +title = "" +content = "" +answers = [ "" ] +next = [ "executors" ] +code = ["let mut fuzzer = StdFuzzer::new(scheduler, feedback, objective)" ] +previous = 0 +skip = false + +[[question]] +id = "executors" +title = "Executors" +content = "Description" +answers = [ "Next" ] +next = [ "corrupt memory" ] +code = [] +previous = 0 +skip = false + + +[[question]] +id = "corrupt memory" title = "Can your target corrupt memory used by the fuzzer?" -content = """ -Under some circumstances, you may find your harness pretty unstable or your harness wreaks havoc on the global states. -In this case, you want to fork it before executing the harness runs in the child process so that it doesn't break things. -(from the book for now hahahaha) -""" +content = "Description" answers = [ "Yes", "No" ] -next = [ "", "" ] -code = [ -""" +next = [ "in process timeout", "in process timeout" ] +code = [ """let mut shmem_provider = unix_shmem::UnixShMemProvider::new().unwrap();\n let mut executor = InProcessForkExecutor::new( - &mut harness, - tuple_list!(observer), - &mut fuzzer, - &mut state, - &mut mgr, - shmem_provider, - ) - .expect("Failed to create the Executor"); -""", -""" -let mut executor = InProcessExecutor::new( - &mut harness, - tuple_list!(observer), - &mut fuzzer, - &mut state, - &mut mgr, - ) - .expect("Failed to create the Executor"); -""" ] +\t&mut harness, +\ttuple_list!(observer), +\t&mut fuzzer, +\t&mut state, +\t&mut mgr, +\tshmem_provider +) +.expect("Failed to create the Executor")""", +"""let mut executor = InProcessExecutor::new( +\t&mut harness, +\ttuple_list!(observer), +\t&mut fuzzer, +\t&mut state, +\t&mut mgr, +)\ +.expect("Failed to create the Executor")""" +] +previous = 0 +skip = false + +[[question]] +id = "in process timeout" +title = "Do you want to set a timeout before each run?" +content = "Description" +answers = [ "Yes", "No" ] +next = [ "forkserver timeout", "forkserver timeout" ] +code = [ """let mut executor = TimeoutExecutor::new( +$, +Duration::from_secs() +)""", +"" ] +previous = 0 +skip = false + +[[question]] +id = "forkserver timeout" +title = "Do you want to set a timeout before each run (forkserver)?" +content = "Description" +answers = [ "Yes", "No" ] +next = [ "generators", "generators" ] +code = [ """let mut executor = TimeoutForkserverExecutor::new( +\t$, +\tDuration::from_secs() +)""", +"let mut executor = ForkserverExecutor::new()" ] +previous = 0 +skip = false + +[[question]] +id = "generators" +title = "Generators" +content = "Description" +answers = [ "Next" ] +next = [ "initial inputs" ] +code = [] previous = 0 skip = false + +[[question]] +id = "initial inputs" +title = "Do you want to generate an initial set of inputs?" +content = "Description" +answers = [ "Yes", "No" ] +next = [ "mutators", "mutators" ] +code = [ """let mut generator = RandBytesGenerator::new(32);\n +state +\t.generate_initial_inputs(&mut fuzzer, &mut executor, &mut generator, &mut mgr, 8) +\t.expect("Failed to generate the initial corpus")""" +, "" ] +previous = 0 +skip = false + +[[question]] +id = "mutators" +title = "Mutators" +content = "Description" +answers = [ "Next" ] +next = [ "schedule mutations" ] +code = [] +previous = 0 +skip = false + +[[question]] +id = "schedule mutations" +title = "Do you want to schedule mutations?" +content = "Description" +answers = [ "Yes", "No" ] +next = [ "stages", "stages" ] +code = [ "let mutator = StdScheduledMutator::new(havoc_mutations())", "" ] +previous = 0 +skip = false + +[[question]] +id = "stages" +title = "Stages" +content = "Description" +answers = [ "Next" ] +next = [ "StdMutationalStage" ] +code = [] +previous = 0 +skip = false + +[[question]] +id = "StdMutationalStage" +title = "Do you want to use the StdMutationalStage?" +content = "Description" +answers = [ "Yes", "No" ] +next = [ "fuzz loop", "fuzz loop" ] +code = [ "let mut stages = tuple_list!(StdMutationalStage::new())", "" ] +previous = 0 +skip = false + +[[question]] +id = "fuzz loop" +title = "" +content = "" +answers = [ "" ] +next = [ "end" ] +code = [ """fuzzer +\t.fuzz_loop(&mut stages, &mut executor, &mut state, &mut mgr) +\t.expect("Error in the fuzzing loop")""" ] +previous = 0 +skip = false + +[[question]] +id = "end" +title = "" +content = "" +answers = [] +next = [] +code = [] +previous = 0 +skip = false \ No newline at end of file diff --git a/libafl_wizard/src/lib.rs b/libafl_wizard/src/lib.rs index dbc2bde122..3397b76d8d 100644 --- a/libafl_wizard/src/lib.rs +++ b/libafl_wizard/src/lib.rs @@ -1,5 +1,5 @@ use serde::Deserialize; -use std::{error::Error, fs, fs::OpenOptions, io::Write, path::Path}; +use std::{fs, fs::OpenOptions, io::Write, path::Path, process::Command}; use toml; #[derive(Deserialize)] @@ -14,34 +14,35 @@ struct QuestionList { question: Vec, } -// This represents a "node": the answer of a Question might lead to different Questions (different nodes). #[derive(Clone, Deserialize, PartialEq, Debug)] pub struct Question { - id: String, // ID is resolved to local indexes. - title: String, // The question that will be asked. - content: String, // Description related to the question, to help the user. - answers: Vec, // A vector containing all the possible answers for this question. + id: String, // ID is resolved to local indexes. + pub title: String, + pub content: String, // Description related to the question, to help the user. + pub answers: Vec, // A vector containing all the possible answers for this question. next: Vec, // A vector containing the next question for all the possible answers (for answer[0] the next question is next[0]...). code: Vec, // Contains the Rust code associated to the question. - previous: usize, // The question that lead to the current one (possible UNDO functionality implementation). - skip: bool, // Marks questions that should be skipped. + previous: usize, // The question that led to the current one. + skip: bool, // Marks questions that should be skipped. } impl Question { // Builds the diagram of questions from the csv file (this will probably be changed, the csv is used only for demonstrative purposes). // The diagram is a vector of Questions (vector of nodes): each Question, depending on the answer, will have the index of the next Question // that should be asked. - pub fn new() -> Result, Box> { - let contents = fs::read_to_string("questions.toml")?; + pub fn new() -> Vec { + let contents = + fs::read_to_string("questions.toml").expect("Failed to read questions file."); - let q_list: QuestionList = toml::from_str(&contents)?; + let q_list: QuestionList = + toml::from_str(&contents).expect("Failed to parse toml questions."); // // Checks if each question is valid. // for q in q_list.question.iter() { // q.validate_question()?; // } - Ok(q_list.question) + q_list.question } pub fn end(&self) -> bool { @@ -52,17 +53,25 @@ impl Question { false } - pub fn print_question(&self) -> () { - print!("{esc}c", esc = 27 as char); - println!("=========================\nFuzzer Template Generator\n========================="); - println!("{}\n", self.title); - println!("{}\n", self.content); + pub fn print_question(&self) { + let mut output = String::new(); + + clear_terminal_screen(); + + // Construct the output string + output.push_str(&format!( + "=========================\nFuzzer Template Generator\n=========================\n" + )); + output.push_str(&format!("{}\n\n", self.title)); + output.push_str(&format!("{}\n\n", self.content)); for ans in &self.answers { - print!("\t{}", ans); + output.push_str(&format!("\t{}", ans)); } - println!("\tUndo"); + output.push_str("\tUndo\n"); + + print!("{}", output); } pub fn resolve_answer( @@ -71,14 +80,14 @@ impl Question { input: &String, ) -> (usize, bool, usize) { // The "Undo" option makes the generator go back to the previous question, so if the user do something by mistake, they can correct it. - if validate_answer(&input, &String::from("Undo")) { + if validate_input(&input, &String::from("Undo")) { return (self.previous, true, 0); } // Checks if the user typed one of the acceptable answers. If so, returns the index of the next question associated to that answer. // For now we don't check for variants. for (i, ans) in self.answers.iter().enumerate() { - if validate_answer(&input, &ans) { + if validate_input(&input, &ans) { let mut next_q = self.next_question(questions, i); // If the question should be skipped, then the generator goes to next question. @@ -118,7 +127,7 @@ impl Question { false } - pub fn add_code(&self, code_content: &mut Vec, ans_i: usize) -> () { + pub fn add_code(&self, code_content: &mut Vec, ans_i: usize) { if self.code[ans_i] != "" { code_content.push(self.code[ans_i].to_string()); } @@ -131,23 +140,23 @@ impl Question { next_q: usize, in_process_qs: &Vec, forkserver_qs: &Vec, - ) -> () { + ) { // If the user doesn't have the source code or can't provide a harness, then in process fuzzing in not possible and the questions // related to it are skipped. if ((self.id == "source code") || (self.id == "harness")) - && validate_answer(&input, &String::from("No")) + && validate_input(&input, &String::from("No")) { skip_questions(questions, &in_process_qs); } // If it is possible, then forkserver/llmp questions are skipped. - else if (self.id == "harness") && validate_answer(&input, &String::from("Yes")) { + else if (self.id == "harness") && validate_input(&input, &String::from("Yes")) { skip_questions(questions, &forkserver_qs); // If the user is undoing, then the generator resets the questions that were marked to be skipped. } else if ((self.id == "harness") || (self.id == "observers") || (self.id == "map size" && (questions[next_q].id == "source code" || questions[next_q].id == "harness"))) - && validate_answer(&input, &String::from("Undo")) + && validate_input(&input, &String::from("Undo")) { unskip_questions(questions, &in_process_qs); unskip_questions(questions, &forkserver_qs); @@ -160,15 +169,15 @@ impl Question { } } -pub fn read_sections() -> Result<(Vec, Vec), Box> { - let contents = fs::read_to_string("sections.toml")?; +pub fn read_sections() -> (Vec, Vec) { + let contents = fs::read_to_string("sections.toml").expect("Failed to read sections file."); - let sections: Sections = toml::from_str(&contents)?; + let sections: Sections = toml::from_str(&contents).expect("Failed to parse toml sections."); - Ok(( + ( sections.in_process_skip_questions, sections.forkserver_skip_questions, - )) + ) } pub fn skip_questions(questions: &mut Vec, vec: &Vec) -> () { @@ -228,37 +237,102 @@ pub fn replace_code(code_content: &mut Vec) -> () { } } +// pub fn arrange_code(code_content: Vec) -> Vec { +// // List of libafl's components +// let components: Vec = vec!["Observer", "Feedback", "State", "Monitor", "Event", "Scheduler", "Fuzzer", "Executor", "Generator", "Mutator", "Stage"]; + +// let code_line = String::new(); + +// let mut final_code: Vec = Vec::new(); + +// // Each of the fields of 'code_content' contains a String, which contains a single or mroe lines of Rust code. +// // The idea here is to parse each String, looking for the Strings contained in 'components' as a substring, to find the components that +// // are going to be used. +// for s in code_content { +// for c in s.chars() { +// if c == ';' { +// code_line.push(c); + +// // 'code_line' contains a line of Rust code, so we check to see if it's a component. +// if let Some((i, _)) = components.iter().enumerate().find(|(_, comp)| code_line.contains(comp)) { +// // If it's a component, we must write it to 'final_code' in the same order as the 'components' vector. +// for (j, code) in final_code.iter().enumerate() { +// if let Some(k) = components.iter().position(|&other_comp| code.contains(other_comp)) { +// // If the current component in 'final_code' contains the same class of component, or if it contains a class that +// // goes after the current one, we place it in this position. +// if (other_comp == comp) || (i < k) { +// final_code.insert(j, code_line); +// break; +// } +// } + +// // If we've gone through the whole 'final_code' vector and didn't insert the code, this means we have a component +// // that must be add to the end. +// if j == final_code.len() { +// final_code.push(code_line); +// break; +// } +// } +// } +// else { +// // If it's not a component, we simply add it to the end. +// final_code.push(code_line); +// } +// } +// else { +// code_line.push(c); +// } +// } +// } + +// final_code +// } + // Write Rust code in the file of the generated fuzzer. -pub fn write_code(code_content: Vec) -> Result> { +pub fn write_code(code_content: Vec) -> String { let mut counter = 0; let mut file_name = format!("fuzzer.rs"); + let fuzzers_folder = "./fuzzers"; + if !Path::new(fuzzers_folder).exists() { + fs::create_dir(fuzzers_folder).expect("Failed to create fuzzers directory."); + } + // Creates "fuzzer.rs", "fuzzer_1.rs" files if the previous one already exists... - while Path::new(&file_name).exists() { + while Path::new(&format!("{}/{}", fuzzers_folder, file_name)).exists() { counter += 1; file_name = format!("fuzzer_{}.rs", counter); } + let file_path = format!("{}/{}", fuzzers_folder, file_name); + let mut out_file = OpenOptions::new() .append(true) .create(true) - .open(&file_name)?; + .open(&file_path) + .expect("Failed to open the fuzzer file."); // While imports are not resolved, use this. - out_file.write_all("use libafl::prelude::*;\n\n".as_bytes())?; + out_file + .write_all("use libafl::prelude::*;\n\n".as_bytes()) + .expect("Failed to write to the fuzzer file."); for (i, code) in code_content.iter().enumerate() { - out_file.write_all(code.as_bytes())?; + out_file + .write_all(code.as_bytes()) + .expect("Failed to write to the fuzzer file."); if i < code_content.len() { - out_file.write_all(";\n\n".as_bytes())?; + out_file + .write_all(";\n\n".as_bytes()) + .expect("Failed to write to the fuzzer file."); } } - Ok(file_name) + file_name } -pub fn validate_answer(input: &String, ans: &String) -> bool { +pub fn validate_input(input: &String, ans: &String) -> bool { let input_lower = input.to_lowercase(); let ans_lower = ans.to_lowercase(); @@ -266,7 +340,7 @@ pub fn validate_answer(input: &String, ans: &String) -> bool { let mut ans_chars = ans_lower.chars(); // Basically, an aswer is valid if it is an acceptable variant of that given answer. Acceptable variants are strings that contain the - // characters in the same order as the answer, so for the answer "Yes", acceptable variants are: "y", "Ye", "yes", "yES", but not + // characters in the same order as the answer, so for the answer "Yes", acceptable variants are: "y", "Ye", "yes", "YES", but not // "Yess", "yy", "Yhes", "yYess"... while let (Some(input_c), Some(ans_c)) = (input_chars.next(), ans_chars.next()) { if input_c != ans_c { @@ -276,3 +350,20 @@ pub fn validate_answer(input: &String, ans: &String) -> bool { true } + +pub fn clear_terminal_screen() { + if cfg!(target_os = "windows") { + Command::new("cmd") + .args(["/c", "cls"]) + .spawn() + .expect("cls command failed to start") + .wait() + .expect("failed to wait"); + } else { + Command::new("clear") + .spawn() + .expect("clear command failed to start") + .wait() + .expect("failed to wait"); + }; +} diff --git a/libafl_wizard/src/main.rs b/libafl_wizard/src/main.rs index dc258f027b..a1bcdde33b 100644 --- a/libafl_wizard/src/main.rs +++ b/libafl_wizard/src/main.rs @@ -1,61 +1,66 @@ -use libafl_wizard::{read_sections, replace_code, validate_answer, write_code, Question}; -use std::{error::Error, io, process}; +use libafl_wizard::{read_sections, replace_code, validate_input, write_code, Question}; +#[cfg(feature = "ui")] +use std::thread; +use std::{io, io::Write}; + +#[cfg(feature = "ui")] +slint::slint! { + import { MainWindow } from "./src/ui.slint"; +} -fn run() -> Result<(), Box> { - // The question diagram is a vector containing all the questions. - let mut questions = Question::new()?; +#[cfg(not(feature = "ui"))] +fn main() { + // The question diagram is a vector containing all the questions + let mut questions = Question::new(); - // Each element is a String, which contains the Rust code associated to a question. This will be used to write to the file. - // Note that these are not in the same position as the questions, they are simply in the order that will be written to the file. + // Each element is a String, which contains the Rust code associated to a question. This will be used to write to the file let mut code_content: Vec = Vec::new(); - // Marks the questions that produced code that will be written. This has the same index as the questions in their vector. + // Marks the questions that produced code that will be written. This has the same index as the questions in their vector // Undo option let mut prod_code: Vec = vec![false; questions.len()]; // Index of the current question let mut curr_q = 0; // Index of the next question - let mut next_q; + let mut next_q = 0; // Index of the chosen answer - let mut ans_i; + let mut ans_i = 0; let mut valid_ans; // User input let mut input = String::new(); - // Loads the vectors which contains the ids of questions that may be skipped. - let (in_process_qs, forkserver_qs) = read_sections()?; + // Loads the vectors which contains the ids of questions that may be skipped + let (in_process_qs, forkserver_qs) = read_sections(); // Basically, a question is asked, answered by the user and then the generator moves on to the next question. - // Note that not all the questions are going to be asked, for example, if the user chose not to use a monitor, the generator shouldn't - // ask if he wants a monitor with a UI style or a SimpleMonitor. while !questions[curr_q].end() { - // If the question has a title, it means it contains information to show to the user and expects some input. + // If the question has a title, it means it contains information to show to the user and expects some input if questions[curr_q].has_title() { questions[curr_q].print_question(); - loop { - input = "".to_string(); - io::stdin().read_line(&mut input)?; + valid_ans = false; + + while !valid_ans { + input.clear(); + io::stdout().flush().unwrap(); + io::stdin() + .read_line(&mut input) + .expect("Failed to get input from stdin."); input = input.trim().to_string(); (next_q, valid_ans, ans_i) = questions[curr_q].resolve_answer(&questions, &input); - if valid_ans { - break; - } - println!("Please type a valid answer: "); } } else { (next_q, _, ans_i) = questions[curr_q].resolve_answer(&questions, &input); } - // Code generation - if validate_answer(&input, &String::from("Undo")) { - // If the user chooses to undo a question that produced code, the code is removed. + if validate_input(&input, &String::from("Undo")) { + // If the user chooses to undo a question that produced code, the associated code is removed. // Since the Undo option goes backwards, we can simply pop the last piece of code. if prod_code[next_q] { code_content.pop(); @@ -78,28 +83,139 @@ fn run() -> Result<(), Box> { &forkserver_qs, ); - // Only updates the 'previous' field when going forward in the questions diagram. - if !validate_answer(&input, &String::from("Undo")) { + // Only updates the 'previous' field when going forward in the questions diagram + if !validate_input(&input, &String::from("Undo")) { questions[next_q].update_previous(curr_q); } curr_q = next_q; } + // Here, the vector 'code_content' contains all the code that will be written to the file, but we need to place the components in the correct order + // let final_code = arrange_code(code_content); + replace_code(&mut code_content); - let file_name = write_code(code_content)?; + let file_name = write_code(code_content); - print!("{esc}c", esc = 27 as char); println!("File {} successfully created!", file_name); println!("\nAll questions answered."); - - Ok(()) } +#[cfg(feature = "ui")] fn main() { - if let Err(err) = run() { - println!("{}", err); - process::exit(1); - } + let handle = MainWindow::new().unwrap(); + let handle_weak = handle.as_weak(); + let program_thread = thread::spawn(move || { + // The question diagram is a vector containing all the questions + let mut questions = Question::new(); + + // Each element is a String, which contains the Rust code associated to a question. This will be used to write to the file + let mut code_content: Vec = Vec::new(); + + // Marks the questions that produced code that will be written. This has the same index as the questions in their vector + // Undo option + let mut prod_code: Vec = vec![false; questions.len()]; + + // Index of the current question + let mut curr_q = 0; + // Index of the next question + let mut next_q = 0; + // Index of the chosen answer + let mut ans_i = 0; + + let mut valid_ans; + + // User input + let mut input = String::new(); + + // Loads the vectors which contains the ids of questions that may be skipped + let (in_process_qs, forkserver_qs) = read_sections(); + + // Basically, a question is asked, answered by the user and then the generator moves on to the next question. + while !questions[curr_q].end() { + // If the question has a title, it means it contains information to show to the user and expects some input + if questions[curr_q].has_title() { + valid_ans = false; + + while !valid_ans { + input.clear(); + io::stdout().flush().unwrap(); + + let handle_copy = handle_weak.clone(); + + let question_copy = questions[curr_q].clone(); + + slint::invoke_from_event_loop(move || { + handle_copy.unwrap().set_question(SlintData { + title: question_copy.title.clone().into(), + content: question_copy.content.clone().into(), + answers: std::rc::Rc::new(slint::VecModel::from(vec![ + "answer1".into(), + "answer2".into(), + "answer3".into(), + ])) + .into(), + }) + }); + while input.is_empty() { + println!("input = {}", input); + } + + input = input.trim().to_string(); + + (next_q, valid_ans, ans_i) = + questions[curr_q].resolve_answer(&questions, &input); + } + } else { + (next_q, _, ans_i) = questions[curr_q].resolve_answer(&questions, &input); + } + + if validate_input(&input, &String::from("Undo")) { + // If the user chooses to undo a question that produced code, the associated code is removed. + // Since the Undo option goes backwards, we can simply pop the last piece of code. + if prod_code[next_q] { + code_content.pop(); + prod_code[next_q] = false; + } + } else { + // Adds the code associated to the user choice + if questions[curr_q].has_code() { + questions[curr_q].add_code(&mut code_content, ans_i); + prod_code[curr_q] = true; + } + } + + // Skip questions that are no longer possible + questions[curr_q].clone().check_skip( + &mut questions, + &input, + next_q, + &in_process_qs, + &forkserver_qs, + ); + + // Only updates the 'previous' field when going forward in the questions diagram + if !validate_input(&input, &String::from("Undo")) { + questions[next_q].update_previous(curr_q); + } + + curr_q = next_q; + } + + // Here, the vector 'code_content' contains all the code that will be written to the file, but we need to place the components in the correct order + // let final_code = arrange_code(code_content); + + replace_code(&mut code_content); + + let file_name = write_code(code_content); + + println!("File {} successfully created!", file_name); + println!("\nAll questions answered."); + }); + + // Start the GUI event loop + handle.run().unwrap(); + + program_thread.join().unwrap(); } diff --git a/libafl_wizard/src/ui.slint b/libafl_wizard/src/ui.slint new file mode 100644 index 0000000000..5adfaff91f --- /dev/null +++ b/libafl_wizard/src/ui.slint @@ -0,0 +1,61 @@ +struct SlintData { + title: string, + content: string, + answers: [string], +} + +component AnswerButton inherits Rectangle { + in-out property text <=> answer.text; + + callback clicked <=> touch.clicked; + + border-radius: 10px; + border-width: 2px; + border-color: #ffffff; + background: touch.pressed ? #3b3b3b : touch.has-hover ? #1c1c1c : transparent; + height: answer.preferred-height * 2; + min-width: answer.preferred-width + 20px; + + answer := Text { + x: ((parent.width - self.width) / 2) + (touch.pressed ? 2px : 0); + y: ((parent.height - self.height) / 2) + (touch.pressed ? 1px : 0); + color: touch.pressed ? #fff : #eee; + } + + touch := TouchArea { } +} + +export component MainWindow inherits Window { + in-out property question; + + background: #0f0f0f; + title: "libafl_wizard"; + icon: @image-url("../icons/libafl_wizard.png"); + default-font-size: 20px; + + VerticalLayout { + Text { + text: root.question.title; + color: white; + font-family: "Terminal"; + } + + Text { + text: root.question.content; + color: white; + font-family: "Terminal"; + } + + HorizontalLayout { + spacing: 10px; + + for ans[i] in question.answers: AnswerButton { + text: ans; + } + + undo := AnswerButton{ + text: "Undo"; + } + } + } +} From 4effc521ab26905abae3ef101d036d47b48ba95c Mon Sep 17 00:00:00 2001 From: matheusbaptistella Date: Thu, 9 Nov 2023 13:45:09 -0300 Subject: [PATCH 13/21] Added flowchart image feature and the ui. --- libafl_wizard/Cargo.toml | 3 +- libafl_wizard/README.md | 6 +- libafl_wizard/flowchart.png | Bin 0 -> 114289 bytes libafl_wizard/fuzzers/fuzzer.rs | 2 + libafl_wizard/new_questions.toml | 294 -------------- libafl_wizard/old_questions.toml | 444 --------------------- libafl_wizard/questions.toml | 658 +++++++++++++------------------ libafl_wizard/sections.toml | 10 - libafl_wizard/src/lib.rs | 437 +++++++++++--------- libafl_wizard/src/main.rs | 269 +++++-------- libafl_wizard/src/ui.slint | 52 ++- 11 files changed, 645 insertions(+), 1530 deletions(-) create mode 100644 libafl_wizard/flowchart.png create mode 100644 libafl_wizard/fuzzers/fuzzer.rs delete mode 100644 libafl_wizard/new_questions.toml delete mode 100644 libafl_wizard/old_questions.toml delete mode 100644 libafl_wizard/sections.toml diff --git a/libafl_wizard/Cargo.toml b/libafl_wizard/Cargo.toml index cb0b6ba587..3316a70c2f 100644 --- a/libafl_wizard/Cargo.toml +++ b/libafl_wizard/Cargo.toml @@ -17,4 +17,5 @@ ui = [] [dependencies] toml = "0.7.6" serde = { version = "1.0", features = ["derive"] } -slint = "1.1.1" \ No newline at end of file +slint = "1.1.1" +graphviz-rust = "0.6.6" \ No newline at end of file diff --git a/libafl_wizard/README.md b/libafl_wizard/README.md index b12315ae58..a857abc5a0 100644 --- a/libafl_wizard/README.md +++ b/libafl_wizard/README.md @@ -2,10 +2,11 @@ libafl_wizard logo -libafl_wizard is a tool to generate fuzzers using libafl's components. Simply by answering some questions, while learning more about how libafl is used, you can generate your own fuzzer to test programs and help with the development of more secure code! +libafl_wizard is a tool to generate fuzzers using libafl's components. By answering some questions, you will learn more about how libafl is used and generate your own fuzzer to test programs and help with the development of more secure code! ## Usage +(Probably remove this) libafl_wizard has a UI, made with [Slint](https://slint.dev/releases/1.1.1/docs/slint/), to help during the process. You can choose between answers by simply clicking on them and visualize where these answers might take you through a flowchart! ``` @@ -18,7 +19,10 @@ If you don't want or can't use libafl_wizard with the UI, it's possible to use t cargo run ``` +libafl_wizard also generates `flowchart.png`, an image to have an overall view of the questions diagram. Have in mind that this feature requires [Graphviz](https://graphviz.org/download/) to be installed on the machine. + ## Contributing libafl_wizard uses the `questions.toml` TOML file to store and load the questions that will be asked during the generation process. Each question contains some fields, like the possible answers for that question and the Rust code associated to those answers. As libafl's components get updated or new ones introduced, the questions need to be updated as well. +(this as well) For changes on the UI, please check the [Slint](https://slint.dev/releases/1.1.1/docs/slint/) documentation page to learn more about the language! diff --git a/libafl_wizard/flowchart.png b/libafl_wizard/flowchart.png new file mode 100644 index 0000000000000000000000000000000000000000..ec8e0ea188da8f13823f45975227cae8b5a219b0 GIT binary patch literal 114289 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Ðl=;*+HTz{Zx8dv)&%m3yxKI_eoB^4 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 literal 0 HcmV?d00001 diff --git a/libafl_wizard/fuzzers/fuzzer.rs b/libafl_wizard/fuzzers/fuzzer.rs new file mode 100644 index 0000000000..002835e657 --- /dev/null +++ b/libafl_wizard/fuzzers/fuzzer.rs @@ -0,0 +1,2 @@ +use libafl::prelude::*; + diff --git a/libafl_wizard/new_questions.toml b/libafl_wizard/new_questions.toml deleted file mode 100644 index 677c9e7ee2..0000000000 --- a/libafl_wizard/new_questions.toml +++ /dev/null @@ -1,294 +0,0 @@ -[[question]] -id = "intro" -title = "libafl_wizard: a tool to generate Libafl-based fuzzers." -content = """ -Before starting, make sure that you know your target very well. Choosing the right components to build a fuzzer depends on the details of the -implementation of your target. - -Knowing what you want before building a fuzzer can be extremely helpful when selecting the components that best fit your options and the -restrictions of the environment. - -Details such as: - *Having the source code of the target. - *Implementing a harness function to fuzz your target. - *Knowing the expected input by the target. - *Providing an initial set of inputs. - *The size of the target and the availability of memory. - *The possibility of memory corruption. - -Can be helpful during this process. -""" -answers = [ "Next" ] -next = [ "source code" ] -code = [] -previous = 0 -skip = false - -[[question]] -id = "source code" -title = "Do you have the target's source code?" -content = """ -Having the target's source code is interesting for performance. With the source code in hands, we can instrument the target, that is, -place coverage information to help our fuzzer identify new points of execution. - -Without instrumentation on the source, we have to rely on third-party applications to provide this infromation for our fuzzer, -such as QEMU, FRIDA or Tiny Inst. Note that QEMU only supports Linux. -""" -answers = [ "Yes", "No" ] -next = [ "harness", "" ] -code = [] -previous = 0 -skip = false - -[[question]] -id = "harness" -title = "Can you provide a harness function?" -content = """ -Providing a harness also has an impact on performance, for it allows in-process fuzzing. -""" -answers = [ "Yes", "No" ] -next = [ "special algorithm" ] -code = [ -""" -""", -""" -const MAP_SIZE: usize = 65536; - -let mut shmem = shmem_provider.new_shmem(MAP_SIZE).unwrap(); -shmem.write_to_env("__AFL_SHM_ID").unwrap(); -let shmem_buf = shmem.as_mut_slice(); -""" ] -previous = 0 -skip = false - -[[question]] -id = "special algorithm" -title = "Do you want to use some special algorithm to select and update testcases from the corpus?" -content = """ -Usually, a testcase that reaches a new execution point or achieves the desired objective, e.g. a crash on the target, are deemed interesting, -stored for later use and then selected using a determined policy. However, we can select which testcases to use based on variable aspects: for -instance, we can prioritize testacases that are smaller in size and take less time to execute (following a minimization policy). - -There are many algorithms supported by Libafl to choose, for more information, please read the libafl documentation on Schedulers and Stages. -""" -answers = [ "Yes", "No" ] -next = [ "algorithm options", "special input" ] -code = [ -""" -""", -""" -let scheduler = QueueScheduler::new(); - -let mut stages = tuple_list!(StdMutationalStage::new(mutator)); -""" ] -previous = 0 -skip = false - -[[question]] -id = "algorithm options" -title = "Which of the following options would you like to use?" -content = """ -(maybe give a quick explanation about each?) -""" -answers = [ "Accounting", "Ecofuzz", "Minimizer", "Power Scheduling", "Probabilistic Sampling", "Weighted" ] -next = [ "special input" ] -code = [ -""" -let scheduler = CoverageAccountingScheduler::new(&mut state, QueueScheduler::new(), unsafe { - &ACCOUNTING_MEMOP_MAP - }); - -let mut stages = tuple_list!(StdMutationalStage::new(mutator)); -""", -""" -let scheduler = EcoScheduler:new(&mut state, &observer); - -let mut stages = tuple_list!(StdMutationalStage::new(mutator)); -""", -""" -let scheduler = IndexesLenTimeMinimizerScheduler::new(QueueScheduler::new()); - -let mut stages = tuple_list!(StdMutationalStage::new(mutator)); -""", -""" -let scheduler = PowerQueueScheduler::new( - &mut state, - &observer, - PowerSchedule::FAST, -); - -let mut stages = tuple_list!(PowerMutationalStage::new(mutator)); -""", -""" -let scheduler = ProbabilitySamplingScheduler::new(); - -let mut stages = tuple_list!(StdMutationalStage::new(mutator)); -""", -""" -let time_observer = TimeObserver::new("time"); - -let scheduler = StdWeightedScheduler::with_schedule( - &mut state, - &observer, - Some(PowerSchedule::FAST), -); - -let calibration = CalibrationStage::new(&map_feedback); - -let power = StdPowerMutationalStage::new(mutator); - -let mut stages = tuple_list!(calibration, power); -""" ] -previous = 0 -skip = false - -[[question]] -id = "special input" -title = "Does your target require some special type of input?" -content = """ -Usually, libafl uses a map of bytes (BytesInput) to represent the input sent to the target for execution. (maybe cite some examples of data that can be represented as a map of bytes?) - -More abstract or complex inputs, such as Grammar-Based have their own type in libafl. There are many input representations supported by Libafl -to choose, for more information about each, please read the libafl documentation on Inputs. -""" -answers = [ "Yes", "No" ] -next = [ "input options", "crash/timeout" ] -code = [ -""" -""", -""" -let mutator = StdScheduledMutator::new(havoc_mutations()); -""" ] -previous = 0 -skip = false - -[[question]] -id = "input options" -title = "How can your input be represented?" -content = """ -(again, maybe give a quick explanation about each?) -""" -answers = [ "Encoded", "Grimoire", "Gramatron", "Nautilus" ] -next = [ "crash/timeout" ] -code = [ -""" -let mutator = StdScheduledMutator::with_max_stack_pow(encoded_mutations(), 2); -""", -""" -let generalization = GeneralizationStage::new(&observer); - -let mutator = StdScheduledMutator::with_max_stack_pow(havoc_mutations(), 2); - -let grimoire_mutator = StdScheduledMutator::with_max_stack_pow( - tuple_list!( - GrimoireExtensionMutator::new(), - GrimoireRecursiveReplacementMutator::new(), - GrimoireStringReplacementMutator::new(), - GrimoireRandomDeleteMutator::new(), - GrimoireRandomDeleteMutator::new(), - ), - 3, -); - -let mut stages = tuple_list!( - generalization, - StdMutationalStage::new(mutator), - StdMutationalStage::transforming(grimoire_mutator) -); -""", -""" -let mutator = StdScheduledMutator::with_max_stack_pow( - tuple_list!( - GramatronRandomMutator::new(&generator), - GramatronRandomMutator::new(&generator), - GramatronRandomMutator::new(&generator), - GramatronSpliceMutator::new(), - GramatronSpliceMutator::new(), - GramatronRecursionMutator::new() - ), - 2, -); -""", -""" -let mutator = StdScheduledMutator::with_max_stack_pow( - tuple_list!( - GramatronRandomMutator::new(&generator), - GramatronRandomMutator::new(&generator), - GramatronRandomMutator::new(&generator), - GramatronSpliceMutator::new(), - GramatronSpliceMutator::new(), - GramatronRecursionMutator::new() - ), - 2, - ); -""" ] -previous = 0 -skip = false - -[[question]] -id = "crash/timeout" -title = "Do you expect to cause a crash and/or a timeout on the target?" -content = """ -Determining the objective of the fuzzing campaign is essential to identify input that triggered critical errors on the target. - -Telling the fuzzer that we are looking for a crash mens that a testcase, which causes a crash on the target, fullfills the objective and, differently from the ones -that e.g. reach a new execution point, this testcase is saved in a separate folder for you to check the input that trigerred the crash. - -A timeout follows the same idea: a testcase that takes longer to execute than the defined timeout. - -It's even possible to join these two ideas to instruct the fuzzzer that any testcase, which causes a crash or takes long enough to execute, is stored. - -(I think that by crash, the fuzzer can catch the signal that finished the program and by timeout we are able to catch infinite recursion?) -""" -answers = [ "Crash or Timeout", "Crash", "Timeout" ] -next = [ "corrupt" ] -code = [ -""" -let mut objective = feedback_or_fast!( - CrashFeedback::new(), - TimeoutFeedback::new() -); -""", -""" -let mut objective = CrashFeedback::new(); -""", -""" -let mut objective = TimeoutFeedback::new(); -""" ] -previous = 0 -skip = false - -[[question]] -id = "corrupt" -title = "Can your target corrupt memory used by the fuzzer?" -content = """ -Under some circumstances, you may find your harness pretty unstable or your harness wreaks havoc on the global states. -In this case, you want to fork it before executing the harness runs in the child process so that it doesn't break things. -(from the book for now hahahaha) -""" -answers = [ "Yes", "No" ] -next = [ "", "" ] -code = [ -""" -let mut executor = InProcessForkExecutor::new( - &mut harness, - tuple_list!(observer), - &mut fuzzer, - &mut state, - &mut mgr, - shmem_provider, - ) - .expect("Failed to create the Executor"); -""", -""" -let mut executor = InProcessExecutor::new( - &mut harness, - tuple_list!(observer), - &mut fuzzer, - &mut state, - &mut mgr, - ) - .expect("Failed to create the Executor"); -""" ] -previous = 0 -skip = false diff --git a/libafl_wizard/old_questions.toml b/libafl_wizard/old_questions.toml deleted file mode 100644 index c03df17130..0000000000 --- a/libafl_wizard/old_questions.toml +++ /dev/null @@ -1,444 +0,0 @@ -[[question]] -id = "intro" -title = "Introduction" -content = """ -Description -New line -""" -answers = [ "Next" ] -next = [ "source code" ] -code = [] -previous = 0 -skip = false - -[[question]] -id = "source code" -title = "Do you have the target's source code?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "harness", "observers" ] -code = [ "", -"""let mut shmem_provider = UnixShMemProvider::new().unwrap();\n -let mut shmem = shmem_provider.new_shmem(MAP_SIZE).unwrap(); -shmem.write_to_env("__AFL_SHM_ID").unwrap(); -let shmem_buf = shmem.as_mut_slice();""" ] -previous = 0 -skip = false - -[[question]] -id = "harness" -title = "Can you provide a harness function?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "observers", "observers" ] -code = [ "", -"""let mut shmem_provider = UnixShMemProvider::new().unwrap();\n -let mut shmem = shmem_provider.new_shmem(MAP_SIZE).unwrap(); -shmem.write_to_env("__AFL_SHM_ID").unwrap(); -let shmem_buf = shmem.as_mut_slice();""" ] -previous = 0 -skip = false - -[[question]] -id = "observers" -title = "Observers" -content = "Description" -answers = [ "Next" ] -next = [ "map size" ] -code = [] -previous = 0 -skip = false - -[[question]] -id = "map size" -title = "Do you know the size of the map at compile time?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "hit counts", "hit counts" ] -code = [ "let observer = ConstMapObserver::<>::new()", "let observer = StdMapObserver::new()" ] -previous = 0 -skip = false - -[[question]] -id = "hit counts" -title = "Do you want to improve input selection by adding a hit counts map?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "feedback", "feedback" ] -code = [ "let observer = HitcountsMapObserver::new($)", "" ] -previous = 0 -skip = false - -[[question]] -id = "feedback" -title = "Feedback" -content = "Description" -answers = [ "Next" ] -next = [ "runtime" ] -code = [] -previous = 0 -skip = false - -[[question]] -id = "runtime" -title = "Do you want to keep track of the testcase's runtime?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "crash", "crash" ] -code = [ """let mut feedback = feedback_or!( -\tMaxMapFeedback::new(&observer), -\tTimeObserver::new() -)""", -"let mut feedback = MaxMapFeedback::new(&observer)" ] -previous = 0 -skip = false - -[[question]] -id = "crash" -title = "Do you want to consider a crash as a solution?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "timeout", "state" ] -code = [ "let mut objective = CrashFeedback::new()", "let mut objective = TimeoutFeedback::new()" ] -previous = 0 -skip = false - -[[question]] -id = "timeout" -title = "Do you want to consider a timeout as a solution?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "state", "state" ] -code = [ "let mut objective = feedback_and!($, TimeoutFeedback::new())", "" ] -previous = 0 -skip = false - -[[question]] -id = "state" -title = "State/Corpus" -content = "Description" -answers = [ "Next" ] -next = [ "manage testcases" ] -code = [] -previous = 0 -skip = false - -[[question]] -id = "manage testcases" -title = "Do you want to manage the testcases in memory, on disk or both?" -content = "Description" -answers = [ "On disk", "In memory", "Both" ] -next = [ "via cache", "load state", "load state" ] -code = [ "", "InMemoryCorpus::new()", "InMemoryOnDiskCorpus::new().unwrap()" ] -previous = 0 -skip = false - -[[question]] -id = "via cache" -title = "Do you want to load testcases from disk to memory using a cache?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "load state", "load state" ] -code = [ "CachedOnDiskCorpus::new().unwrap()", "OnDiskCorpus::new().unwrap()" ] -previous = 0 -skip = false - -[[question]] -id = "load state" -title = "" -content = "" -answers = [ "" ] -next = [ "monitors" ] -code = [ """let mut state = StdState::new( -\tStdRand::with_seed(current_nanos()), -\t$, -\tOnDiskCorpus::new(PathBuf::from("./crashes")).unwrap(), -\t&mut feedback, -\t&mut objective, -) -.unwrap()""" ] -previous = 0 -skip = false - -[[question]] -id = "monitors" -title = "Monitors" -content = "Description" -answers = [ "Next" ] -next = [ "stats" ] -code = [] -previous = 0 -skip = false - -[[question]] -id = "stats" -title = "Do you want to see stats about the fuzzing campaign?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "stats in ui", "stats to file" ] -code = [ "", "let mon = NopMonitor::new()" ] -previous = 0 -skip = false - -[[question]] -id = "stats in ui" -title = "Do you want to see the stats in a UI style?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "stats to file", "stats to file" ] -code = [ "let mon = (WIP)", """let mon = SimpleMonitor::new(|s| println!("{s}")""" ] -previous = 0 -skip = false - -[[question]] -id = "stats to file" -title = "Do you want to store the stats to a file too?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "file extensions", "events" ] -code = [ "", "" ] -previous = 0 -skip = false - -[[question]] -id = "file extensions" -title = "Do you want to store them to a TOML or JSON file?" -content = "Description" -answers = [ "TOML", "JSON" ] -next = [ "events", "events" ] -code = [ "let mon = OnDiskTOMLMonitor::new($)", "let mon = OnDiskJSONMonitor::new($)" ] -previous = 0 -skip = false - -[[question]] -id = "events" -title = "Events" -content = "Description" -answers = [ "Next" ] -next = [ "restart fuzzer" ] -code = [] -previous = 0 -skip = false - -[[question]] -id = "restart fuzzer" -title = "Do you want to restart your fuzzer every time a solution is achieved?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "restart fuzzer llmp", "restart fuzzer llmp" ] -code = [ "let mut mgr = SimpleRestartingEventManager::launch(mon)", "let mut mgr = SimpleEventManager::new(mon)" ] -previous = 0 -skip = false - -[[question]] -id = "restart fuzzer llmp" -title = "Do you want to restart your fuzzer every time a solution is achieved (LLMP)?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "schedulers", "schedulers" ] -code = [ "let mut mgr = LlmpRestartingEventManager::new(mon)", "let mut mgr = LlmpEventManager::new(mon).unwrap()" ] -previous = 0 -skip = false - -[[question]] -id = "schedulers" -title = "Schedulers" -content = "Description" -answers = [ "Next" ] -next = [ "queue policy" ] -code = [] -previous = 0 -skip = false - -[[question]] -id = "queue policy" -title = "Do you want to load testcases from the corpus using a queue policy?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "smaller and faster", "fuzzer" ] -code = [ "let scheduler = QueueScheduler::new()", "let scheduler = RandScheduler::new()" ] -previous = 0 -skip = false - -[[question]] -id = "smaller and faster" -title = "Do you want to prioritize smaller and faster testcases?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "fuzzer", "fuzzer" ] -code = [ "let scheduler = IndexesLenTimeMinimizerScheduler::new($)", "" ] -previous = 0 -skip = false - -[[question]] -id = "fuzzer" -title = "Fuzzer" -content = "Description" -answers = [ "Next" ] -next = [ "load fuzzer" ] -code = [] -previous = 0 -skip = false - -[[question]] -id = "load fuzzer" -title = "" -content = "" -answers = [ "" ] -next = [ "executors" ] -code = ["let mut fuzzer = StdFuzzer::new(scheduler, feedback, objective)" ] -previous = 0 -skip = false - -[[question]] -id = "executors" -title = "Executors" -content = "Description" -answers = [ "Next" ] -next = [ "corrupt memory" ] -code = [] -previous = 0 -skip = false - - -[[question]] -id = "corrupt memory" -title = "Can your target corrupt memory used by the fuzzer?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "in process timeout", "in process timeout" ] -code = [ """let mut shmem_provider = unix_shmem::UnixShMemProvider::new().unwrap();\n -let mut executor = InProcessForkExecutor::new( -\t&mut harness, -\ttuple_list!(observer), -\t&mut fuzzer, -\t&mut state, -\t&mut mgr, -\tshmem_provider -) -.expect("Failed to create the Executor")""", -"""let mut executor = InProcessExecutor::new( -\t&mut harness, -\ttuple_list!(observer), -\t&mut fuzzer, -\t&mut state, -\t&mut mgr, -)\ -.expect("Failed to create the Executor")""" -] -previous = 0 -skip = false - -[[question]] -id = "in process timeout" -title = "Do you want to set a timeout before each run?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "forkserver timeout", "forkserver timeout" ] -code = [ """let mut executor = TimeoutExecutor::new( -$, -Duration::from_secs() -)""", -"" ] -previous = 0 -skip = false - -[[question]] -id = "forkserver timeout" -title = "Do you want to set a timeout before each run (forkserver)?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "generators", "generators" ] -code = [ """let mut executor = TimeoutForkserverExecutor::new( -\t$, -\tDuration::from_secs() -)""", -"let mut executor = ForkserverExecutor::new()" ] -previous = 0 -skip = false - -[[question]] -id = "generators" -title = "Generators" -content = "Description" -answers = [ "Next" ] -next = [ "initial inputs" ] -code = [] -previous = 0 -skip = false - -[[question]] -id = "initial inputs" -title = "Do you want to generate an initial set of inputs?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "mutators", "mutators" ] -code = [ """let mut generator = RandBytesGenerator::new(32);\n -state -\t.generate_initial_inputs(&mut fuzzer, &mut executor, &mut generator, &mut mgr, 8) -\t.expect("Failed to generate the initial corpus")""" -, "" ] -previous = 0 -skip = false - -[[question]] -id = "mutators" -title = "Mutators" -content = "Description" -answers = [ "Next" ] -next = [ "schedule mutations" ] -code = [] -previous = 0 -skip = false - -[[question]] -id = "schedule mutations" -title = "Do you want to schedule mutations?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "stages", "stages" ] -code = [ "let mutator = StdScheduledMutator::new(havoc_mutations())", "" ] -previous = 0 -skip = false - -[[question]] -id = "stages" -title = "Stages" -content = "Description" -answers = [ "Next" ] -next = [ "StdMutationalStage" ] -code = [] -previous = 0 -skip = false - -[[question]] -id = "StdMutationalStage" -title = "Do you want to use the StdMutationalStage?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "fuzz loop", "fuzz loop" ] -code = [ "let mut stages = tuple_list!(StdMutationalStage::new())", "" ] -previous = 0 -skip = false - -[[question]] -id = "fuzz loop" -title = "" -content = "" -answers = [ "" ] -next = [ "end" ] -code = [ """fuzzer -\t.fuzz_loop(&mut stages, &mut executor, &mut state, &mut mgr) -\t.expect("Error in the fuzzing loop")""" ] -previous = 0 -skip = false - -[[question]] -id = "end" -title = "" -content = "" -answers = [] -next = [] -code = [] -previous = 0 -skip = false \ No newline at end of file diff --git a/libafl_wizard/questions.toml b/libafl_wizard/questions.toml index c03df17130..ca0549bfdf 100644 --- a/libafl_wizard/questions.toml +++ b/libafl_wizard/questions.toml @@ -1,444 +1,316 @@ [[question]] id = "intro" -title = "Introduction" +title = "libafl_wizard: a tool to generate Libafl-based fuzzers." content = """ -Description -New line +Before starting, make sure that you know your target very well. Choosing the right components to build a fuzzer depends on the details of the +implementation of your target. + +Knowing what you want before building a fuzzer can be extremely helpful when selecting the components that best fit your options and the +restrictions of the environment. + +Details such as: + *Having the source code of the target. + *Implementing a harness function to fuzz your target. + *Knowing the expected input by the target. + *Providing an initial set of inputs. + *The size of the target and the availability of memory. + *The possibility of memory corruption. + +Can be helpful during this process. """ answers = [ "Next" ] next = [ "source code" ] code = [] -previous = 0 -skip = false +skip = [] +skipped_by = "" +previous = "intro" [[question]] id = "source code" title = "Do you have the target's source code?" -content = "Description" +content = """ +Having the target's source code is interesting for performance. With the source code in hands, we can instrument the target, that is, +place coverage information to help our fuzzer identify new points of execution. + +Without instrumentation on the source, we have to rely on third-party applications to provide this infromation for our fuzzer, +such as QEMU, FRIDA or Tiny Inst. Note that QEMU only supports Linux. +""" answers = [ "Yes", "No" ] -next = [ "harness", "observers" ] -code = [ "", -"""let mut shmem_provider = UnixShMemProvider::new().unwrap();\n -let mut shmem = shmem_provider.new_shmem(MAP_SIZE).unwrap(); -shmem.write_to_env("__AFL_SHM_ID").unwrap(); -let shmem_buf = shmem.as_mut_slice();""" ] -previous = 0 -skip = false +next = [ "harness", "END" ] +code = [] +skip = [] +skipped_by = "" +previous = "" [[question]] id = "harness" title = "Can you provide a harness function?" -content = "Description" +content = """ +Providing a harness also has an impact on performance, for it allows in-process fuzzing. +""" answers = [ "Yes", "No" ] -next = [ "observers", "observers" ] -code = [ "", -"""let mut shmem_provider = UnixShMemProvider::new().unwrap();\n +next = [ "special algorithm" ] +code = [ +""" +""", +""" +const MAP_SIZE: usize = 65536; + let mut shmem = shmem_provider.new_shmem(MAP_SIZE).unwrap(); shmem.write_to_env("__AFL_SHM_ID").unwrap(); -let shmem_buf = shmem.as_mut_slice();""" ] -previous = 0 -skip = false - -[[question]] -id = "observers" -title = "Observers" -content = "Description" -answers = [ "Next" ] -next = [ "map size" ] -code = [] -previous = 0 -skip = false +let shmem_buf = shmem.as_mut_slice(); +""" ] +skip = [] +skipped_by = "" +previous = "" [[question]] -id = "map size" -title = "Do you know the size of the map at compile time?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "hit counts", "hit counts" ] -code = [ "let observer = ConstMapObserver::<>::new()", "let observer = StdMapObserver::new()" ] -previous = 0 -skip = false - -[[question]] -id = "hit counts" -title = "Do you want to improve input selection by adding a hit counts map?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "feedback", "feedback" ] -code = [ "let observer = HitcountsMapObserver::new($)", "" ] -previous = 0 -skip = false - -[[question]] -id = "feedback" -title = "Feedback" -content = "Description" -answers = [ "Next" ] -next = [ "runtime" ] -code = [] -previous = 0 -skip = false - -[[question]] -id = "runtime" -title = "Do you want to keep track of the testcase's runtime?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "crash", "crash" ] -code = [ """let mut feedback = feedback_or!( -\tMaxMapFeedback::new(&observer), -\tTimeObserver::new() -)""", -"let mut feedback = MaxMapFeedback::new(&observer)" ] -previous = 0 -skip = false - -[[question]] -id = "crash" -title = "Do you want to consider a crash as a solution?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "timeout", "state" ] -code = [ "let mut objective = CrashFeedback::new()", "let mut objective = TimeoutFeedback::new()" ] -previous = 0 -skip = false +id = "special algorithm" +title = "Do you want to use some special algorithm to select and update testcases from the corpus?" +content = """ +Usually, a testcase that reaches a new execution point or achieves the desired objective, e.g. a crash on the target, are deemed interesting, +stored for later use and then selected using a determined policy. However, we can select which testcases to use based on variable aspects: for +instance, we can prioritize testacases that are smaller in size and take less time to execute (following a minimization policy). -[[question]] -id = "timeout" -title = "Do you want to consider a timeout as a solution?" -content = "Description" +There are many algorithms supported by Libafl to choose, for more information, please read the libafl documentation on Schedulers and Stages. +""" answers = [ "Yes", "No" ] -next = [ "state", "state" ] -code = [ "let mut objective = feedback_and!($, TimeoutFeedback::new())", "" ] -previous = 0 -skip = false - -[[question]] -id = "state" -title = "State/Corpus" -content = "Description" -answers = [ "Next" ] -next = [ "manage testcases" ] -code = [] -previous = 0 -skip = false +next = [ "algorithm options", "special input" ] +code = [ +""" +""", +""" +let scheduler = QueueScheduler::new(); -[[question]] -id = "manage testcases" -title = "Do you want to manage the testcases in memory, on disk or both?" -content = "Description" -answers = [ "On disk", "In memory", "Both" ] -next = [ "via cache", "load state", "load state" ] -code = [ "", "InMemoryCorpus::new()", "InMemoryOnDiskCorpus::new().unwrap()" ] -previous = 0 -skip = false +let mut stages = tuple_list!(StdMutationalStage::new(mutator)); +""" ] +skip = [] +skipped_by = "" +previous = "" [[question]] -id = "via cache" -title = "Do you want to load testcases from disk to memory using a cache?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "load state", "load state" ] -code = [ "CachedOnDiskCorpus::new().unwrap()", "OnDiskCorpus::new().unwrap()" ] -previous = 0 -skip = false +id = "algorithm options" +title = "Which of the following options would you like to use?" +content = """ +(maybe give a quick explanation about each?) +""" +answers = [ "Accounting", "Ecofuzz", "Minimizer", "Power Scheduling", "Probabilistic Sampling", "Weighted" ] +next = [ "special input" ] +code = [ +""" +let scheduler = CoverageAccountingScheduler::new(&mut state, QueueScheduler::new(), unsafe { + &ACCOUNTING_MEMOP_MAP + }); -[[question]] -id = "load state" -title = "" -content = "" -answers = [ "" ] -next = [ "monitors" ] -code = [ """let mut state = StdState::new( -\tStdRand::with_seed(current_nanos()), -\t$, -\tOnDiskCorpus::new(PathBuf::from("./crashes")).unwrap(), -\t&mut feedback, -\t&mut objective, -) -.unwrap()""" ] -previous = 0 -skip = false +let mut stages = tuple_list!(StdMutationalStage::new(mutator)); +""", +""" +let scheduler = EcoScheduler:new(&mut state, &observer); -[[question]] -id = "monitors" -title = "Monitors" -content = "Description" -answers = [ "Next" ] -next = [ "stats" ] -code = [] -previous = 0 -skip = false +let mut stages = tuple_list!(StdMutationalStage::new(mutator)); +""", +""" +let scheduler = IndexesLenTimeMinimizerScheduler::new(QueueScheduler::new()); -[[question]] -id = "stats" -title = "Do you want to see stats about the fuzzing campaign?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "stats in ui", "stats to file" ] -code = [ "", "let mon = NopMonitor::new()" ] -previous = 0 -skip = false +let mut stages = tuple_list!(StdMutationalStage::new(mutator)); +""", +""" +let scheduler = PowerQueueScheduler::new( + &mut state, + &observer, + PowerSchedule::FAST, +); + +let mut stages = tuple_list!(PowerMutationalStage::new(mutator)); +""", +""" +let scheduler = ProbabilitySamplingScheduler::new(); -[[question]] -id = "stats in ui" -title = "Do you want to see the stats in a UI style?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "stats to file", "stats to file" ] -code = [ "let mon = (WIP)", """let mon = SimpleMonitor::new(|s| println!("{s}")""" ] -previous = 0 -skip = false +let mut stages = tuple_list!(StdMutationalStage::new(mutator)); +""", +""" +let time_observer = TimeObserver::new("time"); -[[question]] -id = "stats to file" -title = "Do you want to store the stats to a file too?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "file extensions", "events" ] -code = [ "", "" ] -previous = 0 -skip = false +let scheduler = StdWeightedScheduler::with_schedule( + &mut state, + &observer, + Some(PowerSchedule::FAST), +); -[[question]] -id = "file extensions" -title = "Do you want to store them to a TOML or JSON file?" -content = "Description" -answers = [ "TOML", "JSON" ] -next = [ "events", "events" ] -code = [ "let mon = OnDiskTOMLMonitor::new($)", "let mon = OnDiskJSONMonitor::new($)" ] -previous = 0 -skip = false +let calibration = CalibrationStage::new(&map_feedback); -[[question]] -id = "events" -title = "Events" -content = "Description" -answers = [ "Next" ] -next = [ "restart fuzzer" ] -code = [] -previous = 0 -skip = false +let power = StdPowerMutationalStage::new(mutator); -[[question]] -id = "restart fuzzer" -title = "Do you want to restart your fuzzer every time a solution is achieved?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "restart fuzzer llmp", "restart fuzzer llmp" ] -code = [ "let mut mgr = SimpleRestartingEventManager::launch(mon)", "let mut mgr = SimpleEventManager::new(mon)" ] -previous = 0 -skip = false +let mut stages = tuple_list!(calibration, power); +""" ] +skip = [] +skipped_by = "" +previous = "" [[question]] -id = "restart fuzzer llmp" -title = "Do you want to restart your fuzzer every time a solution is achieved (LLMP)?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "schedulers", "schedulers" ] -code = [ "let mut mgr = LlmpRestartingEventManager::new(mon)", "let mut mgr = LlmpEventManager::new(mon).unwrap()" ] -previous = 0 -skip = false - -[[question]] -id = "schedulers" -title = "Schedulers" -content = "Description" -answers = [ "Next" ] -next = [ "queue policy" ] -code = [] -previous = 0 -skip = false +id = "special input" +title = "Does your target require some special type of input?" +content = """ +Usually, libafl uses a map of bytes (BytesInput) to represent the input sent to the target for execution. (maybe cite some examples of data that can be represented as a map of bytes?) -[[question]] -id = "queue policy" -title = "Do you want to load testcases from the corpus using a queue policy?" -content = "Description" +More abstract or complex inputs, such as Grammar-Based have their own type in libafl. There are many input representations supported by Libafl +to choose, for more information about each, please read the libafl documentation on Inputs. +""" answers = [ "Yes", "No" ] -next = [ "smaller and faster", "fuzzer" ] -code = [ "let scheduler = QueueScheduler::new()", "let scheduler = RandScheduler::new()" ] -previous = 0 -skip = false +next = [ "input options", "crash/timeout" ] +code = [ +""" +""", +""" +let mutator = StdScheduledMutator::new(havoc_mutations()); +""" ] +skip = [] +skipped_by = "" +previous = "" [[question]] -id = "smaller and faster" -title = "Do you want to prioritize smaller and faster testcases?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "fuzzer", "fuzzer" ] -code = [ "let scheduler = IndexesLenTimeMinimizerScheduler::new($)", "" ] -previous = 0 -skip = false +id = "input options" +title = "How can your input be represented?" +content = """ +(again, maybe give a quick explanation about each?) +""" +answers = [ "Encoded", "Grimoire", "Gramatron", "Nautilus" ] +next = [ "crash/timeout" ] +code = [ +""" +let mutator = StdScheduledMutator::with_max_stack_pow(encoded_mutations(), 2); +""", +""" +let generalization = GeneralizationStage::new(&observer); + +let mutator = StdScheduledMutator::with_max_stack_pow(havoc_mutations(), 2); + +let grimoire_mutator = StdScheduledMutator::with_max_stack_pow( + tuple_list!( + GrimoireExtensionMutator::new(), + GrimoireRecursiveReplacementMutator::new(), + GrimoireStringReplacementMutator::new(), + GrimoireRandomDeleteMutator::new(), + GrimoireRandomDeleteMutator::new(), + ), + 3, +); + +let mut stages = tuple_list!( + generalization, + StdMutationalStage::new(mutator), + StdMutationalStage::transforming(grimoire_mutator) +); +""", +""" +let mutator = StdScheduledMutator::with_max_stack_pow( + tuple_list!( + GramatronRandomMutator::new(&generator), + GramatronRandomMutator::new(&generator), + GramatronRandomMutator::new(&generator), + GramatronSpliceMutator::new(), + GramatronSpliceMutator::new(), + GramatronRecursionMutator::new() + ), + 2, +); +""", +""" +let mutator = StdScheduledMutator::with_max_stack_pow( + tuple_list!( + GramatronRandomMutator::new(&generator), + GramatronRandomMutator::new(&generator), + GramatronRandomMutator::new(&generator), + GramatronSpliceMutator::new(), + GramatronSpliceMutator::new(), + GramatronRecursionMutator::new() + ), + 2, + ); +""" ] +skip = [] +skipped_by = "" +previous = "" + +[[question]] +id = "crash/timeout" +title = "Do you expect to cause a crash and/or a timeout on the target?" +content = """ +Determining the objective of the fuzzing campaign is essential to identify input that triggered critical errors on the target. -[[question]] -id = "fuzzer" -title = "Fuzzer" -content = "Description" -answers = [ "Next" ] -next = [ "load fuzzer" ] -code = [] -previous = 0 -skip = false +Telling the fuzzer that we are looking for a crash means that a testcase, which causes a crash on the target, fullfills the objective and, differently from the ones +that e.g. reach a new execution point, this testcase is saved in a separate folder for you to check the input that trigerred the crash. -[[question]] -id = "load fuzzer" -title = "" -content = "" -answers = [ "" ] -next = [ "executors" ] -code = ["let mut fuzzer = StdFuzzer::new(scheduler, feedback, objective)" ] -previous = 0 -skip = false +A timeout follows the same idea: a testcase that takes longer to execute than the defined timeout. -[[question]] -id = "executors" -title = "Executors" -content = "Description" -answers = [ "Next" ] -next = [ "corrupt memory" ] -code = [] -previous = 0 -skip = false +It's even possible to join these two ideas to instruct the fuzzzer that any testcase, which causes a crash or takes long enough to execute, is stored. +(I think that by crash, the fuzzer can catch the signal that finished the program and by timeout we are able to catch infinite recursion?) +""" +answers = [ "Crash or Timeout", "Crash", "Timeout" ] +next = [ "corrupt" ] +code = [ +""" +let mut objective = feedback_or_fast!( + CrashFeedback::new(), + TimeoutFeedback::new() +); +""", +""" +let mut objective = CrashFeedback::new(); +""", +""" +let mut objective = TimeoutFeedback::new(); +""" ] +skip = [] +skipped_by = "" +previous = "" [[question]] -id = "corrupt memory" +id = "corrupt" title = "Can your target corrupt memory used by the fuzzer?" -content = "Description" +content = """ +Under some circumstances, you may find your harness pretty unstable or your harness wreaks havoc on the global states. +In this case, you want to fork it before executing the harness runs in the child process so that it doesn't break things. +(from the book for now hahahaha) +""" answers = [ "Yes", "No" ] -next = [ "in process timeout", "in process timeout" ] -code = [ """let mut shmem_provider = unix_shmem::UnixShMemProvider::new().unwrap();\n +next = [ "END", "END" ] +code = [ +""" let mut executor = InProcessForkExecutor::new( -\t&mut harness, -\ttuple_list!(observer), -\t&mut fuzzer, -\t&mut state, -\t&mut mgr, -\tshmem_provider -) -.expect("Failed to create the Executor")""", -"""let mut executor = InProcessExecutor::new( -\t&mut harness, -\ttuple_list!(observer), -\t&mut fuzzer, -\t&mut state, -\t&mut mgr, -)\ -.expect("Failed to create the Executor")""" -] -previous = 0 -skip = false - -[[question]] -id = "in process timeout" -title = "Do you want to set a timeout before each run?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "forkserver timeout", "forkserver timeout" ] -code = [ """let mut executor = TimeoutExecutor::new( -$, -Duration::from_secs() -)""", -"" ] -previous = 0 -skip = false - -[[question]] -id = "forkserver timeout" -title = "Do you want to set a timeout before each run (forkserver)?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "generators", "generators" ] -code = [ """let mut executor = TimeoutForkserverExecutor::new( -\t$, -\tDuration::from_secs() -)""", -"let mut executor = ForkserverExecutor::new()" ] -previous = 0 -skip = false - -[[question]] -id = "generators" -title = "Generators" -content = "Description" -answers = [ "Next" ] -next = [ "initial inputs" ] -code = [] -previous = 0 -skip = false - -[[question]] -id = "initial inputs" -title = "Do you want to generate an initial set of inputs?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "mutators", "mutators" ] -code = [ """let mut generator = RandBytesGenerator::new(32);\n -state -\t.generate_initial_inputs(&mut fuzzer, &mut executor, &mut generator, &mut mgr, 8) -\t.expect("Failed to generate the initial corpus")""" -, "" ] -previous = 0 -skip = false - -[[question]] -id = "mutators" -title = "Mutators" -content = "Description" -answers = [ "Next" ] -next = [ "schedule mutations" ] -code = [] -previous = 0 -skip = false - -[[question]] -id = "schedule mutations" -title = "Do you want to schedule mutations?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "stages", "stages" ] -code = [ "let mutator = StdScheduledMutator::new(havoc_mutations())", "" ] -previous = 0 -skip = false - -[[question]] -id = "stages" -title = "Stages" -content = "Description" -answers = [ "Next" ] -next = [ "StdMutationalStage" ] -code = [] -previous = 0 -skip = false - -[[question]] -id = "StdMutationalStage" -title = "Do you want to use the StdMutationalStage?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "fuzz loop", "fuzz loop" ] -code = [ "let mut stages = tuple_list!(StdMutationalStage::new())", "" ] -previous = 0 -skip = false - -[[question]] -id = "fuzz loop" -title = "" -content = "" -answers = [ "" ] -next = [ "end" ] -code = [ """fuzzer -\t.fuzz_loop(&mut stages, &mut executor, &mut state, &mut mgr) -\t.expect("Error in the fuzzing loop")""" ] -previous = 0 -skip = false - -[[question]] -id = "end" -title = "" -content = "" + &mut harness, + tuple_list!(observer), + &mut fuzzer, + &mut state, + &mut mgr, + shmem_provider, + ) + .expect("Failed to create the Executor"); +""", +""" +let mut executor = InProcessExecutor::new( + &mut harness, + tuple_list!(observer), + &mut fuzzer, + &mut state, + &mut mgr, + ) + .expect("Failed to create the Executor"); +""" ] +skip = [] +skipped_by = "" +previous = "" + +[[question]] +id = "END" +title = "All questions answered!" +content = """ +YOU CAN CLOSE THIS WINDOW NOW +""" answers = [] -next = [] +next = [ ] code = [] -previous = 0 -skip = false \ No newline at end of file +skip = [] +skipped_by = "" +previous = "" \ No newline at end of file diff --git a/libafl_wizard/sections.toml b/libafl_wizard/sections.toml deleted file mode 100644 index e801b5159b..0000000000 --- a/libafl_wizard/sections.toml +++ /dev/null @@ -1,10 +0,0 @@ -in_process_skip_questions = [ - "restart fuzzer", - "corrupt memory", - "in process timeout", -] - -forkserver_skip_questions = [ - "restart fuzzer llmp", - "forkserver timeout", -] \ No newline at end of file diff --git a/libafl_wizard/src/lib.rs b/libafl_wizard/src/lib.rs index 3397b76d8d..b36514e2bd 100644 --- a/libafl_wizard/src/lib.rs +++ b/libafl_wizard/src/lib.rs @@ -1,52 +1,50 @@ +use graphviz_rust::{ + cmd::{CommandArg, Format}, + exec, + printer::PrinterContext, +}; use serde::Deserialize; -use std::{fs, fs::OpenOptions, io::Write, path::Path, process::Command}; -use toml; - -#[derive(Deserialize)] -struct Sections { - in_process_skip_questions: Vec, - forkserver_skip_questions: Vec, -} - -// Used to read the TOML file +use std::{ + fs::{create_dir, read_to_string, OpenOptions}, + io::Write, + path::Path, + process::Command, +}; +use toml::from_str; + +// Used to read the TOML file. #[derive(Deserialize)] -struct QuestionList { +pub struct QuestionList { question: Vec, } #[derive(Clone, Deserialize, PartialEq, Debug)] pub struct Question { - id: String, // ID is resolved to local indexes. + pub id: String, // ID is resolved to local indexes. pub title: String, pub content: String, // Description related to the question, to help the user. pub answers: Vec, // A vector containing all the possible answers for this question. - next: Vec, // A vector containing the next question for all the possible answers (for answer[0] the next question is next[0]...). - code: Vec, // Contains the Rust code associated to the question. - previous: usize, // The question that led to the current one. - skip: bool, // Marks questions that should be skipped. + pub next: Vec, // The next question for all the possible answers (for answer[0] the next question is next[0]...). + pub code: Vec, // Same for the code: for answer[0] the code associated to it is code[0]... + pub skip: Vec>, // The questions to skip if e.g. answer[0] is chosen. + pub skipped_by: String, // The question that skipped the current one. + pub previous: String, // The question that led to the current one. } impl Question { - // Builds the diagram of questions from the csv file (this will probably be changed, the csv is used only for demonstrative purposes). - // The diagram is a vector of Questions (vector of nodes): each Question, depending on the answer, will have the index of the next Question - // that should be asked. + // Builds the diagram of questions from the toml file. + // The diagram is a vector of Questions (vector of nodes): each Question, depending on the answer, will have the index of the next + // Question that should be asked. pub fn new() -> Vec { - let contents = - fs::read_to_string("questions.toml").expect("Failed to read questions file."); + let contents = read_to_string("questions.toml").expect("Failed to read questions file."); - let q_list: QuestionList = - toml::from_str(&contents).expect("Failed to parse toml questions."); - - // // Checks if each question is valid. - // for q in q_list.question.iter() { - // q.validate_question()?; - // } + let q_list: QuestionList = from_str(&contents).expect("Failed to parse toml questions."); q_list.question } pub fn end(&self) -> bool { - if self.id == "end" { + if self.id == "END" { return true; } @@ -66,7 +64,7 @@ impl Question { output.push_str(&format!("{}\n\n", self.content)); for ans in &self.answers { - output.push_str(&format!("\t{}", ans)); + output.push_str(&format!("\t\t{}", ans)); } output.push_str("\tUndo\n"); @@ -74,40 +72,43 @@ impl Question { print!("{}", output); } - pub fn resolve_answer( - &self, - questions: &Vec, - input: &String, - ) -> (usize, bool, usize) { - // The "Undo" option makes the generator go back to the previous question, so if the user do something by mistake, they can correct it. + pub fn resolve_answer(&self, questions: &Vec, input: &String) -> (usize, usize) { + // The "Undo" option makes the generator go back to the previous answered question, so if the user do something by mistake, + // they can correct it. if validate_input(&input, &String::from("Undo")) { - return (self.previous, true, 0); + let prev_i = self.find_question(questions, &self.previous); + + return (prev_i, 0); } - // Checks if the user typed one of the acceptable answers. If so, returns the index of the next question associated to that answer. - // For now we don't check for variants. - for (i, ans) in self.answers.iter().enumerate() { + // Checks if the user typed one of the acceptable answers. If so, returns the index of the next question associated to it. + for (mut i, ans) in self.answers.iter().enumerate() { if validate_input(&input, &ans) { - let mut next_q = self.next_question(questions, i); + // If this question has more than one answer, but all lead to the same next question. + if self.next.len() == 1 { + i = 0; + } + + let mut next_q = self.find_question(questions, &self.next[i]); // If the question should be skipped, then the generator goes to next question. // These types of questions should always have only one possibility for next question (this is the approach for now). - while questions[next_q].skip { - next_q = questions[next_q].next_question(questions, 0); + while !questions[next_q].skipped_by.is_empty() { + next_q = questions[next_q].find_question(questions, &self.next[0]); } - return (next_q, true, i); + return (next_q, i); } } - (0, false, 0) + (0, 0) } - // Resolves the index in the vector for the next question - pub fn next_question(&self, questions: &Vec, i: usize) -> usize { + // Resolves the index in the vector for the specific question. + pub fn find_question(&self, questions: &Vec, q: &String) -> usize { questions .iter() - .position(|question| question.id == self.next[i]) + .position(|question| &question.id == q) .unwrap() } @@ -119,174 +120,219 @@ impl Question { false } - pub fn has_title(&self) -> bool { - if !self.title.is_empty() { - return true; - } - - false - } - pub fn add_code(&self, code_content: &mut Vec, ans_i: usize) { if self.code[ans_i] != "" { + println!("ADDING for ANSWER {}:\n{}", ans_i, self.code[ans_i]); code_content.push(self.code[ans_i].to_string()); } } - pub fn check_skip( - &self, - questions: &mut Vec, - input: &String, - next_q: usize, - in_process_qs: &Vec, - forkserver_qs: &Vec, - ) { - // If the user doesn't have the source code or can't provide a harness, then in process fuzzing in not possible and the questions - // related to it are skipped. - if ((self.id == "source code") || (self.id == "harness")) - && validate_input(&input, &String::from("No")) - { - skip_questions(questions, &in_process_qs); - } - // If it is possible, then forkserver/llmp questions are skipped. - else if (self.id == "harness") && validate_input(&input, &String::from("Yes")) { - skip_questions(questions, &forkserver_qs); - // If the user is undoing, then the generator resets the questions that were marked to be skipped. - } else if ((self.id == "harness") - || (self.id == "observers") - || (self.id == "map size" - && (questions[next_q].id == "source code" || questions[next_q].id == "harness"))) - && validate_input(&input, &String::from("Undo")) - { - unskip_questions(questions, &in_process_qs); - unskip_questions(questions, &forkserver_qs); + pub fn check_skip(&self, questions: &mut Vec, ans_i: usize, undo: bool) { + for q_id in &self.skip[ans_i] { + let i = questions + .iter() + .position(|question| &question.id == q_id) + .unwrap(); + + if undo { + // If the user is undoing a question, we clear the ones that were skipped when this question was answered. + questions[i].skipped_by.clear(); + } else { + // If the user chooses an answer, we skip the questions associated to that answer. + questions[i].skipped_by = self.id.clone(); + } } } - pub fn update_previous(&mut self, curr_q: usize) -> () { + pub fn update_previous(&mut self, q_id: String) -> () { // Saves the current questions as the previous for the next one. - self.previous = curr_q; + self.previous = q_id; } } -pub fn read_sections() -> (Vec, Vec) { - let contents = fs::read_to_string("sections.toml").expect("Failed to read sections file."); +// Requires 'graphviz' to be installed on the machine, or results in an error. +pub fn flowchart_image(questions: &Vec) { + let mut dot_string = String::from("digraph t {\n"); - let sections: Sections = toml::from_str(&contents).expect("Failed to parse toml sections."); + for q in questions { + dot_string.push_str(&format!("\t\"{}\"[color=black]\n", q.title)); - ( - sections.in_process_skip_questions, - sections.forkserver_skip_questions, - ) -} - -pub fn skip_questions(questions: &mut Vec, vec: &Vec) -> () { - for q in vec { - let i = questions - .iter() - .position(|question| &question.id == q) - .unwrap(); + if q.next.len() == 1 { + let j = questions + .iter() + .position(|question| &question.id == &q.next[0]) + .unwrap(); - questions[i].skip = true; + // Yes or No questions that lead to the same next. + if q.answers.len() <= 2 { + for ans in &q.answers { + dot_string.push_str(&format!( + "\t\"{}\" -> \"{}\"\n[label=\"{}\"]", + q.title, questions[j].title, ans, + )); + } + } + // Multiple answers that lead to the same next. + else { + dot_string.push_str(&format!( + "\t\"{}\" -> \"{}\"\n[label=\"{}...\"]", + q.title, questions[j].title, q.answers[0], + )); + } + } + // Multiple answers that lead to distinct next questions. + else { + for (i, next_q) in q.next.iter().enumerate() { + let j = questions + .iter() + .position(|question| &question.id == next_q) + .unwrap(); + + dot_string.push_str(&format!( + "\t\"{}\" -> \"{}\"\n[label=\"{}\"]", + q.title, questions[j].title, q.answers[i], + )); + } + } } -} -// Undo option -pub fn unskip_questions(questions: &mut Vec, vec: &Vec) -> () { - for q in vec { - let i = questions - .iter() - .position(|question| &question.id == q) - .unwrap(); + dot_string.push_str("}"); - questions[i].skip = false; - } -} + let g = graphviz_rust::parse(&dot_string).unwrap(); -pub fn replace_code(code_content: &mut Vec) -> () { - let mut symb_count: usize; - - // For each String of Rust code that contains a '$', we replace this '$' by another String (another Rust code). This works like in wrappers. - // The only requirement is that, for each '$' found in that String, the order of replacement is: the firt occurence is replaced by - // the code that is at 'position_of_string - number_of_occ_of_$'. Then, since this String will be removed from the vector, the next occ of '$' - // can be replaced by a String at the same position (i - symb_count). - for s in code_content.clone() { - if s.contains('$') { - // Current position - let i = code_content - .iter() - .position(|code| code.as_str() == s) - .unwrap(); + let mut ctx = PrinterContext::default(); + ctx.always_inline(); - symb_count = s.chars().filter(|&c| c == '$').count(); + let _graph_png = exec( + g, + &mut ctx, + vec![ + CommandArg::Format(Format::Png), + CommandArg::Output("flowchart.png".to_string()), + ], + ) + .unwrap(); +} - for c in s.chars() { - if c == '$' { - // Since this component will be wrapped by another, it doesn't need to have an assigment to a variable. - //"let observer = StdMapObserver::new()" will become "StdMapObserver::new()" - if let Some(index) = code_content[i - symb_count].find("= ") { - code_content[i - symb_count].replace_range(..=index + 1, ""); - } +pub fn separate_code(code_content: Vec) -> Vec { + // List of libafl's components + let components = vec![ + "Observer", + "Feedback", + "State", + "Monitor", + "Event", + "Scheduler", + "Fuzzer", + "Executor", + "Generator", + "Mutator", + "Stage", + ]; + + let mut new_code_content: Vec = Vec::new(); + let mut code_line = String::new(); + let mut pos = 0; + + // Each field of 'code_content' contains rust code but not necessarily individual declarations of components, so we separate + // the instances of components. + for code_string in code_content { + while pos < code_string.len() { + let mut found_index = None; + + // Iterate through the components to find the next occurrence. + for component in &components { + if let Some(index) = code_string[pos..].find(component) { + found_index = Some(pos + index); + break; + } + } - code_content[i] = s.replacen('$', &code_content[i - symb_count], 1); + match found_index { + Some(index) => { + let mut end = index; + code_line.push_str(&code_string[pos..end]); + + // We copy the declaration of the component until we hit a ';' (end of a statement). + for c in code_string[end..].chars() { + if c == ';' { + code_line.push(c); + end += 1; + break; + } else { + code_line.push(c); + } + + end += 1; + } - code_content.remove(i - symb_count); + // Now, 'code_string' contains everything up to (including) the declaration of the component. + new_code_content.push(code_line.clone()); + code_line.clear(); + pos = end; + } + None => { + // If it does not contain a component, we join it with the next component declaration. + code_line.push_str(&code_string[pos..]); + break; } } } } + + new_code_content } -// pub fn arrange_code(code_content: Vec) -> Vec { -// // List of libafl's components -// let components: Vec = vec!["Observer", "Feedback", "State", "Monitor", "Event", "Scheduler", "Fuzzer", "Executor", "Generator", "Mutator", "Stage"]; - -// let code_line = String::new(); - -// let mut final_code: Vec = Vec::new(); - -// // Each of the fields of 'code_content' contains a String, which contains a single or mroe lines of Rust code. -// // The idea here is to parse each String, looking for the Strings contained in 'components' as a substring, to find the components that -// // are going to be used. -// for s in code_content { -// for c in s.chars() { -// if c == ';' { -// code_line.push(c); - -// // 'code_line' contains a line of Rust code, so we check to see if it's a component. -// if let Some((i, _)) = components.iter().enumerate().find(|(_, comp)| code_line.contains(comp)) { -// // If it's a component, we must write it to 'final_code' in the same order as the 'components' vector. -// for (j, code) in final_code.iter().enumerate() { -// if let Some(k) = components.iter().position(|&other_comp| code.contains(other_comp)) { -// // If the current component in 'final_code' contains the same class of component, or if it contains a class that -// // goes after the current one, we place it in this position. -// if (other_comp == comp) || (i < k) { -// final_code.insert(j, code_line); -// break; -// } -// } - -// // If we've gone through the whole 'final_code' vector and didn't insert the code, this means we have a component -// // that must be add to the end. -// if j == final_code.len() { -// final_code.push(code_line); -// break; -// } -// } -// } -// else { -// // If it's not a component, we simply add it to the end. -// final_code.push(code_line); -// } -// } -// else { -// code_line.push(c); -// } -// } -// } - -// final_code -// } +pub fn arrange_code(code_content: Vec) -> Vec { + // List of libafl's components + let components = vec![ + "Observer", + "Feedback", + "State", + "Monitor", + "Event", + "Scheduler", + "Fuzzer", + "Executor", + "Generator", + "Mutator", + "Stage", + ]; + + let mut new_code_content: Vec = Vec::new(); + + for code_string in code_content { + if new_code_content.is_empty() { + new_code_content.push(code_string); + } else { + let mut insert_index = 0; + let mut inserted = false; + + for (i, s) in new_code_content.iter().enumerate() { + for comp in &components { + // Checks if the string we want to insert contains a component that should come before the current one. + if code_string.contains(comp) && !s.contains(comp) { + insert_index = i; + inserted = true; + break; + } + } + + if inserted { + break; + } + } + + if !inserted { + new_code_content.push(code_string); + } else { + new_code_content.insert(insert_index, code_string); + } + } + } + + new_code_content +} // Write Rust code in the file of the generated fuzzer. pub fn write_code(code_content: Vec) -> String { @@ -295,7 +341,7 @@ pub fn write_code(code_content: Vec) -> String { let fuzzers_folder = "./fuzzers"; if !Path::new(fuzzers_folder).exists() { - fs::create_dir(fuzzers_folder).expect("Failed to create fuzzers directory."); + create_dir(fuzzers_folder).expect("Failed to create fuzzers directory."); } // Creates "fuzzer.rs", "fuzzer_1.rs" files if the previous one already exists... @@ -333,15 +379,14 @@ pub fn write_code(code_content: Vec) -> String { } pub fn validate_input(input: &String, ans: &String) -> bool { - let input_lower = input.to_lowercase(); - let ans_lower = ans.to_lowercase(); - - let mut input_chars = input_lower.chars(); - let mut ans_chars = ans_lower.chars(); - - // Basically, an aswer is valid if it is an acceptable variant of that given answer. Acceptable variants are strings that contain the - // characters in the same order as the answer, so for the answer "Yes", acceptable variants are: "y", "Ye", "yes", "YES", but not - // "Yess", "yy", "Yhes", "yYess"... + let input_low = input.to_lowercase(); + let mut input_chars = input_low.chars(); + let ans_low = ans.to_lowercase(); + let mut ans_chars = ans_low.chars(); + + // Basically, an aswer is valid if it is an acceptable variant of that given answer. Acceptable variants are strings that contain + // the characters in the same order as the answer, so for the answer "Yes", acceptable variants are: "y", "Ye", "yes", "YES", but + // not "Yess", "yy", "Yhes", "yYess"... while let (Some(input_c), Some(ans_c)) = (input_chars.next(), ans_chars.next()) { if input_c != ans_c { return false; diff --git a/libafl_wizard/src/main.rs b/libafl_wizard/src/main.rs index a1bcdde33b..47aa37c54e 100644 --- a/libafl_wizard/src/main.rs +++ b/libafl_wizard/src/main.rs @@ -1,63 +1,61 @@ -use libafl_wizard::{read_sections, replace_code, validate_input, write_code, Question}; -#[cfg(feature = "ui")] -use std::thread; -use std::{io, io::Write}; +use libafl_wizard::{ + arrange_code, flowchart_image, separate_code, validate_input, write_code, Question, +}; -#[cfg(feature = "ui")] slint::slint! { import { MainWindow } from "./src/ui.slint"; } -#[cfg(not(feature = "ui"))] fn main() { - // The question diagram is a vector containing all the questions + // The question diagram is a vector containing all the questions. let mut questions = Question::new(); - // Each element is a String, which contains the Rust code associated to a question. This will be used to write to the file + // Generate a flowchat image to help guide the user. + flowchart_image(&questions); + + // Each element is a String, which contains the Rust code associated to a question. This will be used to write to the file. let mut code_content: Vec = Vec::new(); - // Marks the questions that produced code that will be written. This has the same index as the questions in their vector - // Undo option + // Marks the questions that produced code that will be written. This has the same index as the questions in their vector. + // Undo option. let mut prod_code: Vec = vec![false; questions.len()]; - // Index of the current question + // Index of the current question. let mut curr_q = 0; - // Index of the next question - let mut next_q = 0; - // Index of the chosen answer - let mut ans_i = 0; - - let mut valid_ans; - - // User input - let mut input = String::new(); - - // Loads the vectors which contains the ids of questions that may be skipped - let (in_process_qs, forkserver_qs) = read_sections(); - - // Basically, a question is asked, answered by the user and then the generator moves on to the next question. - while !questions[curr_q].end() { - // If the question has a title, it means it contains information to show to the user and expects some input - if questions[curr_q].has_title() { - questions[curr_q].print_question(); - valid_ans = false; + let handle = MainWindow::new().unwrap(); - while !valid_ans { - input.clear(); - io::stdout().flush().unwrap(); - io::stdin() - .read_line(&mut input) - .expect("Failed to get input from stdin."); - input = input.trim().to_string(); + let handle_weak = handle.as_weak(); - (next_q, valid_ans, ans_i) = questions[curr_q].resolve_answer(&questions, &input); + let question_copy = questions[curr_q].clone(); + + // Initial display. + handle.set_question(SlintData { + title: question_copy.title.into(), + content: question_copy.content.into(), + answers: slint::ModelRc::from(std::rc::Rc::new(slint::VecModel::from( + question_copy + .answers + .into_iter() + .map(|s| s.into()) + .collect::>(), + ))), + next: slint::ModelRc::from(std::rc::Rc::new(slint::VecModel::from( + question_copy + .next + .into_iter() + .map(|s| s.into()) + .collect::>(), + ))), + previous: question_copy.previous.into(), + }); - println!("Please type a valid answer: "); - } - } else { - (next_q, _, ans_i) = questions[curr_q].resolve_answer(&questions, &input); - } + // This only gets executed when a button is pressed (answer is chosen). + handle.on_user_answer(move |answer| { + // User answer + let input: String = answer.parse::().unwrap().trim().to_string(); + // Index of the next question and the chosen answer. + let (next_q, ans_i) = questions[curr_q].resolve_answer(&questions, &input); if validate_input(&input, &String::from("Undo")) { // If the user chooses to undo a question that produced code, the associated code is removed. @@ -66,156 +64,67 @@ fn main() { code_content.pop(); prod_code[next_q] = false; } + + // Also, if we are undoing this question and it skipped others, we undo this too. + if !questions[next_q].skip.is_empty() { + questions[next_q] + .clone() + .check_skip(&mut questions, ans_i, true); + } } else { - // Adds the code associated to the user choice + // Adds the code associated to the user choice. if questions[curr_q].has_code() { questions[curr_q].add_code(&mut code_content, ans_i); prod_code[curr_q] = true; } - } - // Skip questions that are no longer possible - questions[curr_q].clone().check_skip( - &mut questions, - &input, - next_q, - &in_process_qs, - &forkserver_qs, - ); - - // Only updates the 'previous' field when going forward in the questions diagram - if !validate_input(&input, &String::from("Undo")) { - questions[next_q].update_previous(curr_q); + // If there are any questions that should be skipped because of that answer. + if !questions[curr_q].skip.is_empty() { + questions[curr_q] + .clone() + .check_skip(&mut questions, ans_i, false); + } + + // Only updates the 'previous' field when going forward (not undoing) in the questions diagram. + let q_id = questions[curr_q].id.clone(); + questions[next_q].update_previous(q_id); } curr_q = next_q; - } - - // Here, the vector 'code_content' contains all the code that will be written to the file, but we need to place the components in the correct order - // let final_code = arrange_code(code_content); - - replace_code(&mut code_content); - let file_name = write_code(code_content); - - println!("File {} successfully created!", file_name); - println!("\nAll questions answered."); -} - -#[cfg(feature = "ui")] -fn main() { - let handle = MainWindow::new().unwrap(); - let handle_weak = handle.as_weak(); - let program_thread = thread::spawn(move || { - // The question diagram is a vector containing all the questions - let mut questions = Question::new(); - - // Each element is a String, which contains the Rust code associated to a question. This will be used to write to the file - let mut code_content: Vec = Vec::new(); - - // Marks the questions that produced code that will be written. This has the same index as the questions in their vector - // Undo option - let mut prod_code: Vec = vec![false; questions.len()]; - - // Index of the current question - let mut curr_q = 0; - // Index of the next question - let mut next_q = 0; - // Index of the chosen answer - let mut ans_i = 0; - - let mut valid_ans; - - // User input - let mut input = String::new(); - - // Loads the vectors which contains the ids of questions that may be skipped - let (in_process_qs, forkserver_qs) = read_sections(); - - // Basically, a question is asked, answered by the user and then the generator moves on to the next question. - while !questions[curr_q].end() { - // If the question has a title, it means it contains information to show to the user and expects some input - if questions[curr_q].has_title() { - valid_ans = false; - - while !valid_ans { - input.clear(); - io::stdout().flush().unwrap(); - - let handle_copy = handle_weak.clone(); - - let question_copy = questions[curr_q].clone(); - - slint::invoke_from_event_loop(move || { - handle_copy.unwrap().set_question(SlintData { - title: question_copy.title.clone().into(), - content: question_copy.content.clone().into(), - answers: std::rc::Rc::new(slint::VecModel::from(vec![ - "answer1".into(), - "answer2".into(), - "answer3".into(), - ])) - .into(), - }) - }); - while input.is_empty() { - println!("input = {}", input); - } - - input = input.trim().to_string(); - - (next_q, valid_ans, ans_i) = - questions[curr_q].resolve_answer(&questions, &input); - } - } else { - (next_q, _, ans_i) = questions[curr_q].resolve_answer(&questions, &input); - } - - if validate_input(&input, &String::from("Undo")) { - // If the user chooses to undo a question that produced code, the associated code is removed. - // Since the Undo option goes backwards, we can simply pop the last piece of code. - if prod_code[next_q] { - code_content.pop(); - prod_code[next_q] = false; - } - } else { - // Adds the code associated to the user choice - if questions[curr_q].has_code() { - questions[curr_q].add_code(&mut code_content, ans_i); - prod_code[curr_q] = true; - } - } - - // Skip questions that are no longer possible - questions[curr_q].clone().check_skip( - &mut questions, - &input, - next_q, - &in_process_qs, - &forkserver_qs, + let question_copy = questions[curr_q].clone(); + + handle_weak.unwrap().set_question(SlintData { + title: question_copy.title.into(), + content: question_copy.content.into(), + answers: slint::ModelRc::from(std::rc::Rc::new(slint::VecModel::from( + question_copy + .answers + .into_iter() + .map(|s| s.into()) + .collect::>(), + ))), + next: slint::ModelRc::from(std::rc::Rc::new(slint::VecModel::from( + question_copy + .next + .into_iter() + .map(|s| s.into()) + .collect::>(), + ))), + previous: question_copy.previous.into(), + }); + + if questions[curr_q].end() { + // Separate by instances of components, arrange them in the correct order and write to the file. + let file_name = write_code(arrange_code(separate_code(code_content.clone()))); + + println!( + "File {} successfully created at the ./fuzzers directory.\n\nAll questions answered, you can close the window now!", + file_name ); - - // Only updates the 'previous' field when going forward in the questions diagram - if !validate_input(&input, &String::from("Undo")) { - questions[next_q].update_previous(curr_q); - } - - curr_q = next_q; } - - // Here, the vector 'code_content' contains all the code that will be written to the file, but we need to place the components in the correct order - // let final_code = arrange_code(code_content); - - replace_code(&mut code_content); - - let file_name = write_code(code_content); - - println!("File {} successfully created!", file_name); - println!("\nAll questions answered."); }); - // Start the GUI event loop + // GUI event loop. handle.run().unwrap(); - - program_thread.join().unwrap(); } diff --git a/libafl_wizard/src/ui.slint b/libafl_wizard/src/ui.slint index 5adfaff91f..84ea00a480 100644 --- a/libafl_wizard/src/ui.slint +++ b/libafl_wizard/src/ui.slint @@ -2,12 +2,14 @@ struct SlintData { title: string, content: string, answers: [string], + next: [string], + previous: string, } component AnswerButton inherits Rectangle { in-out property text <=> answer.text; - callback clicked <=> touch.clicked; + callback clicked; border-radius: 10px; border-width: 2px; @@ -20,41 +22,69 @@ component AnswerButton inherits Rectangle { x: ((parent.width - self.width) / 2) + (touch.pressed ? 2px : 0); y: ((parent.height - self.height) / 2) + (touch.pressed ? 1px : 0); color: touch.pressed ? #fff : #eee; + font-size: 16px; } - touch := TouchArea { } + touch := TouchArea { + clicked => { + root.clicked(); + } + } } export component MainWindow inherits Window { in-out property question; + callback user_answer(string); + background: #0f0f0f; title: "libafl_wizard"; icon: @image-url("../icons/libafl_wizard.png"); default-font-size: 20px; + width: 1100px; + height: 700px; VerticalLayout { - Text { - text: root.question.title; - color: white; - font-family: "Terminal"; + Rectangle { + Text { + text: root.question.title; + color: white; + font-family: "Consolas"; + font-weight: 900; + font-size: 20px; + } } - Text { - text: root.question.content; - color: white; - font-family: "Terminal"; + Rectangle { + Text { + text: root.question.content; + color: white; + font-family: "Ebrima"; + font-size: 16px; + } } + Rectangle { + + } + HorizontalLayout { spacing: 10px; for ans[i] in question.answers: AnswerButton { text: ans; + + clicked => { + root.user_answer(self.text); + } } - undo := AnswerButton{ + undo := AnswerButton { text: "Undo"; + + clicked => { + root.user_answer(self.text); + } } } } From 992da1ff3d8296d6a035e931b8a325d78e905886 Mon Sep 17 00:00:00 2001 From: matheusbaptistella Date: Tue, 14 Nov 2023 19:25:03 -0300 Subject: [PATCH 14/21] Removed the UI and replaced it by a CLI interface. --- libafl_wizard/Cargo.toml | 1 - libafl_wizard/README.md | 6 +- libafl_wizard/flowchart.png | Bin 114289 -> 22854 bytes libafl_wizard/new.toml | 70 +++++++++++ libafl_wizard/src/lib.rs | 225 ++++++++++++++++++++++-------------- libafl_wizard/src/main.rs | 137 ++++++++++------------ libafl_wizard/src/ui.slint | 91 --------------- 7 files changed, 268 insertions(+), 262 deletions(-) create mode 100644 libafl_wizard/new.toml delete mode 100644 libafl_wizard/src/ui.slint diff --git a/libafl_wizard/Cargo.toml b/libafl_wizard/Cargo.toml index 3316a70c2f..e4c6157abe 100644 --- a/libafl_wizard/Cargo.toml +++ b/libafl_wizard/Cargo.toml @@ -17,5 +17,4 @@ ui = [] [dependencies] toml = "0.7.6" serde = { version = "1.0", features = ["derive"] } -slint = "1.1.1" graphviz-rust = "0.6.6" \ No newline at end of file diff --git a/libafl_wizard/README.md b/libafl_wizard/README.md index a857abc5a0..31cf8b7493 100644 --- a/libafl_wizard/README.md +++ b/libafl_wizard/README.md @@ -2,11 +2,10 @@ libafl_wizard logo -libafl_wizard is a tool to generate fuzzers using libafl's components. By answering some questions, you will learn more about how libafl is used and generate your own fuzzer to test programs and help with the development of more secure code! +libafl_wizard is a tool to generate fuzzers using libafl's components. By answering some questions, while learning more about how libafl is used, you can generate your own fuzzer to test programs and help with the development of more secure code! ## Usage -(Probably remove this) libafl_wizard has a UI, made with [Slint](https://slint.dev/releases/1.1.1/docs/slint/), to help during the process. You can choose between answers by simply clicking on them and visualize where these answers might take you through a flowchart! ``` @@ -19,10 +18,7 @@ If you don't want or can't use libafl_wizard with the UI, it's possible to use t cargo run ``` -libafl_wizard also generates `flowchart.png`, an image to have an overall view of the questions diagram. Have in mind that this feature requires [Graphviz](https://graphviz.org/download/) to be installed on the machine. - ## Contributing libafl_wizard uses the `questions.toml` TOML file to store and load the questions that will be asked during the generation process. Each question contains some fields, like the possible answers for that question and the Rust code associated to those answers. As libafl's components get updated or new ones introduced, the questions need to be updated as well. -(this as well) For changes on the UI, please check the [Slint](https://slint.dev/releases/1.1.1/docs/slint/) documentation page to learn more about the language! diff --git a/libafl_wizard/flowchart.png b/libafl_wizard/flowchart.png index ec8e0ea188da8f13823f45975227cae8b5a219b0..f426453c6f04fb1cfc11b51fc3af233e8e58e8a1 100644 GIT binary patch literal 22854 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Ðl=;*+HTz{Zx8dv)&%m3yxKI_eoB^4 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 diff --git a/libafl_wizard/new.toml b/libafl_wizard/new.toml new file mode 100644 index 0000000000..af943e2845 --- /dev/null +++ b/libafl_wizard/new.toml @@ -0,0 +1,70 @@ +[[question]] +id = "intro" +title = "libafl_wizard: a tool to generate Libafl-based fuzzers." +content = """ +Before starting, make sure that you know your target very well. Choosing the right components to build a fuzzer depends on the details of the +implementation of your target. + +Knowing what you want before building a fuzzer can be extremely helpful when selecting the components that best fit your options and the +restrictions of the environment. + +Details such as: + *Having the source code of the target. + *Implementing a harness function to fuzz your target. + *Knowing the expected input by the target. + *Providing an initial set of inputs. + *The size of the target and the availability of memory. + *The possibility of memory corruption. + +Can be helpful during this process. +""" +skipped_by = "" +previous = "" + + [[question.answers]] + was_chosen = false + answer = "Next" + next = "source code" + code = "" + skip = [] + +[[question]] +id = "source code" +title = "Do you have the target's source code?" +content = """ +Having the target's source code is interesting for performance. With the source code in hands, we can instrument the target, that is, +place coverage information to help our fuzzer identify new points of execution. + +Without instrumentation on the source, we have to rely on third-party applications to provide this infromation for our fuzzer, +such as QEMU, FRIDA or Tiny Inst. Note that QEMU only supports Linux. +""" +skipped_by = "" +previous = "" + + [[question.answers]] + was_chosen = false + answer = "Yes" + next = "END" + code = "" + skip = [] + + [[question.answers]] + was_chosen = false + answer = "No" + next = "END" + code = "" + skip = [] + +[[question]] +id = "END" +title = "All questions answered!" +content = "" +skipped_by = "" +previous = "" + +[[question.answers]] + was_chosen = false + answer = "" + next = "" + code = "" + skip = [] \ No newline at end of file diff --git a/libafl_wizard/src/lib.rs b/libafl_wizard/src/lib.rs index b36514e2bd..2d484213d6 100644 --- a/libafl_wizard/src/lib.rs +++ b/libafl_wizard/src/lib.rs @@ -20,15 +20,21 @@ pub struct QuestionList { #[derive(Clone, Deserialize, PartialEq, Debug)] pub struct Question { - pub id: String, // ID is resolved to local indexes. - pub title: String, - pub content: String, // Description related to the question, to help the user. - pub answers: Vec, // A vector containing all the possible answers for this question. - pub next: Vec, // The next question for all the possible answers (for answer[0] the next question is next[0]...). - pub code: Vec, // Same for the code: for answer[0] the code associated to it is code[0]... - pub skip: Vec>, // The questions to skip if e.g. answer[0] is chosen. + pub id: String, // The id is resolved to local indexes. + pub title: String, // The question itself. + pub content: String, // Description related to the question, to help the user. pub skipped_by: String, // The question that skipped the current one. - pub previous: String, // The question that led to the current one. + pub previous: String, // The question that led to the current one. + pub answers: Vec, +} + +#[derive(Clone, Deserialize, PartialEq, Debug)] +pub struct Answer { + pub was_chosen: bool, // Used when undoing + pub answer: String, + pub next: String, // The next question if this answer is chosen. + pub code: String, // The code added to the file. + pub skip: Vec, // The questions to skip. } impl Question { @@ -36,7 +42,7 @@ impl Question { // The diagram is a vector of Questions (vector of nodes): each Question, depending on the answer, will have the index of the next // Question that should be asked. pub fn new() -> Vec { - let contents = read_to_string("questions.toml").expect("Failed to read questions file."); + let contents = read_to_string("new.toml").expect("Failed to read questions file."); let q_list: QuestionList = from_str(&contents).expect("Failed to parse toml questions."); @@ -54,47 +60,67 @@ impl Question { pub fn print_question(&self) { let mut output = String::new(); - clear_terminal_screen(); - // Construct the output string output.push_str(&format!( - "=========================\nFuzzer Template Generator\n=========================\n" + "+=====================+\n| libafl wizard |\n+=====================+\n" )); output.push_str(&format!("{}\n\n", self.title)); - output.push_str(&format!("{}\n\n", self.content)); + output.push_str(&format!("{}\n\n\t", self.content)); for ans in &self.answers { - output.push_str(&format!("\t\t{}", ans)); + output.push_str(&format!("{}{}", ans.answer, " ".repeat(8))); } - output.push_str("\tUndo\n"); + output.push_str("Undo\n"); print!("{}", output); } - pub fn resolve_answer(&self, questions: &Vec, input: &String) -> (usize, usize) { - // The "Undo" option makes the generator go back to the previous answered question, so if the user do something by mistake, - // they can correct it. + // Checks if the user typed one of the acceptable answers or is undoing. + pub fn is_answer(&self, input: &String) -> bool { + if input.is_empty() { + return false; + } + + for ans in &self.answers { + if validate_input(&input, &ans.answer) { + return true; + } + } + if validate_input(&input, &String::from("Undo")) { - let prev_i = self.find_question(questions, &self.previous); + return true; + } + + false + } - return (prev_i, 0); + pub fn chosen_ans(&self) -> usize { + for (i, ans) in self.answers.iter().enumerate() { + if ans.was_chosen { + return i; + } } - // Checks if the user typed one of the acceptable answers. If so, returns the index of the next question associated to it. - for (mut i, ans) in self.answers.iter().enumerate() { - if validate_input(&input, &ans) { - // If this question has more than one answer, but all lead to the same next question. - if self.next.len() == 1 { - i = 0; - } + 0 + } - let mut next_q = self.find_question(questions, &self.next[i]); + pub fn resolve_answer(&self, questions: &Vec, input: &String) -> (usize, usize) { + // Checks which of the acceptable answers the user typed. If so, returns the index of the next question associated to it. + for (i, ans) in self.answers.iter().enumerate() { + if validate_input(&input, &ans.answer) { + // // If this question has more than one answer, but all lead to the same next question. + // if ans.next.len() == 1 { + // i = 0; + // } + + let mut next_q = find_question(questions, &ans.next); // If the question should be skipped, then the generator goes to next question. - // These types of questions should always have only one possibility for next question (this is the approach for now). + // These types of questions should always have only one possibility for next question. while !questions[next_q].skipped_by.is_empty() { - next_q = questions[next_q].find_question(questions, &self.next[0]); + next_q = find_question(questions, &ans.next); + //&self.next[0] } return (next_q, i); @@ -104,43 +130,26 @@ impl Question { (0, 0) } - // Resolves the index in the vector for the specific question. - pub fn find_question(&self, questions: &Vec, q: &String) -> usize { - questions - .iter() - .position(|question| &question.id == q) - .unwrap() - } - - pub fn has_code(&self) -> bool { - if !self.code.is_empty() { - return true; - } - - false - } + pub fn skip_questions(&self, questions: &mut Vec, ans_i: usize) { + for q_id in &self.answers[ans_i].skip { + let i = questions + .iter() + .position(|question| &question.id == q_id) + .unwrap(); - pub fn add_code(&self, code_content: &mut Vec, ans_i: usize) { - if self.code[ans_i] != "" { - println!("ADDING for ANSWER {}:\n{}", ans_i, self.code[ans_i]); - code_content.push(self.code[ans_i].to_string()); + questions[i].skipped_by = self.id.clone(); } } - pub fn check_skip(&self, questions: &mut Vec, ans_i: usize, undo: bool) { - for q_id in &self.skip[ans_i] { + // Since we dont save which answer was chosen, we skip everything. + pub fn unskip_questions(&self, questions: &mut Vec, ans_i: usize) { + for q_id in &self.answers[ans_i].skip { let i = questions .iter() .position(|question| &question.id == q_id) .unwrap(); - if undo { - // If the user is undoing a question, we clear the ones that were skipped when this question was answered. - questions[i].skipped_by.clear(); - } else { - // If the user chooses an answer, we skip the questions associated to that answer. - questions[i].skipped_by = self.id.clone(); - } + questions[i].skipped_by.clear(); } } @@ -148,6 +157,36 @@ impl Question { // Saves the current questions as the previous for the next one. self.previous = q_id; } + + pub fn diff_next_questions(&self) -> bool { + for (i, ans1) in self.answers.iter().enumerate() { + for (j, ans2) in self.answers.iter().enumerate() { + if i != j { + if ans1.next != ans2.next { + return true; + } + } + } + } + + false + } +} + +impl Answer { + pub fn has_code(&self) -> bool { + if !self.code.is_empty() { + return true; + } + + false + } + + pub fn add_code(&self, code_content: &mut Vec) { + if !self.code.is_empty() { + code_content.push(self.code.to_string()); + } + } } // Requires 'graphviz' to be installed on the machine, or results in an error. @@ -155,44 +194,48 @@ pub fn flowchart_image(questions: &Vec) { let mut dot_string = String::from("digraph t {\n"); for q in questions { - dot_string.push_str(&format!("\t\"{}\"[color=black]\n", q.title)); + if !q.end() { + dot_string.push_str(&format!("\t\"{}\"[color=black]\n", q.title)); - if q.next.len() == 1 { - let j = questions - .iter() - .position(|question| &question.id == &q.next[0]) - .unwrap(); + // CHANGE HERE + if !q.diff_next_questions() { + let j = questions + .iter() + .position(|question| &question.id == &q.answers[0].next) + .unwrap(); - // Yes or No questions that lead to the same next. - if q.answers.len() <= 2 { - for ans in &q.answers { + // Yes or No questions that lead to the same next. + if q.answers.len() <= 2 { + for ans in &q.answers { + dot_string.push_str(&format!( + "\t\"{}\" -> \"{}\"\n[label=\"{}\"]", + q.title, questions[j].title, ans.answer, + )); + } + } else { + // Multiple answers that lead to the same next. dot_string.push_str(&format!( - "\t\"{}\" -> \"{}\"\n[label=\"{}\"]", - q.title, questions[j].title, ans, + "\t\"{}\" -> \"{}\"\n[label=\"{}...\"]", + q.title, questions[j].title, q.answers[0].answer, )); } } - // Multiple answers that lead to the same next. + // Multiple answers that lead to distinct next questions. else { - dot_string.push_str(&format!( - "\t\"{}\" -> \"{}\"\n[label=\"{}...\"]", - q.title, questions[j].title, q.answers[0], - )); - } - } - // Multiple answers that lead to distinct next questions. - else { - for (i, next_q) in q.next.iter().enumerate() { - let j = questions - .iter() - .position(|question| &question.id == next_q) - .unwrap(); + for ans in &q.answers { + let j = questions + .iter() + .position(|question| question.id == ans.next) + .unwrap(); - dot_string.push_str(&format!( - "\t\"{}\" -> \"{}\"\n[label=\"{}\"]", - q.title, questions[j].title, q.answers[i], - )); + dot_string.push_str(&format!( + "\t\"{}\" -> \"{}\"\n[label=\"{}\"]", + q.title, questions[j].title, ans.answer, + )); + } } + } else { + break; } } @@ -412,3 +455,11 @@ pub fn clear_terminal_screen() { .expect("failed to wait"); }; } + +// Resolves the index in the vector for the specific question. +pub fn find_question(questions: &Vec, q: &String) -> usize { + questions + .iter() + .position(|question| &question.id == q) + .unwrap() +} diff --git a/libafl_wizard/src/main.rs b/libafl_wizard/src/main.rs index 47aa37c54e..32b00387ac 100644 --- a/libafl_wizard/src/main.rs +++ b/libafl_wizard/src/main.rs @@ -1,10 +1,8 @@ use libafl_wizard::{ - arrange_code, flowchart_image, separate_code, validate_input, write_code, Question, + arrange_code, clear_terminal_screen, find_question, flowchart_image, separate_code, + validate_input, write_code, Question, }; - -slint::slint! { - import { MainWindow } from "./src/ui.slint"; -} +use std::{io, io::Write}; fn main() { // The question diagram is a vector containing all the questions. @@ -22,42 +20,44 @@ fn main() { // Index of the current question. let mut curr_q = 0; + // Index of the next question. + // Note that, when undoing, the next question is the previous one (that led to the current one). + let mut next_q; + // Index of the chosen answer. + let mut ans_i; + + let mut input = String::new(); + + // Basically, a question is shown, answered by the use and so on, until the last question. + while !questions[curr_q].end() { + clear_terminal_screen(); + + questions[curr_q].print_question(); + + print!("\nYour answer: "); + + io::stdout().flush().unwrap(); + io::stdin() + .read_line(&mut input) + .expect("Failed to get input from stdin."); + input = input.trim().to_string(); - let handle = MainWindow::new().unwrap(); - - let handle_weak = handle.as_weak(); - - let question_copy = questions[curr_q].clone(); - - // Initial display. - handle.set_question(SlintData { - title: question_copy.title.into(), - content: question_copy.content.into(), - answers: slint::ModelRc::from(std::rc::Rc::new(slint::VecModel::from( - question_copy - .answers - .into_iter() - .map(|s| s.into()) - .collect::>(), - ))), - next: slint::ModelRc::from(std::rc::Rc::new(slint::VecModel::from( - question_copy - .next - .into_iter() - .map(|s| s.into()) - .collect::>(), - ))), - previous: question_copy.previous.into(), - }); - - // This only gets executed when a button is pressed (answer is chosen). - handle.on_user_answer(move |answer| { - // User answer - let input: String = answer.parse::().unwrap().trim().to_string(); - // Index of the next question and the chosen answer. - let (next_q, ans_i) = questions[curr_q].resolve_answer(&questions, &input); + while !questions[curr_q].is_answer(&input) { + print!("Please, type a valid answer: "); + + io::stdout().flush().unwrap(); + input.clear(); + io::stdin() + .read_line(&mut input) + .expect("Failed to get input from stdin."); + input = input.trim().to_string(); + } if validate_input(&input, &String::from("Undo")) { + // The "Undo" option makes the generator go back to the previous answered question, so if the user do something by + // mistake they can correct it. + next_q = find_question(&questions, &questions[curr_q].previous); + // If the user chooses to undo a question that produced code, the associated code is removed. // Since the Undo option goes backwards, we can simply pop the last piece of code. if prod_code[next_q] { @@ -66,65 +66,46 @@ fn main() { } // Also, if we are undoing this question and it skipped others, we undo this too. - if !questions[next_q].skip.is_empty() { + ans_i = questions[curr_q].chosen_ans(); + if !questions[next_q].answers[ans_i].skip.is_empty() { questions[next_q] .clone() - .check_skip(&mut questions, ans_i, true); + .unskip_questions(&mut questions, ans_i); } + + questions[curr_q].answers[ans_i].was_chosen = false; } else { + (next_q, ans_i) = questions[curr_q].resolve_answer(&questions, &input); + + questions[curr_q].answers[ans_i].was_chosen = true; + // Adds the code associated to the user choice. - if questions[curr_q].has_code() { - questions[curr_q].add_code(&mut code_content, ans_i); + if questions[curr_q].answers[ans_i].has_code() { + questions[curr_q].answers[ans_i].add_code(&mut code_content); prod_code[curr_q] = true; } // If there are any questions that should be skipped because of that answer. - if !questions[curr_q].skip.is_empty() { + if !questions[curr_q].answers[ans_i].skip.is_empty() { questions[curr_q] .clone() - .check_skip(&mut questions, ans_i, false); + .skip_questions(&mut questions, ans_i); } // Only updates the 'previous' field when going forward (not undoing) in the questions diagram. let q_id = questions[curr_q].id.clone(); questions[next_q].update_previous(q_id); } + input.clear(); curr_q = next_q; + } - let question_copy = questions[curr_q].clone(); - - handle_weak.unwrap().set_question(SlintData { - title: question_copy.title.into(), - content: question_copy.content.into(), - answers: slint::ModelRc::from(std::rc::Rc::new(slint::VecModel::from( - question_copy - .answers - .into_iter() - .map(|s| s.into()) - .collect::>(), - ))), - next: slint::ModelRc::from(std::rc::Rc::new(slint::VecModel::from( - question_copy - .next - .into_iter() - .map(|s| s.into()) - .collect::>(), - ))), - previous: question_copy.previous.into(), - }); - - if questions[curr_q].end() { - // Separate by instances of components, arrange them in the correct order and write to the file. - let file_name = write_code(arrange_code(separate_code(code_content.clone()))); - - println!( - "File {} successfully created at the ./fuzzers directory.\n\nAll questions answered, you can close the window now!", - file_name - ); - } - }); + // Separate by instances of components, arrange them in the correct order and write to the file. + let file_name = write_code(arrange_code(separate_code(code_content))); - // GUI event loop. - handle.run().unwrap(); + println!( + "File {} successfully created under the ./fuzzers directory.\nAll questions answered!", + file_name + ); } diff --git a/libafl_wizard/src/ui.slint b/libafl_wizard/src/ui.slint deleted file mode 100644 index 84ea00a480..0000000000 --- a/libafl_wizard/src/ui.slint +++ /dev/null @@ -1,91 +0,0 @@ -struct SlintData { - title: string, - content: string, - answers: [string], - next: [string], - previous: string, -} - -component AnswerButton inherits Rectangle { - in-out property text <=> answer.text; - - callback clicked; - - border-radius: 10px; - border-width: 2px; - border-color: #ffffff; - background: touch.pressed ? #3b3b3b : touch.has-hover ? #1c1c1c : transparent; - height: answer.preferred-height * 2; - min-width: answer.preferred-width + 20px; - - answer := Text { - x: ((parent.width - self.width) / 2) + (touch.pressed ? 2px : 0); - y: ((parent.height - self.height) / 2) + (touch.pressed ? 1px : 0); - color: touch.pressed ? #fff : #eee; - font-size: 16px; - } - - touch := TouchArea { - clicked => { - root.clicked(); - } - } -} - -export component MainWindow inherits Window { - in-out property question; - - callback user_answer(string); - - background: #0f0f0f; - title: "libafl_wizard"; - icon: @image-url("../icons/libafl_wizard.png"); - default-font-size: 20px; - width: 1100px; - height: 700px; - - VerticalLayout { - Rectangle { - Text { - text: root.question.title; - color: white; - font-family: "Consolas"; - font-weight: 900; - font-size: 20px; - } - } - - Rectangle { - Text { - text: root.question.content; - color: white; - font-family: "Ebrima"; - font-size: 16px; - } - } - - Rectangle { - - } - - HorizontalLayout { - spacing: 10px; - - for ans[i] in question.answers: AnswerButton { - text: ans; - - clicked => { - root.user_answer(self.text); - } - } - - undo := AnswerButton { - text: "Undo"; - - clicked => { - root.user_answer(self.text); - } - } - } - } -} From 0ee6bb57b272229868e5bdb45ee88d57707ba385 Mon Sep 17 00:00:00 2001 From: matheusbaptistella Date: Wed, 22 Nov 2023 14:54:50 -0300 Subject: [PATCH 15/21] Developed an initial set of question and the functions to write code to the file (WIP). --- libafl_wizard/README.md | 17 +- libafl_wizard/flowchart.png | Bin 22854 -> 74583 bytes libafl_wizard/fuzzers/fuzzer.rs | 58 ++++ libafl_wizard/new.toml | 70 ----- libafl_wizard/questions.toml | 415 ++++++++++++---------------- libafl_wizard/src/answer.rs | 26 ++ libafl_wizard/src/lib.rs | 465 -------------------------------- libafl_wizard/src/main.rs | 41 ++- libafl_wizard/src/question.rs | 233 ++++++++++++++++ libafl_wizard/src/utils.rs | 178 ++++++++++++ 10 files changed, 689 insertions(+), 814 deletions(-) delete mode 100644 libafl_wizard/new.toml create mode 100644 libafl_wizard/src/answer.rs delete mode 100644 libafl_wizard/src/lib.rs create mode 100644 libafl_wizard/src/question.rs create mode 100644 libafl_wizard/src/utils.rs diff --git a/libafl_wizard/README.md b/libafl_wizard/README.md index 31cf8b7493..69dfd83b61 100644 --- a/libafl_wizard/README.md +++ b/libafl_wizard/README.md @@ -2,23 +2,22 @@ libafl_wizard logo -libafl_wizard is a tool to generate fuzzers using libafl's components. By answering some questions, while learning more about how libafl is used, you can generate your own fuzzer to test programs and help with the development of more secure code! +libafl_wizard is a tool to generate fuzzers using libafl's components. By answering some questions, you can generate your own fuzzer to test programs and help with the development of more secure code, all that while learning more about libafl and how it's used! ## Usage -libafl_wizard has a UI, made with [Slint](https://slint.dev/releases/1.1.1/docs/slint/), to help during the process. You can choose between answers by simply clicking on them and visualize where these answers might take you through a flowchart! +libafl_wizard has a cli interface and can be run with: ``` -cargo run --features ui +cargo run ``` -If you don't want or can't use libafl_wizard with the UI, it's possible to use the CLI version, but, as of now, this version doesn't contain a flowchart. +## Have in mind that... -``` -cargo run -``` +The tool makes use of [graphviz](https://graphviz.org/download/) to generate an image containing the flowchart of the questions diagram, so the users can know beforehand where the answers will take them. Make sure it's installed before running the tool. + +When writing answers, the check if an input is a valid answer is such that it simply verifies if what's typed by the user has the same characters so far as the answer (check out `validate_input()`). The thing is that, e.g. if "Crash or Timeout" and "Crash" are both valid answers, if the user answers "crash", the first option will be deemed correct (even though the user wanted the second one). To avoid that, for now, one can simply reverse these answers, so "Crash" comes before "Crash or Timeout". ## Contributing -libafl_wizard uses the `questions.toml` TOML file to store and load the questions that will be asked during the generation process. Each question contains some fields, like the possible answers for that question and the Rust code associated to those answers. As libafl's components get updated or new ones introduced, the questions need to be updated as well. -For changes on the UI, please check the [Slint](https://slint.dev/releases/1.1.1/docs/slint/) documentation page to learn more about the language! +libafl_wizard uses the `questions.toml` TOML file to store and load the questions that will be asked during the generation process. Each question contains some fields, like the possible answers for that question and the Rust code associated to those answers. As libafl's components get updated or new ones introduced, the questions need to be updated as well. diff --git a/libafl_wizard/flowchart.png b/libafl_wizard/flowchart.png index f426453c6f04fb1cfc11b51fc3af233e8e58e8a1..fc463e5763313a1da54707bb6870211d51a522df 100644 GIT binary patch literal 74583 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 literal 22854 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, // The questions to skip. +} + +impl Answer { + pub fn has_code(&self) -> bool { + if !self.code.is_empty() { + return true; + } + + false + } + + pub fn add_code(&self, code_content: &mut Vec) { + if !self.code.is_empty() { + code_content.push(self.code.to_string()); + } + } +} diff --git a/libafl_wizard/src/lib.rs b/libafl_wizard/src/lib.rs deleted file mode 100644 index 2d484213d6..0000000000 --- a/libafl_wizard/src/lib.rs +++ /dev/null @@ -1,465 +0,0 @@ -use graphviz_rust::{ - cmd::{CommandArg, Format}, - exec, - printer::PrinterContext, -}; -use serde::Deserialize; -use std::{ - fs::{create_dir, read_to_string, OpenOptions}, - io::Write, - path::Path, - process::Command, -}; -use toml::from_str; - -// Used to read the TOML file. -#[derive(Deserialize)] -pub struct QuestionList { - question: Vec, -} - -#[derive(Clone, Deserialize, PartialEq, Debug)] -pub struct Question { - pub id: String, // The id is resolved to local indexes. - pub title: String, // The question itself. - pub content: String, // Description related to the question, to help the user. - pub skipped_by: String, // The question that skipped the current one. - pub previous: String, // The question that led to the current one. - pub answers: Vec, -} - -#[derive(Clone, Deserialize, PartialEq, Debug)] -pub struct Answer { - pub was_chosen: bool, // Used when undoing - pub answer: String, - pub next: String, // The next question if this answer is chosen. - pub code: String, // The code added to the file. - pub skip: Vec, // The questions to skip. -} - -impl Question { - // Builds the diagram of questions from the toml file. - // The diagram is a vector of Questions (vector of nodes): each Question, depending on the answer, will have the index of the next - // Question that should be asked. - pub fn new() -> Vec { - let contents = read_to_string("new.toml").expect("Failed to read questions file."); - - let q_list: QuestionList = from_str(&contents).expect("Failed to parse toml questions."); - - q_list.question - } - - pub fn end(&self) -> bool { - if self.id == "END" { - return true; - } - - false - } - - pub fn print_question(&self) { - let mut output = String::new(); - - // Construct the output string - output.push_str(&format!( - "+=====================+\n| libafl wizard |\n+=====================+\n" - )); - output.push_str(&format!("{}\n\n", self.title)); - output.push_str(&format!("{}\n\n\t", self.content)); - - for ans in &self.answers { - output.push_str(&format!("{}{}", ans.answer, " ".repeat(8))); - } - - output.push_str("Undo\n"); - - print!("{}", output); - } - - // Checks if the user typed one of the acceptable answers or is undoing. - pub fn is_answer(&self, input: &String) -> bool { - if input.is_empty() { - return false; - } - - for ans in &self.answers { - if validate_input(&input, &ans.answer) { - return true; - } - } - - if validate_input(&input, &String::from("Undo")) { - return true; - } - - false - } - - pub fn chosen_ans(&self) -> usize { - for (i, ans) in self.answers.iter().enumerate() { - if ans.was_chosen { - return i; - } - } - - 0 - } - - pub fn resolve_answer(&self, questions: &Vec, input: &String) -> (usize, usize) { - // Checks which of the acceptable answers the user typed. If so, returns the index of the next question associated to it. - for (i, ans) in self.answers.iter().enumerate() { - if validate_input(&input, &ans.answer) { - // // If this question has more than one answer, but all lead to the same next question. - // if ans.next.len() == 1 { - // i = 0; - // } - - let mut next_q = find_question(questions, &ans.next); - - // If the question should be skipped, then the generator goes to next question. - // These types of questions should always have only one possibility for next question. - while !questions[next_q].skipped_by.is_empty() { - next_q = find_question(questions, &ans.next); - //&self.next[0] - } - - return (next_q, i); - } - } - - (0, 0) - } - - pub fn skip_questions(&self, questions: &mut Vec, ans_i: usize) { - for q_id in &self.answers[ans_i].skip { - let i = questions - .iter() - .position(|question| &question.id == q_id) - .unwrap(); - - questions[i].skipped_by = self.id.clone(); - } - } - - // Since we dont save which answer was chosen, we skip everything. - pub fn unskip_questions(&self, questions: &mut Vec, ans_i: usize) { - for q_id in &self.answers[ans_i].skip { - let i = questions - .iter() - .position(|question| &question.id == q_id) - .unwrap(); - - questions[i].skipped_by.clear(); - } - } - - pub fn update_previous(&mut self, q_id: String) -> () { - // Saves the current questions as the previous for the next one. - self.previous = q_id; - } - - pub fn diff_next_questions(&self) -> bool { - for (i, ans1) in self.answers.iter().enumerate() { - for (j, ans2) in self.answers.iter().enumerate() { - if i != j { - if ans1.next != ans2.next { - return true; - } - } - } - } - - false - } -} - -impl Answer { - pub fn has_code(&self) -> bool { - if !self.code.is_empty() { - return true; - } - - false - } - - pub fn add_code(&self, code_content: &mut Vec) { - if !self.code.is_empty() { - code_content.push(self.code.to_string()); - } - } -} - -// Requires 'graphviz' to be installed on the machine, or results in an error. -pub fn flowchart_image(questions: &Vec) { - let mut dot_string = String::from("digraph t {\n"); - - for q in questions { - if !q.end() { - dot_string.push_str(&format!("\t\"{}\"[color=black]\n", q.title)); - - // CHANGE HERE - if !q.diff_next_questions() { - let j = questions - .iter() - .position(|question| &question.id == &q.answers[0].next) - .unwrap(); - - // Yes or No questions that lead to the same next. - if q.answers.len() <= 2 { - for ans in &q.answers { - dot_string.push_str(&format!( - "\t\"{}\" -> \"{}\"\n[label=\"{}\"]", - q.title, questions[j].title, ans.answer, - )); - } - } else { - // Multiple answers that lead to the same next. - dot_string.push_str(&format!( - "\t\"{}\" -> \"{}\"\n[label=\"{}...\"]", - q.title, questions[j].title, q.answers[0].answer, - )); - } - } - // Multiple answers that lead to distinct next questions. - else { - for ans in &q.answers { - let j = questions - .iter() - .position(|question| question.id == ans.next) - .unwrap(); - - dot_string.push_str(&format!( - "\t\"{}\" -> \"{}\"\n[label=\"{}\"]", - q.title, questions[j].title, ans.answer, - )); - } - } - } else { - break; - } - } - - dot_string.push_str("}"); - - let g = graphviz_rust::parse(&dot_string).unwrap(); - - let mut ctx = PrinterContext::default(); - ctx.always_inline(); - - let _graph_png = exec( - g, - &mut ctx, - vec![ - CommandArg::Format(Format::Png), - CommandArg::Output("flowchart.png".to_string()), - ], - ) - .unwrap(); -} - -pub fn separate_code(code_content: Vec) -> Vec { - // List of libafl's components - let components = vec![ - "Observer", - "Feedback", - "State", - "Monitor", - "Event", - "Scheduler", - "Fuzzer", - "Executor", - "Generator", - "Mutator", - "Stage", - ]; - - let mut new_code_content: Vec = Vec::new(); - let mut code_line = String::new(); - let mut pos = 0; - - // Each field of 'code_content' contains rust code but not necessarily individual declarations of components, so we separate - // the instances of components. - for code_string in code_content { - while pos < code_string.len() { - let mut found_index = None; - - // Iterate through the components to find the next occurrence. - for component in &components { - if let Some(index) = code_string[pos..].find(component) { - found_index = Some(pos + index); - break; - } - } - - match found_index { - Some(index) => { - let mut end = index; - code_line.push_str(&code_string[pos..end]); - - // We copy the declaration of the component until we hit a ';' (end of a statement). - for c in code_string[end..].chars() { - if c == ';' { - code_line.push(c); - end += 1; - break; - } else { - code_line.push(c); - } - - end += 1; - } - - // Now, 'code_string' contains everything up to (including) the declaration of the component. - new_code_content.push(code_line.clone()); - code_line.clear(); - pos = end; - } - None => { - // If it does not contain a component, we join it with the next component declaration. - code_line.push_str(&code_string[pos..]); - break; - } - } - } - } - - new_code_content -} - -pub fn arrange_code(code_content: Vec) -> Vec { - // List of libafl's components - let components = vec![ - "Observer", - "Feedback", - "State", - "Monitor", - "Event", - "Scheduler", - "Fuzzer", - "Executor", - "Generator", - "Mutator", - "Stage", - ]; - - let mut new_code_content: Vec = Vec::new(); - - for code_string in code_content { - if new_code_content.is_empty() { - new_code_content.push(code_string); - } else { - let mut insert_index = 0; - let mut inserted = false; - - for (i, s) in new_code_content.iter().enumerate() { - for comp in &components { - // Checks if the string we want to insert contains a component that should come before the current one. - if code_string.contains(comp) && !s.contains(comp) { - insert_index = i; - inserted = true; - break; - } - } - - if inserted { - break; - } - } - - if !inserted { - new_code_content.push(code_string); - } else { - new_code_content.insert(insert_index, code_string); - } - } - } - - new_code_content -} - -// Write Rust code in the file of the generated fuzzer. -pub fn write_code(code_content: Vec) -> String { - let mut counter = 0; - let mut file_name = format!("fuzzer.rs"); - - let fuzzers_folder = "./fuzzers"; - if !Path::new(fuzzers_folder).exists() { - create_dir(fuzzers_folder).expect("Failed to create fuzzers directory."); - } - - // Creates "fuzzer.rs", "fuzzer_1.rs" files if the previous one already exists... - while Path::new(&format!("{}/{}", fuzzers_folder, file_name)).exists() { - counter += 1; - file_name = format!("fuzzer_{}.rs", counter); - } - - let file_path = format!("{}/{}", fuzzers_folder, file_name); - - let mut out_file = OpenOptions::new() - .append(true) - .create(true) - .open(&file_path) - .expect("Failed to open the fuzzer file."); - - // While imports are not resolved, use this. - out_file - .write_all("use libafl::prelude::*;\n\n".as_bytes()) - .expect("Failed to write to the fuzzer file."); - - for (i, code) in code_content.iter().enumerate() { - out_file - .write_all(code.as_bytes()) - .expect("Failed to write to the fuzzer file."); - - if i < code_content.len() { - out_file - .write_all(";\n\n".as_bytes()) - .expect("Failed to write to the fuzzer file."); - } - } - - file_name -} - -pub fn validate_input(input: &String, ans: &String) -> bool { - let input_low = input.to_lowercase(); - let mut input_chars = input_low.chars(); - let ans_low = ans.to_lowercase(); - let mut ans_chars = ans_low.chars(); - - // Basically, an aswer is valid if it is an acceptable variant of that given answer. Acceptable variants are strings that contain - // the characters in the same order as the answer, so for the answer "Yes", acceptable variants are: "y", "Ye", "yes", "YES", but - // not "Yess", "yy", "Yhes", "yYess"... - while let (Some(input_c), Some(ans_c)) = (input_chars.next(), ans_chars.next()) { - if input_c != ans_c { - return false; - } - } - - true -} - -pub fn clear_terminal_screen() { - if cfg!(target_os = "windows") { - Command::new("cmd") - .args(["/c", "cls"]) - .spawn() - .expect("cls command failed to start") - .wait() - .expect("failed to wait"); - } else { - Command::new("clear") - .spawn() - .expect("clear command failed to start") - .wait() - .expect("failed to wait"); - }; -} - -// Resolves the index in the vector for the specific question. -pub fn find_question(questions: &Vec, q: &String) -> usize { - questions - .iter() - .position(|question| &question.id == q) - .unwrap() -} diff --git a/libafl_wizard/src/main.rs b/libafl_wizard/src/main.rs index 32b00387ac..91db44367e 100644 --- a/libafl_wizard/src/main.rs +++ b/libafl_wizard/src/main.rs @@ -1,35 +1,30 @@ -use libafl_wizard::{ - arrange_code, clear_terminal_screen, find_question, flowchart_image, separate_code, - validate_input, write_code, Question, -}; use std::{io, io::Write}; +mod answer; +mod question; +mod utils; + +use question::{find_question, flowchart_image, Question}; +use utils::{arrange_code, clear_terminal_screen, separate_code, validate_input, write_code}; + fn main() { // The question diagram is a vector containing all the questions. let mut questions = Question::new(); - - // Generate a flowchat image to help guide the user. - flowchart_image(&questions); - // Each element is a String, which contains the Rust code associated to a question. This will be used to write to the file. let mut code_content: Vec = Vec::new(); - - // Marks the questions that produced code that will be written. This has the same index as the questions in their vector. - // Undo option. - let mut prod_code: Vec = vec![false; questions.len()]; - // Index of the current question. let mut curr_q = 0; - // Index of the next question. - // Note that, when undoing, the next question is the previous one (that led to the current one). + // Index of the next question. Note that, when undoing, the next question is the previous one (that led to the current one). let mut next_q; // Index of the chosen answer. let mut ans_i; - let mut input = String::new(); + // Generate a flowchat image to help guide the user. + flowchart_image(&questions); + // Basically, a question is shown, answered by the use and so on, until the last question. - while !questions[curr_q].end() { + while questions[curr_q].id != "END" { clear_terminal_screen(); questions[curr_q].print_question(); @@ -60,13 +55,14 @@ fn main() { // If the user chooses to undo a question that produced code, the associated code is removed. // Since the Undo option goes backwards, we can simply pop the last piece of code. - if prod_code[next_q] { - code_content.pop(); - prod_code[next_q] = false; + for ans in &questions[next_q].answers { + if ans.was_chosen && !ans.code.is_empty() { + code_content.pop(); + } } // Also, if we are undoing this question and it skipped others, we undo this too. - ans_i = questions[curr_q].chosen_ans(); + ans_i = questions[curr_q].chosen_answer(); if !questions[next_q].answers[ans_i].skip.is_empty() { questions[next_q] .clone() @@ -82,7 +78,6 @@ fn main() { // Adds the code associated to the user choice. if questions[curr_q].answers[ans_i].has_code() { questions[curr_q].answers[ans_i].add_code(&mut code_content); - prod_code[curr_q] = true; } // If there are any questions that should be skipped because of that answer. @@ -105,7 +100,7 @@ fn main() { let file_name = write_code(arrange_code(separate_code(code_content))); println!( - "File {} successfully created under the ./fuzzers directory.\nAll questions answered!", + "\nFile {} successfully created under the ./fuzzers directory.\nAll questions answered!", file_name ); } diff --git a/libafl_wizard/src/question.rs b/libafl_wizard/src/question.rs new file mode 100644 index 0000000000..8c55ffdda4 --- /dev/null +++ b/libafl_wizard/src/question.rs @@ -0,0 +1,233 @@ +use graphviz_rust::{ + cmd::{CommandArg, Format}, + exec, + printer::PrinterContext, +}; + +use std::fs::read_to_string; + +use serde::Deserialize; + +use toml::from_str; + +use crate::answer::Answer; +use crate::utils::validate_input; + +// Used to read the TOML file. +#[derive(Deserialize)] +pub struct QuestionList { + question: Vec, +} + +#[derive(Clone, Deserialize, PartialEq, Debug)] +pub struct Question { + pub id: String, // The id is resolved to local indexes. + pub title: String, // The question itself. + pub content: String, // Description related to the question, to help the user. + pub skipped_by: String, // The question that skipped the current one. + pub previous: String, // The question that led to the current one. + pub answers: Vec, +} + +impl Question { + // Builds the diagram of questions from the toml file. + // The diagram is a vector of Questions (vector of nodes): each Question, depending on the answer, will have the index of the next + // Question that should be asked. + pub fn new() -> Vec { + let contents = read_to_string("questions.toml").expect("Failed to read questions file."); + + let q_list: QuestionList = from_str(&contents).expect("Failed to parse toml questions."); + + q_list.question + } + + pub fn print_question(&self) { + let mut output = String::new(); + + // Construct the output string + output.push_str(&format!( + "+=====================+\n| libafl wizard |\n+=====================+\n\n" + )); + output.push_str(&format!("{}\n\n", self.title)); + output.push_str(&format!("{}\n\n\t", self.content)); + + for ans in &self.answers { + output.push_str(&format!("{}{}", ans.answer, " ".repeat(8))); + } + + output.push_str("Undo\n"); + + print!("{}", output); + } + + // Checks if the user typed one of the acceptable answers or is undoing. + pub fn is_answer(&self, input: &String) -> bool { + if input.is_empty() { + return false; + } + + for ans in &self.answers { + if validate_input(&input, &ans.answer) { + return true; + } + } + + if validate_input(&input, &String::from("Undo")) { + return true; + } + + false + } + + pub fn chosen_answer(&self) -> usize { + for (i, ans) in self.answers.iter().enumerate() { + if ans.was_chosen { + return i; + } + } + + 0 + } + + pub fn resolve_answer(&self, questions: &Vec, input: &String) -> (usize, usize) { + // Checks which of the acceptable answers the user typed. If so, returns the index of the next question associated to it. + for (i, ans) in self.answers.iter().enumerate() { + if validate_input(&input, &ans.answer) { + let mut next_q = find_question(questions, &ans.next); + + // If the question should be skipped, then the wizard goes to next question. + // These types of questions should always have only one possibility for next question because the wizard cant infer + // which answer the user would have chosen. + while !questions[next_q].skipped_by.is_empty() { + next_q = find_question(questions, &ans.next); + } + + return (next_q, i); + } + } + + (0, 0) + } + + pub fn skip_questions(&self, questions: &mut Vec, ans_i: usize) { + for q_id in &self.answers[ans_i].skip { + let i = questions + .iter() + .position(|question| &question.id == q_id) + .unwrap(); + + questions[i].skipped_by = self.id.clone(); + } + } + + pub fn unskip_questions(&self, questions: &mut Vec, ans_i: usize) { + for q_id in &self.answers[ans_i].skip { + let i = questions + .iter() + .position(|question| &question.id == q_id) + .unwrap(); + + questions[i].skipped_by.clear(); + } + } + + pub fn update_previous(&mut self, q_id: String) -> () { + // Saves the current questions as the previous for the next one. + self.previous = q_id; + } + + pub fn diff_next_questions(&self) -> bool { + for (i, ans1) in self.answers.iter().enumerate() { + for (j, ans2) in self.answers.iter().enumerate() { + if i != j { + if ans1.next != ans2.next { + return true; + } + } + } + } + + false + } +} + +// Resolves the index in the vector for the specific question. +pub fn find_question(questions: &Vec, q: &String) -> usize { + questions + .iter() + .position(|question| &question.id == q) + .unwrap() +} + +// Requires 'graphviz' to be installed on the machine, or results in an error. +pub fn flowchart_image(questions: &Vec) { + let mut dot_string = String::from("digraph t {\n"); + + for q in questions { + if q.id != "END" { + dot_string.push_str(&format!("\t\"{}\"[color=black]\n", q.title)); + + // CHANGE HERE + if !q.diff_next_questions() { + let j = questions + .iter() + .position(|question| &question.id == &q.answers[0].next) + .unwrap(); + + // Yes or No questions that lead to the same next. + if q.answers.len() <= 2 { + for ans in &q.answers { + dot_string.push_str(&format!( + "\t\"{}\" -> \"{}\"\n[label=\"{}\"]", + q.title, questions[j].title, ans.answer, + )); + } + } else { + // Multiple answers that lead to the same next. + dot_string.push_str(&format!( + "\t\"{}\" -> \"{}\"\n[label=\"{}\"]", + q.title, questions[j].title, q.answers[0].answer, + )); + + dot_string.push_str(&format!( + "\t\"{}\" -> \"{}\"\n[label=\"...\"]", + q.title, questions[j].title, + )); + } + } + // Multiple answers that lead to distinct next questions. + else { + for ans in &q.answers { + let j = questions + .iter() + .position(|question| question.id == ans.next) + .unwrap(); + + dot_string.push_str(&format!( + "\t\"{}\" -> \"{}\"\n[label=\"{}\"]", + q.title, questions[j].title, ans.answer, + )); + } + } + } else { + break; + } + } + + dot_string.push_str("}"); + + let g = graphviz_rust::parse(&dot_string).unwrap(); + + let mut ctx = PrinterContext::default(); + ctx.always_inline(); + + let _graph_png = exec( + g, + &mut ctx, + vec![ + CommandArg::Format(Format::Png), + CommandArg::Output("flowchart.png".to_string()), + ], + ) + .unwrap(); +} diff --git a/libafl_wizard/src/utils.rs b/libafl_wizard/src/utils.rs new file mode 100644 index 0000000000..8c4340b521 --- /dev/null +++ b/libafl_wizard/src/utils.rs @@ -0,0 +1,178 @@ +use std::{ + fs::{create_dir, OpenOptions}, + io::Write, + path::Path, + process::Command, +}; + +pub fn clear_terminal_screen() { + if cfg!(target_os = "windows") { + Command::new("cmd") + .args(["/c", "cls"]) + .spawn() + .expect("cls command failed to start") + .wait() + .expect("failed to wait"); + } else { + Command::new("clear") + .spawn() + .expect("clear command failed to start") + .wait() + .expect("failed to wait"); + }; +} + +pub fn separate_code(code_content: Vec) -> Vec { + // List of libafl's components. + let components = vec![ + "Observer", + "Feedback", + "State", + "Monitor", + "Event", + "Scheduler", + "Fuzzer", + "Executor", + "Generator", + "Mutator", + "Stage", + ]; + + let mut separated_code: Vec = Vec::new(); + + for code_string in code_content { + let mut current_line = String::new(); + let mut in_code_block = false; + + for c in code_string.chars() { + current_line.push(c); + + if !in_code_block { + if components.iter().any(|&s| current_line.contains(s)) { + in_code_block = true; + } + } + + if in_code_block && c == ';' { + in_code_block = false; + separated_code.push(current_line.trim().to_string()); + current_line.clear(); + } + } + + separated_code.push(current_line.trim().to_string()); + } + + separated_code +} + +pub fn arrange_code(code_content: Vec) -> Vec { + // List of libafl's components. + let components = vec![ + "Observer", + "Feedback", + "State", + "Monitor", + "Event", + "Scheduler", + "Fuzzer", + "Executor", + "Generator", + "Mutator", + "Stage", + ]; + + let mut ordered_code_content: Vec = Vec::new(); + let mut unmatched_lines: Vec = Vec::new(); + + for code_line in code_content.iter() { + let mut matched = false; + + for component in components.iter() { + if code_line.contains(component) { + ordered_code_content.push(code_line.to_string()); + matched = true; + break; + } + } + + if !matched { + unmatched_lines.push(code_line.to_string()); + } + } + + // Append unmatched lines at the end. + ordered_code_content.extend(unmatched_lines); + + ordered_code_content +} + +// Write Rust code in the file of the generated fuzzer. +pub fn write_code(code_content: Vec) -> String { + let mut counter = 0; + let mut file_name = format!("fuzzer.rs"); + + let fuzzers_folder = "./fuzzers"; + if !Path::new(fuzzers_folder).exists() { + create_dir(fuzzers_folder).expect("Failed to create fuzzers directory."); + } + + // Creates "fuzzer.rs", "fuzzer_1.rs" files if the previous one already exists... + while Path::new(&format!("{}/{}", fuzzers_folder, file_name)).exists() { + counter += 1; + file_name = format!("fuzzer_{}.rs", counter); + } + + let file_path = format!("{}/{}", fuzzers_folder, file_name); + + let mut out_file = OpenOptions::new() + .append(true) + .create(true) + .open(&file_path) + .expect("Failed to open the fuzzer file."); + + // While imports are not resolved, use this. + out_file + .write_all("use libafl::prelude::*;\n\nfn main() {".as_bytes()) + .expect("Failed to write to the fuzzer file."); + + for (i, code) in code_content.iter().enumerate() { + out_file + .write_all("\n".as_bytes()) + .expect("Failed to write to the fuzzer file."); + + out_file + .write_all(code.as_bytes()) + .expect("Failed to write to the fuzzer file."); + + if i < code_content.len() { + out_file + .write_all("\n\n".as_bytes()) + .expect("Failed to write to the fuzzer file."); + } + } + + out_file + .write_all("}".as_bytes()) + .expect("Failed to write to the fuzzer file."); + + file_name +} + +pub fn validate_input(input: &String, ans: &String) -> bool { + let input_low = input.to_lowercase(); + let mut input_chars = input_low.chars(); + let ans_low = ans.to_lowercase(); + let mut ans_chars = ans_low.chars(); + + // Basically, an aswer is valid if it is an acceptable variant of that given answer. Acceptable variants are strings that contain + // the characters in the same order as the answer, so for the answer "Yes", acceptable variants are: "y", "Ye", "yes", "YES", but + // not "Yess", "yy", "Yhes", "yYess"... + while let (Some(input_c), Some(ans_c)) = (input_chars.next(), ans_chars.next()) { + if input_c != ans_c { + return false; + } + } + + true +} From 93ae225104b55b789bb19d6e3dd660606f56aff7 Mon Sep 17 00:00:00 2001 From: matheusbaptistella Date: Mon, 27 Nov 2023 19:15:53 -0300 Subject: [PATCH 16/21] Corrected the methods to arrange code and write it to the file --- libafl_wizard/fuzzers/fuzzer.rs | 60 --------------------------------- libafl_wizard/questions.toml | 2 -- libafl_wizard/src/main.rs | 2 +- libafl_wizard/src/question.rs | 10 +++--- libafl_wizard/src/utils.rs | 49 ++++++++++++--------------- 5 files changed, 28 insertions(+), 95 deletions(-) delete mode 100644 libafl_wizard/fuzzers/fuzzer.rs diff --git a/libafl_wizard/fuzzers/fuzzer.rs b/libafl_wizard/fuzzers/fuzzer.rs deleted file mode 100644 index a30021b73d..0000000000 --- a/libafl_wizard/fuzzers/fuzzer.rs +++ /dev/null @@ -1,60 +0,0 @@ -use libafl::prelude::*; - -fn main() { -/* Your harness function */ - - let mut executor = InProcessExecutor::new( - &mut harness, - tuple_list!(observer), - &mut fuzzer, - &mut state, - &mut mgr, - ) - .expect("Failed to create the Executor"); - - -let mut objective = CrashFeedback::new(); - - -let mut feedback = MaxMapFeedback::new(&observer); - - -let mut state = StdState::new( - StdRand::with_seed(current_nanos()), - InMemoryCorpus::new(), - OnDiskCorpus::new(PathBuf::from("./crashes")).unwrap(), - &mut feedback, - &mut objective, - ) - .unwrap(); - - -let mon = SimpleMonitor::new(|s| println!("{s}")); - - -let mut mgr = SimpleEventManager::new(mon); - - -let scheduler = QueueScheduler::new(); - - -let mut fuzzer = StdFuzzer::new(scheduler, feedback, objective); - - -let mutator = StdScheduledMutator::new(havoc_mutations()); - - -let mut stages = tuple_list!(StdMutationalStage::new(mutator)); - - - - - - - - -fuzzer - .fuzz_loop(&mut stages, &mut executor, &mut state, &mut mgr) - .expect("Error in the fuzzing loop"); - -} \ No newline at end of file diff --git a/libafl_wizard/questions.toml b/libafl_wizard/questions.toml index 00a55cd0d5..5c5df5737e 100644 --- a/libafl_wizard/questions.toml +++ b/libafl_wizard/questions.toml @@ -119,8 +119,6 @@ previous = "" answer = "No" next = "crash/timeout" code = """ - /* Your harness function */ - let mut executor = InProcessExecutor::new( &mut harness, tuple_list!(observer), diff --git a/libafl_wizard/src/main.rs b/libafl_wizard/src/main.rs index 91db44367e..09f098975a 100644 --- a/libafl_wizard/src/main.rs +++ b/libafl_wizard/src/main.rs @@ -55,7 +55,7 @@ fn main() { // If the user chooses to undo a question that produced code, the associated code is removed. // Since the Undo option goes backwards, we can simply pop the last piece of code. - for ans in &questions[next_q].answers { + for ans in questions[next_q].answers.iter() { if ans.was_chosen && !ans.code.is_empty() { code_content.pop(); } diff --git a/libafl_wizard/src/question.rs b/libafl_wizard/src/question.rs index 8c55ffdda4..7b5b593248 100644 --- a/libafl_wizard/src/question.rs +++ b/libafl_wizard/src/question.rs @@ -51,7 +51,7 @@ impl Question { output.push_str(&format!("{}\n\n", self.title)); output.push_str(&format!("{}\n\n\t", self.content)); - for ans in &self.answers { + for ans in self.answers.iter() { output.push_str(&format!("{}{}", ans.answer, " ".repeat(8))); } @@ -66,7 +66,7 @@ impl Question { return false; } - for ans in &self.answers { + for ans in self.answers.iter() { if validate_input(&input, &ans.answer) { return true; } @@ -110,7 +110,7 @@ impl Question { } pub fn skip_questions(&self, questions: &mut Vec, ans_i: usize) { - for q_id in &self.answers[ans_i].skip { + for q_id in self.answers[ans_i].skip.iter() { let i = questions .iter() .position(|question| &question.id == q_id) @@ -121,7 +121,7 @@ impl Question { } pub fn unskip_questions(&self, questions: &mut Vec, ans_i: usize) { - for q_id in &self.answers[ans_i].skip { + for q_id in self.answers[ans_i].skip.iter() { let i = questions .iter() .position(|question| &question.id == q_id) @@ -197,7 +197,7 @@ pub fn flowchart_image(questions: &Vec) { } // Multiple answers that lead to distinct next questions. else { - for ans in &q.answers { + for ans in q.answers.iter() { let j = questions .iter() .position(|question| question.id == ans.next) diff --git a/libafl_wizard/src/utils.rs b/libafl_wizard/src/utils.rs index 8c4340b521..0611ba0007 100644 --- a/libafl_wizard/src/utils.rs +++ b/libafl_wizard/src/utils.rs @@ -53,6 +53,7 @@ pub fn separate_code(code_content: Vec) -> Vec { } } + // The end of the declaration of a component. if in_code_block && c == ';' { in_code_block = false; separated_code.push(current_line.trim().to_string()); @@ -60,7 +61,9 @@ pub fn separate_code(code_content: Vec) -> Vec { } } - separated_code.push(current_line.trim().to_string()); + if !current_line.trim().to_string().is_empty() { + separated_code.push(current_line.trim().to_string()); + } } separated_code @@ -82,29 +85,27 @@ pub fn arrange_code(code_content: Vec) -> Vec { "Stage", ]; - let mut ordered_code_content: Vec = Vec::new(); - let mut unmatched_lines: Vec = Vec::new(); - - for code_line in code_content.iter() { - let mut matched = false; + let mut ordered_code: Vec = Vec::new(); + let mut placed_code: Vec = vec![false; code_content.len()]; - for component in components.iter() { - if code_line.contains(component) { - ordered_code_content.push(code_line.to_string()); - matched = true; - break; + for comp in components { + for (i, code_line) in code_content.iter().enumerate() { + if code_line.contains(comp) { + // Place in the correct order. + ordered_code.push(code_line.to_string()); + placed_code[i] = true; } } + } - if !matched { - unmatched_lines.push(code_line.to_string()); + // Deals with cases where there is no definition of a component. + for (i, code_line) in code_content.iter().enumerate() { + if !placed_code[i] { + ordered_code.insert(i, code_line.to_string()); } } - // Append unmatched lines at the end. - ordered_code_content.extend(unmatched_lines); - - ordered_code_content + ordered_code } // Write Rust code in the file of the generated fuzzer. @@ -136,24 +137,18 @@ pub fn write_code(code_content: Vec) -> String { .write_all("use libafl::prelude::*;\n\nfn main() {".as_bytes()) .expect("Failed to write to the fuzzer file."); - for (i, code) in code_content.iter().enumerate() { + for code in code_content.iter() { out_file - .write_all("\n".as_bytes()) + .write_all("\n\n".as_bytes()) .expect("Failed to write to the fuzzer file."); out_file - .write_all(code.as_bytes()) + .write_all(&format!("{}{}", " ".repeat(4), code).as_bytes()) .expect("Failed to write to the fuzzer file."); - - if i < code_content.len() { - out_file - .write_all("\n\n".as_bytes()) - .expect("Failed to write to the fuzzer file."); - } } out_file - .write_all("}".as_bytes()) + .write_all("\n}".as_bytes()) .expect("Failed to write to the fuzzer file."); file_name From b570b74d8d7239c5ffcf7a009679d0f3345b82a4 Mon Sep 17 00:00:00 2001 From: matheusbaptistella Date: Mon, 18 Dec 2023 22:20:15 -0300 Subject: [PATCH 17/21] (WIP) Added functions to arrange module imports --- Cargo.toml | 2 +- libafl_ftg/Cargo.toml | 18 - libafl_ftg/README.md | 1 - libafl_ftg/diagram/FTGQuestionsDiagram.png | Bin 218841 -> 0 bytes libafl_ftg/diagram/FTGQuestionsDiagram.wsd | 150 ------- libafl_ftg/fuzzer.rs | 46 --- libafl_ftg/questions.csv | 29 -- libafl_ftg/questions.toml | 444 --------------------- libafl_ftg/sections.toml | 24 -- libafl_ftg/src/lib.rs | 280 ------------- libafl_ftg/src/main.rs | 126 ------ libafl_wizard/README.md | 2 +- libafl_wizard/questions.toml | 36 ++ libafl_wizard/src/main.rs | 18 +- libafl_wizard/src/question.rs | 2 +- libafl_wizard/src/utils.rs | 192 ++++++++- 16 files changed, 232 insertions(+), 1138 deletions(-) delete mode 100644 libafl_ftg/Cargo.toml delete mode 100644 libafl_ftg/README.md delete mode 100644 libafl_ftg/diagram/FTGQuestionsDiagram.png delete mode 100644 libafl_ftg/diagram/FTGQuestionsDiagram.wsd delete mode 100644 libafl_ftg/fuzzer.rs delete mode 100644 libafl_ftg/questions.csv delete mode 100644 libafl_ftg/questions.toml delete mode 100644 libafl_ftg/sections.toml delete mode 100644 libafl_ftg/src/lib.rs delete mode 100644 libafl_ftg/src/main.rs diff --git a/Cargo.toml b/Cargo.toml index 8c53101716..45e5e12ad5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,11 +5,11 @@ members = [ "libafl_cc", "libafl_targets", "libafl_frida", - "libafl_ftg", "libafl_qemu", "libafl_tinyinst", "libafl_sugar", "libafl_nyx", + "libafl_wizard", "libafl_concolic/symcc_runtime", "libafl_concolic/symcc_libafl", "libafl_concolic/test/dump_constraints", diff --git a/libafl_ftg/Cargo.toml b/libafl_ftg/Cargo.toml deleted file mode 100644 index 6a95111e84..0000000000 --- a/libafl_ftg/Cargo.toml +++ /dev/null @@ -1,18 +0,0 @@ -[package] -name = "libafl_ftg" -version = "0.1.0" -edition = "2021" -authors = ["matheus "] -description = "libafl's fuzzer template generator" -documentation = "TODO" -repository = "https://github.com/AFLplusplus/LibAFL/" -readme = "../README.md" -license = "MIT OR Apache-2.0" -keywords = ["fuzzing", "testing", "security"] -categories = ["TODO"] - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -toml = "0.7.6" -serde = { version = "1.0", features = ["derive"] } diff --git a/libafl_ftg/README.md b/libafl_ftg/README.md deleted file mode 100644 index 30404ce4c5..0000000000 --- a/libafl_ftg/README.md +++ /dev/null @@ -1 +0,0 @@ -TODO \ No newline at end of file diff --git a/libafl_ftg/diagram/FTGQuestionsDiagram.png b/libafl_ftg/diagram/FTGQuestionsDiagram.png deleted file mode 100644 index a0139744bb3012ef147a094ca16ebab837973d31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 218841 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 z�|l-G0MCCov(R2}Kg#9o%s)F5Ntcwx{dD3NhBC54`Hw8I-m81f~NrG748}jL!DZ zfx*Emm`%2?LI;6Xu41U27?Oi!0}@)3%pH3ZNrJPdew!yig84Lsj)b5SKnga5VNCKu z$LQ$j?ohRxvSxF6d7qriy2g2(`R+umM3ve~%ZF01={q7{zTITd& zDFLnj{bI1fn00q-sfs*wZ#7*m_K=G4#9&3 zwl?d<=_U5tSLi04v+o~v*{Y=lTFO=5A0)BxwYMH}pQfMLGj-Hh#LzYFj%5@xb#=eg01?>QXzN}GT#28`Y=}%;o^>GJ-UlN?h0q~ox{s3Yg=~TJ$0qb zLn3bVn%|t<6-5Ia2MjE8kFGV7pca&(QHW#HXa`MAsbdB!V;Zd`0vF3i=9-!`pUG)5 zrpEGKer494;&j_dS3T^*ek-d4xO%pd>B$0n|FbLMqA`xUEOUFt-ypq-7zPIU6?fU(~N{~>aDMWi_?FV$e+vnU|%q)K(PFoA;w<7>PwqV-DCf0J(J^7y}jxk<;j=#JF( z

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

{m+C^D?F1AUto~4{CK@i`e4UPgNW_1_LEV8O|!J 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 z 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�-XBAHJ!VN=Qol_y5pV>+9_z%?y^yNlDg6~4v2}85k0vJB)hhN< z3zuE(PM)2HdX`pf>+ z{-)!b7}5BO9rg0nD?UCrI>$WE)X+zW661I~f+8RLtLKV0Qg&PfT}x@*y6x}cZOaax z%yUNRoMWRln_B1Ok*{GZU zDZbg2c@%DaklkD^jqKxAf(!jx=xsC&;W~C<%o7$nMMc9ne61Rhv%9XWDP1QfcIF6c zyU+0>S!KGfu2jF3D%OQCF@-^Ih3;AXt2?ag1PblFM{b#Y+u!7KzxW8RjP0wLHzg~4 zRxSR5Ll1B^X-+Q7BwI;h&q8T-=oT!mqjcg|r&k-(uD{@H*yRDtsPbUs6g@LoWaLHO z*ZI=g3|Tm88yF)3zPwCqM?M3z^L5-+ruBG2pOl|gRiSUV=;-{``RKfP0=s~=?eX|`>HR5R&z^bR{I0M1z_MTfe8v)hqITKt_4Zt+s==RYQn^SKvwVTfZd(dPP}W%jAtN&E(!^@i&IQy+F zg358)0aIHcilk5X9GKgNN9YX)pJs2NxlU|bsu0GRfHX>DPVP`X`w&M-1r(Xyt8Si? zi3lT8t|a>6$s0ePcN0tVCalqR@XIyoga)6iag5?E_BBKAaB3<~gwJmOQS)#|D)YU_ zbJDUX6s1qA?zJ?x`^H5(LLc6KD!hF9dp+d5^njF;{8~#+=*K8sy=s}_zLxkAB^2;F z8b*XoB`pmrl;{&Rr)!RXfC^>AT-06TUQ=bsd>aeswR=4R%aS$$x4DnGL<$1I~1} zuJ0Se3`_cPV(-(313BT1_2@aZMkq^N&|%g$l#6Dih=GM|1Ry?ZvJWTDyHJ~N)u3uy z^%OQWrnPFkTKYQl!5cl5qRKlLaKTB65o6$GcK?`}eQWb{gf+rw5@k%QEw)U-8dd!- zJ#9)qQj?i#2)&1Z?fz4$SwhAPxAdPGgip@g)pN0O;ko`uO?^1=;JadRvcQpgvWgs`MOR z21l2f`Z4FC%kHw-%$CN$^NVeBt?Fo}}Pv z0s#pC*In(pHcmk2zBCl+S4%b&?Uhq)7YWGRm!5FX_|;%T{|nEMq~H1OricqZlb5e| zh?FE9AV=`tfs_)7*++ze$0*_k=hz2>b@T(j0p@VdFL&xr#ePh# zAEIlV&pa(wMn(hhd&4OlHTDEd{Heg7#@{}qzYF)4wl!lJ0AFB8Jn&`* zC4TOoT!VS-rxzQo_8U|Qa=!8>*EvUWo!uhSk~i0w`wPzxT8@85F<^LY(_?!}%EwT0 z9<~;S26mgJW#@0F$Z9q)dLB9?$5cW&jszb-aO8h~1oNG}x*8hu0)6HMdErmL*l&n7 zim*h!xZ*j%r&Q3#@vxi{MD+)BNYXt;(?!k4@U?d@OVN^JJGjzE^{wVfy~CgxoJW-p z9VAkZlW&zYVe-_~eGXC(eC=c%ThM}bh()!vnP%OxuJt|On)m3I&hp}Q=)6Nx^^8gp zQB+h!JsX&4MlG>NX18_S;ggDU?Mh+-QKJ_gimOccc9CA_v*qa;FKOIh%u_b zaP8`fR5Cja(-d^oCYfaO0Btlhn9MjE*_~`4cW1^XP;8{Dzy%q!3aXe6Ba%6Sm-(C{ zbQq6Mj1t@;1^mpkRsaLF4rCT1nI>9p^GloWbIs$XXt*Co>Je3lliN?zoOG06XLtYm zw^g_$6pO^|W}}%gFc9PiuPimb4CpZ$Q5bW@ySux|>?|ZGewsX4&3%9&%ztXmJi68y z&74AM3sF*5F6X!JU0}YgcLEU$jc8#9GRr~D`1jCL{do57N;e_R9QpHu-qARy#K*dV zr6Kk8SM=YI=K76h`UejVVC4LS#Ituu%Fcm3m!Le07)uexaow#ivm? zGcN7nP+D7CixE5I_b$CmNoO6OL&Y^%aE(xCn&dS5Y5Mpes)>r8&JVtZ#17yQfa*)D z6E*Zhr1^aY%`gTbGGPa3-`~E#KHumX8N|1*+XYpPL#KpzI>SeD7zX#>yEUeik!V)HtS;5Mn-cln> z%-&V%T+{-iIJg6?Tel7+kN&aY3k#I}r@WDYV?9iU@edCSK<>h1zrY$Mu;@R7KU$Sa z4W-sJD@7Q0-f!~=+T2N{OlCV(m?^@#RiGlZhBkuUv|3AztzZg_j7Y!H!H!KqCgw`C zcz7N_G8$86_y#rO?Q_FN&3_k^fIADJ1VpY|4KZylFh33+$FZqg;b|TxGcFPaFFa)c2 zVbE|_2d4*9wlLO8*yWbpy^E=m6j@PbD#P{L{iLJBGQ9{o^tlGIKR?hUeNjZ!8!}^) z7Py&w&KIzeoPa~V!9x;FAss^E{4e>BU;sz|n70TXX_!E5Gk5lt0vVkxNQAM{RXm{-X?iFca zDyg6$=4nXYhB{MV13up|^ViV-hK$|X4=e$=m zu7X@3p70@)8gxBZFvEZj{F*7C*Rgg;v*n{{A)4?FiyUY@*hYMgt%Ob-3W~W~U8o@$ zj{^=h1p(z{$zvKXPr;)m_}C~-8PScgTjIzqz_Eqv0%TfV51~2T0jw6 z%S?3zKVlFsA1VSy+11&(8LtWVbz8*Z@_@zO&JC$p3;aqRqz5LI0F5a99sr23e}HdE z!_$e|;tRy8AH=WQzI}Imhh19M`O=vf8JUw8p-{b!_Jis1hqLLfaIbHLfIRj%10_gz zHBDGO#1e%XqL6Cfk{r-!03EBVtG9(N@C*o;!6R!y`!y00kVU1%#Zfk9&gWODSWFm* zjh($%EY=nV6z?P0<%KzD%RPvrByc0`vEVAaD-di>p{)g@a*~6`h(7=(yu<7bw=TVVm+EKU!c;Q~i6r2*Rju?P;psEb( zTU+5Ng+V`%S-k{p8$1T}x56Q0qb(bhlv+M~n8{B!TP%G_`<1QSnl-^OegI|022k$6 zSgaf_Z6}DDO-1G2*Y2an&0q!rbb#8ZypOeM#7tc@4JaLFhGXM45~kjL!q#Bcfb`xq zfs-i_>*vNMZe9~zyf$>-C|GjmM-iU~0i}S>k~g~v3J9%JmN=$Rq0s|keUvZje@h6V zJ(RKx&G_>fnBX4tVsB&Di#m8_;CFO%&a^D~4(u&k?z$cHDd76GV+6*2b_7B+hxZLv2=xC|u6P+e z4${LlKt4yaf|0Hj`BsJ?TOSJS`qATy|wy|HG1%eeX}y#jY&H9Xjj$Qs6pH)b^)r{ z>s>&8KlpxKMLmHq3@`e@7CA}~$`yAaeL`mcIVUW2be9-H%|7O~gef%S;U2(|t`!z` z#+S^+xn;qn890WpwCXL{$pFT`10eYUwDhH9T&ml$Km>NA+H?E){A!xJ8#K?_zuc_Q z$?xX~S6s|;l7x|bSXCW4Ms@J?QwPu8&hZ~D)iF3a+nIhZ`^qQfsH~j!4oh; zm;*&vYsoGoE6X{z%@^Za;bnRVHUS7Yph93kIY&Ex;4D^jE>0O87dL9^^97~o{59TerJ1o@HA06qzp z1MvP_goJCBVhL2C{7pmVx}D_tPj18akNjyAvAMuC84## zK(H8(|JDU-CFBYOYPSNISq z4f=>nJdmpoB8*}P6%68GX0yQF{1g&d?d{tUzA$;bTG?bZ|NF48u&%_t6r*KJ89f~xSEoz;{wz~m$ivI~<4zJeaho-7-Ju$}$yNFMr?n@40cer8Ea+q3f@ZAkq_9ww%nDphC-xO*=8n zL{Tq2zlyk-)t*>8f)mx7ym=EGibj2jM#nL$aD>39Squ~*Lv3~{|4S&p=cv?Z^HSv1 z!!Y*6=7x&$S^yjpF}^NI5#~hj>1aOKUjap1b;qLgUV;=?O%`GFL=uWpSs+u@LIS|zD9*MD9T9*VuQ6CNc0+eqi%zA z6Y#X|WPD_3DAH~iQ(P!hR8~%?9KuwW*t*+Y$dHh&`6H_H|12*rzkqGi{NVn5G>5{V z><}9b+MZQ3xH=)NFqcqOdl)xfJ$H2fF8YH zSPl2No5}K(o&|@pZ7KVaIi!j^uSrx|dMC|f8KX2si~-RCU}p(p6tF@5qb6eTH>DR}nfM$-^+NIWI^anG2fewyoA%L^U%@YvC);2zKAmDQ6EJq${8}uELBN$|*QkIXE711|vB4sgX%ZAJ8R*T@CNRSOTz_ zYNI{Ru7^a(!Dl|eTBK-)4ZyARAd>LO5!Ajiug ztnitnl*1Vtr(tm))`0Pk3ai|0z>d_HBSF>E)0;wSG3nMUZB-CdbFb3hJZ2I4glmz| znxMRAKL~DMGAw*0(uyrxNUtOwgMvf)Wl44uQn!p3t^4yxbE{wzuXFjirQ|k^Z@s;` zldvj!50q7kTKo*I5J;f>)bvTuGTyA72M!X&*@{H?dEJ1D&#$?1?s^agzAW50K9iVFy$5*5&o=*bLtE zg{AcQ&}-6^lw-`)Uc@dS_y)Gt1rCpa2UYRhCayH{2%0$j4{GV}S-p>yA|?=QaU6Xo z(9ob4WFLp?CM?Q!Vo3Dvn+z~cpaYefeXSS|QbLvPb2=;a*<&81T9eLy3N6x5G+mwf zg5K2k@9p;of`&SK?pz(z2dz)ggoAwGSNHmuXI?LPDMm_+xr{jBYRtu?h9fJN%pi0LCh9CmOAPSoV9bo-^0y%8@0Y4}yc-XEO!LVt~nr+i>T0ps` zXJo*y`4z0A5HYw$n=9Mf(Pt3@ATp2)jI}PJ8Ala@5oKX!{&@ZbvI@!Cry z+87*)o>3`zahj=#$;2*x4E%tmQ&p)BrndDPZ3I|1+fdZusm1j8hpU&5PkNI#=9obO z)}i?X`x?#o+keB0Ze+SKx4Yn4(E>^oy3W-hq&V;`_>0&4sv0w)<+B8WtUstsX zi^;FCXt-N}{Kdn}e!*OlmUhZyGmI(^6qxZIE2RXjc`iRk=Hm20fr1lnsAJM8fTWSJ z-f^&$u)nfMnG-1^2p6so;?m8n^C=EgdDb=%iBL5(KYc0+sVunqY0J1^U97@fyL&Mg zcA;4_@N;(F7d-Hw&6iB+q%9SB2GXIgG6N1SU0q$gQdR@7s+r-m&|-hZizyMSucp{N z3{Z`5nv_(I%R#P2KcF=dsdg#aA`*A;$nV)&8U{lj9r&m*LtXqOx1iu44t)5kedgHL zZT1UGT2@k?xeX#<_(;u2EcQ}g+eWDA9mQVRM@y0MtvJll2ALDKTGYdU5I^+R!-oHw zS{~3p^7(A>C+O?#E4E;0&%n^TO!R%=kc6J_RSfJ(N!JAWe zg=RP1{cd}!^VwbM<}*U6c;=*6UqZO7;zO>oi}h=fZ!ZTHCr9N z7zJv6m;!9?z&T^MeF4E|4pmHT)#{0-sDMINW{6xd5TP# zEW^k*kMT+mGA5A9rsgEwymm0P*(1s;T0gVyCMR-8co1gD^I zmes4Rgp6mgQ%Mmkor=Fhw~nL#2xD%GPcBYMtPo-lk^}^4t@e2bpWMW1)?``7U}Q1v z&%l~C!8w}Hrr$AlJhcgSQ+vsp8vjxMpX-L*T5Egz&$qWjN@dY~4y2x43!!+l!J<--=%e!Z?G4z48=G#B+s^BS<9C%&TzzhFONA zbx8;rKm(9XK`GtghOxX)%FgCyYpV%N`77T48P-an`_UfJb@wfwbdP;vL2Gn}o!hFq zy*4_(cJzq!*8qx(5V@uG)|Lq8rFpQpWAtM*B$eQ)9DWLiYf0&62aO!X)u(2-brep3 zO+G&U<2TNeGqF#ETTpu3^{xJP-F3wZB1&%@KqtipDJcWPeW_L;9oc@dSc<+_lM#5d zmnzb}ZHi}m&vHIK(f$8ldFTEVWgUg_ms~*+f=V5P5H`D^n8l^gMA#*~q!J>_WeYHk z+8~WeGZV~K$O+P#6;PpY*<5XfRpc@xr3T5YJ7BFCBv=tCDmW7$Xc3BizF<>Le?q_R zdzpQ2=X=g`p65B>=j~lP539zFJ`S%+Kqccc_lCVdm^GJqFA_A#uX@71nvh2wotWx< z*h9YwhGB6;1{5*nJ%VrFPbD&;KjmO5#EKY0WD>-$qHj`8x3zjy{P3&=xZt@b`oh$u zMa^B~)i=Lb{Jmdm;W^>PE!>nU9&|s_vPuW{9ZX*1{2ENf7w*wl*afx z_ncu=zHU<5rc+fZ;**E zpLp7>gwz3bi1DssTdl=nfgDB%h?zBeH?6q=f7hqTocQIDrEn1EAZI_67>r;6@kDm@9${-!uZy>7cgK;%jd0l4 zg^AykHl^`D>FE_gdyA;SFZ-*Na!qm6!x~^8pCl+{V!Gnf@xLBhd2{47V!`RF@5z35 z)+PrjC%Hx8fnRe{nWE@&)Wj?*Pr=7oh}8ef;DpVwlKMynf7%z9!bo zXI}KI1mbf0Zn{7Ng*fb=3sb&td^vNWH?!Q8ieBEoR!Uq%;0pG|uKDOgTv55@{g$e` z54#gcLIqVL~bvc3|7yI6T&R7NNoXkh^;tfh3OW~NE@HkO<37#+?V z!a^Mkx0_>yuAZHQh2b*QC-;k$+)BurQd3Gyw4bg$dNepmxBqr0EK(J#Un_PQZw=Js zWoq+h*@?8-QD*LvYpUwV5~xiAgJtHJAo4tFn0;II&5j&Ek=ruhTB+{fnIu1&Vw=BU zLG1Y}O%q)dC5!&*O3^}Ewq?{VSUp!}-iP)N%vZ=7rue1UbRz`OoUQuK+`PO&QaFC! z;P<8tN9J377O(W?a=B(U(SX1RBnax^SqUQmc{x=Buo z8E=7GV|)fe_q)B=rm*Q4V@;{kr&^q)PkuNV!x-T#&BodOOKm!871|5Es+>%8f5RDH z2jmOg;MHBenng;b_W1GRYV$=8-w(1JR+9llM@KUo_a~Tj;eN?B9XI*9b1FT+^uqeG zvwD>&nl=NRt_G{M;~Z+5x)X|q-28m%=!z3nq1l7;+73LuWXXyBQPSpLc8A;4K{=kM z?~vkf*X4HGNfXhtz0DFXjYU5;mFy$5cI1wal_F94{l9m)LyR^GxuDHY6gr!Z96lD{lMJiX6 zp%-ya+}wy_>_IS=``)CkyxvLSBNU)H*rH2*$c%OqOepOta)luu1=#Nx)q2zIT3*0l z#0hQm$8OM=O!wysytFO32vb4yM0q%^jc)ZZMoC>j#k3M66dP5rnMt%nrEI>-!$7Ni zQRxdYzl`EPgc+j-hlUVviWyEwE(dn(Gbz^{o56{ZDxM{@LnIBic3--*v#4kj2-EbY zXA1T?Hk*{zG|8wc*H3xb1N<1Js61% zRXWI0gdj5 State0 - -state InitialConsiderations { - 'Restricts in memory fuzzing - state "Do you have the target's source code?" as State1 - State0 --> State1: Let's Begin - - 'Restricts in memory fuzzing - state "Can you provide a harness function?" as State2 - State1 --> State2: Yes -} - -state Observers { - state "Do you want to use a map to track coverage?" as State3 - State1 --> State3: No - State2 --> State3: No - State2 --> State3: Yes - - state "Do you need multiple maps?" as State4 - State3 --> State4: Yes - - state "Do you know the size of the map\n at compile time?" as State5 - State4 --> State5: No - State4 --> State5: Yes - - state "Do you want to improve input\n selection by adding a hit counts map?" as State6 - State5 --> State6: No - State5 --> State6: Yes - - state "Do you want to consider the logged\n values of CMP instructions?" as State7 - State3 --> State7: No - State6 --> State7: No - State6 --> State7: Yes - - state ForkState1 <> - State7 --> ForkState1: No - State7 --> ForkState1: Yes - - 'BacktraceObserver requires a harness - state "Do you want to consider the backtrace\n after the harness crashes?" as State8 - ForkState1 --> State8: (if the user can\n provide a harness) - - 'Restricts the use of timeout - state "Do you want to keep track of\n the testcases' runtime?" as State9 - ForkState1 --> State9: (if the user can not\n provide a harness) - State8 --> State9: No - State8 --> State9: Yes - -} - -state Feedbacks { - 'Depends if the fuzzer is observing the runtime of the testcases - state "Do you want to consider a timeout\n as a solution?" as State10 - State9 --> State10: Yes - - state "Do you want to consider a crash\n as a solution?" as State11 - State9 --> State11: No - State10 --> State11: No - State10 --> State11: Yes - -} - -state States { - state "Do you want to manage the testcases\n in memory, on disk or both?" as State12 - State11 --> State12: No - State11 --> State12: Yes - - state "Do you want to load testcases from\ndisk to memory using a cache?" as State13 - State12 --> State13: On disk -} - -state Monitors { - state "Do you want to see stats about\n the fuzzing campaign?" as State14 - State12 --> State14: Both - State12 --> State14: In memory - State13 --> State14: No - State13 --> State14: Yes - - state "Do you want to see the stats in a UI style?" as State15 - State14 --> State15: Yes - - state "Do you want to store the stats to a file?" as State16 - State15 --> State16: No - State15 --> State16: Yes - - state "Do you want to store them to\n a TOML or JSON file?" as State17 - State16 --> State17: Yes -} - -State Events { - state ForkState2 <> - State14 --> ForkState2: No - State16 --> ForkState2: No - State17 --> ForkState2: TOML - State17 --> ForkState2: JSON - - 'Depends on whether in memorry fuzzing is possible or not - state "Do you want to restart your fuzzer\n every time a solution is achieved?" as State18 - ForkState2 --> State18: (if in memory fuzzing is possible, then use\n a Simple event manager, whereas if not,\n use a LLMP one) -} - -State Schedulers { - state "Do you want to load testcases from the\ncorpus using a queue policy?" as State19 - State18 --> State19: No - State18 --> State19: Yes - - state "Do you want to prioritize smaller\n and faster testcases?" as State20 - State19 --> State20: No - State19 --> State20: Yes -} - -State Executors { - state ForkState3 <> - State20 --> ForkState3: No - State20 --> ForkState3: Yes - - state "Can your target corrupt memory\n used by the fuzzer?" as State21 - ForkState3 --> State21: (if in memory fuzzing is possible) - - state "Do you want to set a timeout\n before each run?" as State22 - ForkState3 --> State22: (if in memory fuzzing is not possible) - State21 --> State22: No - State21 --> State22: Yes -} - -State Generators { - state "Do you want to generate\n an initial set of inputs?" as State23 - State22 --> State23: No - State22 --> State23: Yes -} - -State Mutators { - state "Do you want to schedule mutations?" as State24 - State23 --> State24: No - State23 --> State24: Yes -} - -State Stages { - state "StdMutationalStage" as State25 - State24 --> State25: No - State24 --> State25: Yes -} - -State25 --> [*] - -@enduml \ No newline at end of file diff --git a/libafl_ftg/fuzzer.rs b/libafl_ftg/fuzzer.rs deleted file mode 100644 index af8fd1c1bd..0000000000 --- a/libafl_ftg/fuzzer.rs +++ /dev/null @@ -1,46 +0,0 @@ -use libafl::prelude::*; - -let mut shmem_provider = UnixShMemProvider::new().unwrap(); - -let mut shmem = shmem_provider.new_shmem(MAP_SIZE).unwrap(); -shmem.write_to_env("__AFL_SHM_ID").unwrap(); -let shmem_buf = shmem.as_mut_slice();; - -let observer = HitcountsMapObserver::new(StdMapObserver::new()); - -let mut feedback = feedback_or!( - MaxMapFeedback::new(&observer), - TimeObserver::new() -); - -let mut objective = CrashFeedback::new(); - -let mut state = StdState::new( - StdRand::with_seed(current_nanos()), - InMemoryCorpus::new(), - OnDiskCorpus::new(PathBuf::from("./crashes")).unwrap(), - &mut feedback, - &mut objective, -) -.unwrap(); - -let mon = SimpleMonitor::new(|s| println!("{s}"); - -let mut mgr = LlmpEventManager::new(mon).unwrap(); - -let scheduler = IndexesLenTimeMinimizerScheduler::new(QueueScheduler::new()); - -let mut fuzzer = StdFuzzer::new(scheduler, feedback, objective); - -let mut executor = ForkserverExecutor::new(); - -let mut generator = RandBytesGenerator::new(32); - -state - .generate_initial_inputs(&mut fuzzer, &mut executor, &mut generator, &mut mgr, 8) - .expect("Failed to generate the initial corpus"); - -let mutator = StdScheduledMutator::new(havoc_mutations()); - -let mut stages = tuple_list!(StdMutationalStage::new()); - diff --git a/libafl_ftg/questions.csv b/libafl_ftg/questions.csv deleted file mode 100644 index 1169705070..0000000000 --- a/libafl_ftg/questions.csv +++ /dev/null @@ -1,29 +0,0 @@ -name;content;answer1;answer2;next1;next2;previous -Introduction;Description;Yes;Sure;1;1;0 -Do you have the target's source code?;Description;Yes;No;2;3;0 -Can you provide a harness function?;Description;Yes;No;3;3;0 -Do you want to use a map to track coverage?;Description;Yes;No;4;7;0 -Do you need multiple maps?;Description;Yes;No;5;5;0 -Do you know the size of the map at compile time?;Description;Yes;No;6;6;0 -Do you want to improve input selection by adding a hit counts map?;Description;Yes;No;7;7;0 -Do you want to consider the logged values of CMP instructions?;Description;Yes;No;8;8;0 -Do you want to consider the backtrace after the harness crashes?;Description;Yes;No;9;9;0 -Do you want to keep track of the testcases' runtime?;Description;Yes;No;10;11;0 -Do you want to consider a timeout as a solution?;Description;Yes;No;11;11;0 -Do you want to consider a crash as a solution?;Description;Yes;No;12;12;0 -Do you want to manage the testcases in memory or on disk?;Description;In memory; On disk;13;14;0 -Do you want to manage only in memory or in memory and on disk?;Description;In memory;Both;16;16;0 -Do you want to manage only on disk or on disk and in memory?;Description;On disk;Both;15;16;0 -Do you want to load testcases from disk to memory using a cache?;Description;Yes;No;16;16;0 -Do you want to see stats about the fuzzing campaign?;Description;Yes;No;17;20;0 -Do you want to see the stats in a UI style?;Description;Yes;No;18;18;0 -Do you want to store the stats to a file?;Description;Yes;No;19;20;0 -Do you want to store them to a TOML or JSON file?;Description;TOML;JSON;20;20;0 -Do you want to restart your fuzzer every time a solution is achieved?;Description;Yes;No;21;21;0 -Do you want to load testcases from the corpus using a queue policy?;Description;Yes;No;22;22;0 -Do you want to prioritize smaller and faster testcases?;Description;Yes;No;23;23;0 -Can your target corrupt memory used by the fuzzer?;Description;Yes;No;24;24;0 -Do you want to set a timeout before each run?;Description;Yes;No;25;25;0 -Do you want to generate an initial set of inputs?;Description;Yes;No;26;26;0 -Do you want to schedule mutations?;Description;Yes;No;27;27;0 -Do you want to use the StdMutationalStage?;Description;Yes;No;28;28;0 diff --git a/libafl_ftg/questions.toml b/libafl_ftg/questions.toml deleted file mode 100644 index c03df17130..0000000000 --- a/libafl_ftg/questions.toml +++ /dev/null @@ -1,444 +0,0 @@ -[[question]] -id = "intro" -title = "Introduction" -content = """ -Description -New line -""" -answers = [ "Next" ] -next = [ "source code" ] -code = [] -previous = 0 -skip = false - -[[question]] -id = "source code" -title = "Do you have the target's source code?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "harness", "observers" ] -code = [ "", -"""let mut shmem_provider = UnixShMemProvider::new().unwrap();\n -let mut shmem = shmem_provider.new_shmem(MAP_SIZE).unwrap(); -shmem.write_to_env("__AFL_SHM_ID").unwrap(); -let shmem_buf = shmem.as_mut_slice();""" ] -previous = 0 -skip = false - -[[question]] -id = "harness" -title = "Can you provide a harness function?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "observers", "observers" ] -code = [ "", -"""let mut shmem_provider = UnixShMemProvider::new().unwrap();\n -let mut shmem = shmem_provider.new_shmem(MAP_SIZE).unwrap(); -shmem.write_to_env("__AFL_SHM_ID").unwrap(); -let shmem_buf = shmem.as_mut_slice();""" ] -previous = 0 -skip = false - -[[question]] -id = "observers" -title = "Observers" -content = "Description" -answers = [ "Next" ] -next = [ "map size" ] -code = [] -previous = 0 -skip = false - -[[question]] -id = "map size" -title = "Do you know the size of the map at compile time?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "hit counts", "hit counts" ] -code = [ "let observer = ConstMapObserver::<>::new()", "let observer = StdMapObserver::new()" ] -previous = 0 -skip = false - -[[question]] -id = "hit counts" -title = "Do you want to improve input selection by adding a hit counts map?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "feedback", "feedback" ] -code = [ "let observer = HitcountsMapObserver::new($)", "" ] -previous = 0 -skip = false - -[[question]] -id = "feedback" -title = "Feedback" -content = "Description" -answers = [ "Next" ] -next = [ "runtime" ] -code = [] -previous = 0 -skip = false - -[[question]] -id = "runtime" -title = "Do you want to keep track of the testcase's runtime?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "crash", "crash" ] -code = [ """let mut feedback = feedback_or!( -\tMaxMapFeedback::new(&observer), -\tTimeObserver::new() -)""", -"let mut feedback = MaxMapFeedback::new(&observer)" ] -previous = 0 -skip = false - -[[question]] -id = "crash" -title = "Do you want to consider a crash as a solution?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "timeout", "state" ] -code = [ "let mut objective = CrashFeedback::new()", "let mut objective = TimeoutFeedback::new()" ] -previous = 0 -skip = false - -[[question]] -id = "timeout" -title = "Do you want to consider a timeout as a solution?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "state", "state" ] -code = [ "let mut objective = feedback_and!($, TimeoutFeedback::new())", "" ] -previous = 0 -skip = false - -[[question]] -id = "state" -title = "State/Corpus" -content = "Description" -answers = [ "Next" ] -next = [ "manage testcases" ] -code = [] -previous = 0 -skip = false - -[[question]] -id = "manage testcases" -title = "Do you want to manage the testcases in memory, on disk or both?" -content = "Description" -answers = [ "On disk", "In memory", "Both" ] -next = [ "via cache", "load state", "load state" ] -code = [ "", "InMemoryCorpus::new()", "InMemoryOnDiskCorpus::new().unwrap()" ] -previous = 0 -skip = false - -[[question]] -id = "via cache" -title = "Do you want to load testcases from disk to memory using a cache?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "load state", "load state" ] -code = [ "CachedOnDiskCorpus::new().unwrap()", "OnDiskCorpus::new().unwrap()" ] -previous = 0 -skip = false - -[[question]] -id = "load state" -title = "" -content = "" -answers = [ "" ] -next = [ "monitors" ] -code = [ """let mut state = StdState::new( -\tStdRand::with_seed(current_nanos()), -\t$, -\tOnDiskCorpus::new(PathBuf::from("./crashes")).unwrap(), -\t&mut feedback, -\t&mut objective, -) -.unwrap()""" ] -previous = 0 -skip = false - -[[question]] -id = "monitors" -title = "Monitors" -content = "Description" -answers = [ "Next" ] -next = [ "stats" ] -code = [] -previous = 0 -skip = false - -[[question]] -id = "stats" -title = "Do you want to see stats about the fuzzing campaign?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "stats in ui", "stats to file" ] -code = [ "", "let mon = NopMonitor::new()" ] -previous = 0 -skip = false - -[[question]] -id = "stats in ui" -title = "Do you want to see the stats in a UI style?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "stats to file", "stats to file" ] -code = [ "let mon = (WIP)", """let mon = SimpleMonitor::new(|s| println!("{s}")""" ] -previous = 0 -skip = false - -[[question]] -id = "stats to file" -title = "Do you want to store the stats to a file too?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "file extensions", "events" ] -code = [ "", "" ] -previous = 0 -skip = false - -[[question]] -id = "file extensions" -title = "Do you want to store them to a TOML or JSON file?" -content = "Description" -answers = [ "TOML", "JSON" ] -next = [ "events", "events" ] -code = [ "let mon = OnDiskTOMLMonitor::new($)", "let mon = OnDiskJSONMonitor::new($)" ] -previous = 0 -skip = false - -[[question]] -id = "events" -title = "Events" -content = "Description" -answers = [ "Next" ] -next = [ "restart fuzzer" ] -code = [] -previous = 0 -skip = false - -[[question]] -id = "restart fuzzer" -title = "Do you want to restart your fuzzer every time a solution is achieved?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "restart fuzzer llmp", "restart fuzzer llmp" ] -code = [ "let mut mgr = SimpleRestartingEventManager::launch(mon)", "let mut mgr = SimpleEventManager::new(mon)" ] -previous = 0 -skip = false - -[[question]] -id = "restart fuzzer llmp" -title = "Do you want to restart your fuzzer every time a solution is achieved (LLMP)?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "schedulers", "schedulers" ] -code = [ "let mut mgr = LlmpRestartingEventManager::new(mon)", "let mut mgr = LlmpEventManager::new(mon).unwrap()" ] -previous = 0 -skip = false - -[[question]] -id = "schedulers" -title = "Schedulers" -content = "Description" -answers = [ "Next" ] -next = [ "queue policy" ] -code = [] -previous = 0 -skip = false - -[[question]] -id = "queue policy" -title = "Do you want to load testcases from the corpus using a queue policy?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "smaller and faster", "fuzzer" ] -code = [ "let scheduler = QueueScheduler::new()", "let scheduler = RandScheduler::new()" ] -previous = 0 -skip = false - -[[question]] -id = "smaller and faster" -title = "Do you want to prioritize smaller and faster testcases?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "fuzzer", "fuzzer" ] -code = [ "let scheduler = IndexesLenTimeMinimizerScheduler::new($)", "" ] -previous = 0 -skip = false - -[[question]] -id = "fuzzer" -title = "Fuzzer" -content = "Description" -answers = [ "Next" ] -next = [ "load fuzzer" ] -code = [] -previous = 0 -skip = false - -[[question]] -id = "load fuzzer" -title = "" -content = "" -answers = [ "" ] -next = [ "executors" ] -code = ["let mut fuzzer = StdFuzzer::new(scheduler, feedback, objective)" ] -previous = 0 -skip = false - -[[question]] -id = "executors" -title = "Executors" -content = "Description" -answers = [ "Next" ] -next = [ "corrupt memory" ] -code = [] -previous = 0 -skip = false - - -[[question]] -id = "corrupt memory" -title = "Can your target corrupt memory used by the fuzzer?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "in process timeout", "in process timeout" ] -code = [ """let mut shmem_provider = unix_shmem::UnixShMemProvider::new().unwrap();\n -let mut executor = InProcessForkExecutor::new( -\t&mut harness, -\ttuple_list!(observer), -\t&mut fuzzer, -\t&mut state, -\t&mut mgr, -\tshmem_provider -) -.expect("Failed to create the Executor")""", -"""let mut executor = InProcessExecutor::new( -\t&mut harness, -\ttuple_list!(observer), -\t&mut fuzzer, -\t&mut state, -\t&mut mgr, -)\ -.expect("Failed to create the Executor")""" -] -previous = 0 -skip = false - -[[question]] -id = "in process timeout" -title = "Do you want to set a timeout before each run?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "forkserver timeout", "forkserver timeout" ] -code = [ """let mut executor = TimeoutExecutor::new( -$, -Duration::from_secs() -)""", -"" ] -previous = 0 -skip = false - -[[question]] -id = "forkserver timeout" -title = "Do you want to set a timeout before each run (forkserver)?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "generators", "generators" ] -code = [ """let mut executor = TimeoutForkserverExecutor::new( -\t$, -\tDuration::from_secs() -)""", -"let mut executor = ForkserverExecutor::new()" ] -previous = 0 -skip = false - -[[question]] -id = "generators" -title = "Generators" -content = "Description" -answers = [ "Next" ] -next = [ "initial inputs" ] -code = [] -previous = 0 -skip = false - -[[question]] -id = "initial inputs" -title = "Do you want to generate an initial set of inputs?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "mutators", "mutators" ] -code = [ """let mut generator = RandBytesGenerator::new(32);\n -state -\t.generate_initial_inputs(&mut fuzzer, &mut executor, &mut generator, &mut mgr, 8) -\t.expect("Failed to generate the initial corpus")""" -, "" ] -previous = 0 -skip = false - -[[question]] -id = "mutators" -title = "Mutators" -content = "Description" -answers = [ "Next" ] -next = [ "schedule mutations" ] -code = [] -previous = 0 -skip = false - -[[question]] -id = "schedule mutations" -title = "Do you want to schedule mutations?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "stages", "stages" ] -code = [ "let mutator = StdScheduledMutator::new(havoc_mutations())", "" ] -previous = 0 -skip = false - -[[question]] -id = "stages" -title = "Stages" -content = "Description" -answers = [ "Next" ] -next = [ "StdMutationalStage" ] -code = [] -previous = 0 -skip = false - -[[question]] -id = "StdMutationalStage" -title = "Do you want to use the StdMutationalStage?" -content = "Description" -answers = [ "Yes", "No" ] -next = [ "fuzz loop", "fuzz loop" ] -code = [ "let mut stages = tuple_list!(StdMutationalStage::new())", "" ] -previous = 0 -skip = false - -[[question]] -id = "fuzz loop" -title = "" -content = "" -answers = [ "" ] -next = [ "end" ] -code = [ """fuzzer -\t.fuzz_loop(&mut stages, &mut executor, &mut state, &mut mgr) -\t.expect("Error in the fuzzing loop")""" ] -previous = 0 -skip = false - -[[question]] -id = "end" -title = "" -content = "" -answers = [] -next = [] -code = [] -previous = 0 -skip = false \ No newline at end of file diff --git a/libafl_ftg/sections.toml b/libafl_ftg/sections.toml deleted file mode 100644 index f033c85008..0000000000 --- a/libafl_ftg/sections.toml +++ /dev/null @@ -1,24 +0,0 @@ -informative_questions = [ - "observers", - "feedback", - "state", - "monitors", - "events", - "schedulers", - "fuzzer", - "executors", - "generators", - "mutators", - "stages", -] - -in_process_skip_questions = [ - "restart fuzzer", - "corrupt memory", - "in process timeout", -] - -forkserver_skip_questions = [ - "restart fuzzer llmp", - "forkserver timeout", -] \ No newline at end of file diff --git a/libafl_ftg/src/lib.rs b/libafl_ftg/src/lib.rs deleted file mode 100644 index 1206aca613..0000000000 --- a/libafl_ftg/src/lib.rs +++ /dev/null @@ -1,280 +0,0 @@ -use serde::Deserialize; -use std::{error::Error, fs, fs::OpenOptions, io::Write, path::Path}; -use toml; - -#[derive(Deserialize)] -struct Sections { - informative_questions: Vec, - in_process_skip_questions: Vec, - forkserver_skip_questions: Vec, -} - -// Used to read the TOML file -#[derive(Deserialize)] -struct QuestionList { - question: Vec, -} - -// This represents a "node": the answer of a Question might lead to different Questions (different nodes). -#[derive(Clone, Deserialize, PartialEq, Debug)] -pub struct Question { - id: String, // ID is resolved to local indexes. - title: String, // The question that will be asked. - content: String, // Description related to the question, to help the user. - answers: Vec, // A vector containing all the possible answers for this question. - next: Vec, // A vector containing the next question for all the possible answers (for answer[0] the next question is next[0]...). - code: Vec, // Contains the Rust code associated to the question. - previous: usize, // The question that lead to the current one (possible UNDO functionality implementation). - skip: bool, // Marks questions that should be skipped. -} - -impl Question { - // Builds the diagram of questions from the csv file (this will probably be changed, the csv is used only for demonstrative purposes). - // The diagram is a vector of Questions (vector of nodes): each Question, depending on the answer, will have the index of the next Question - // that should be asked. - pub fn new() -> Result, Box> { - let contents = fs::read_to_string("questions.toml")?; - - let q_list: QuestionList = toml::from_str(&contents)?; - - // // Checks if each question is valid. - // for q in q_list.question.iter() { - // q.validate_question()?; - // } - - Ok(q_list.question) - } - - pub fn end(&self) -> bool { - if self.id == "end" { - return true; - } - - false - } - - pub fn print_question(&self) -> () { - print!("{esc}c", esc = 27 as char); - println!("=========================\nFuzzer Template Generator\n========================="); - println!("{}\n", self.title); - println!("{}\n", self.content); - - for ans in &self.answers { - print!("\t{}", ans); - } - - println!("\tUndo"); - } - - pub fn resolve_answer( - &self, - questions: &Vec, - input: &String, - ) -> (usize, bool, usize) { - // The "Undo" option makes the generator go back to the previous question, so if the user do something by mistake, they can correct it. - if validate_answer(&input, &String::from("Undo")) { - return (self.previous, true, 0); - } - - // Checks if the user typed one of the acceptable answers. If so, returns the index of the next question associated to that answer. - // For now we don't check for variants. - for (i, ans) in self.answers.iter().enumerate() { - if validate_answer(&input, &ans) { - let mut next_q = self.next_question(questions, i); - - // If the question should be skipped, then the generator goes to next question. - // These types of questions should always have only one possibility for next question (this is the approach for now). - while questions[next_q].skip { - next_q = questions[next_q].next_question(questions, 0); - } - - return (next_q, true, i); - } - } - - (0, false, 0) - } - - // Resolves the index in the vector for the next question - pub fn next_question(&self, questions: &Vec, i: usize) -> usize { - questions - .iter() - .position(|question| question.id == self.next[i]) - .unwrap() - } - - pub fn has_code(&self) -> bool { - if !self.code.is_empty() { - return true; - } - - false - } - - pub fn has_title(&self) -> bool { - if !self.title.is_empty() { - return true; - } - - false - } - - pub fn add_code(&self, code_content: &mut Vec, ans_i: usize) -> () { - if self.code[ans_i] != "" { - code_content.push(self.code[ans_i].to_string()); - } - } - - pub fn check_skip( - &self, - questions: &mut Vec, - input: &String, - next_q: usize, - in_process_qs: &Vec, - forkserver_qs: &Vec, - ) -> () { - // If the user doesn't have the source code or can't provide a harness, then in process fuzzing in not possible and the questions - // related to it are skipped. - if ((self.id == "source code") || (self.id == "harness")) - && validate_answer(&input, &String::from("No")) - { - skip_questions(questions, &in_process_qs); - } - // If it is possible, then forkserver/llmp questions are skipped. - else if (self.id == "harness") && validate_answer(&input, &String::from("Yes")) { - skip_questions(questions, &forkserver_qs); - // If the user is undoing, then the generator resets the questions that were marked to be skipped. - } else if ((self.id == "harness") - || (self.id == "observers") - || (self.id == "map size" - && (questions[next_q].id == "source code" || questions[next_q].id == "harness"))) - && validate_answer(&input, &String::from("Undo")) - { - unskip_questions(questions, &in_process_qs); - unskip_questions(questions, &forkserver_qs); - } - } - - pub fn update_previous(&mut self, curr_q: usize) -> () { - // Saves the current questions as the previous for the next one. - self.previous = curr_q; - } -} - -pub fn read_sections() -> Result<(Vec, Vec, Vec), Box> { - let contents = fs::read_to_string("sections.toml")?; - - let sections: Sections = toml::from_str(&contents)?; - - Ok(( - sections.informative_questions, - sections.in_process_skip_questions, - sections.forkserver_skip_questions, - )) -} - -pub fn skip_questions(questions: &mut Vec, vec: &Vec) -> () { - for q in vec { - let i = questions - .iter() - .position(|question| &question.id == q) - .unwrap(); - - questions[i].skip = true; - } -} - -// Undo option -pub fn unskip_questions(questions: &mut Vec, vec: &Vec) -> () { - for q in vec { - let i = questions - .iter() - .position(|question| &question.id == q) - .unwrap(); - - questions[i].skip = false; - } -} - -pub fn replace_code(code_content: &mut Vec) -> () { - let mut symb_count: usize; - - // For each String of Rust code that contains a '$', we replace this '$' by another String (another Rust code). This works like in wrappers. - // The only requirement is that, for each '$' found in that String, the order of replacement is: the firt occurence is replaced by - // the code that is at 'position_of_string - number_of_occ_of_$'. Then, since this String will be removed from the vector, the next occ of '$' - // can be replaced by a String at the same position (i - symb_count). - for s in code_content.clone() { - if s.contains('$') { - // Current position - let i = code_content - .iter() - .position(|code| code.as_str() == s) - .unwrap(); - - symb_count = s.chars().filter(|&c| c == '$').count(); - - for c in s.chars() { - if c == '$' { - // Since this component will be wrapped by another, it doesn't need to have an assigment to a variable. - //"let observer = StdMapObserver::new()" will become "StdMapObserver::new()" - if let Some(index) = code_content[i - symb_count].find("= ") { - code_content[i - symb_count].replace_range(..=index + 1, ""); - } - - code_content[i] = s.replacen('$', &code_content[i - symb_count], 1); - - code_content.remove(i - symb_count); - } - } - } - } -} - -// Write Rust code in the file of the generated fuzzer. -pub fn write_code(code_content: Vec) -> Result> { - let mut counter = 0; - let mut file_name = format!("fuzzer.rs"); - - // Creates "fuzzer.rs", "fuzzer_1.rs" files if the previous one already exists... - while Path::new(&file_name).exists() { - counter += 1; - file_name = format!("fuzzer_{}.rs", counter); - } - - let mut out_file = OpenOptions::new() - .append(true) - .create(true) - .open(&file_name)?; - - // While imports are not resolved, use this. - out_file.write_all("use libafl::prelude::*;\n\n".as_bytes())?; - - for (i, code) in code_content.iter().enumerate() { - out_file.write_all(code.as_bytes())?; - - if i < code_content.len() { - out_file.write_all(";\n\n".as_bytes())?; - } - } - - Ok(file_name) -} - -pub fn validate_answer(input: &String, ans: &String) -> bool { - let input_lower = input.to_lowercase(); - let ans_lower = ans.to_lowercase(); - - let mut input_chars = input_lower.chars(); - let mut ans_chars = ans_lower.chars(); - - // Basically, an aswer is valid if it is an acceptable variant of that given answer. Acceptable variants are strings that contain the - // characters in the same order as the answer, so for the answer "Yes", acceptable variants are: "y", "Ye", "yes", "yES", but not - // "Yess", "yy", "Yhes", "yYess"... - while let (Some(input_c), Some(ans_c)) = (input_chars.next(), ans_chars.next()) { - if input_c != ans_c { - return false; - } - } - - true -} diff --git a/libafl_ftg/src/main.rs b/libafl_ftg/src/main.rs deleted file mode 100644 index 285e7f623c..0000000000 --- a/libafl_ftg/src/main.rs +++ /dev/null @@ -1,126 +0,0 @@ -use libafl_ftg::{ - read_sections, replace_code, skip_questions, validate_answer, write_code, Question, -}; -use std::{error::Error, io, process}; - -fn run() -> Result<(), Box> { - // The question diagram is a vector containing all the questions. - let mut questions = Question::new()?; - - // Each element is a String, which contains the Rust code associated to a question. This will be used to write to the file. - // Note that these are not in the same position as the questions, they are simply in the order that will be written to the file. - let mut code_content: Vec = Vec::new(); - - // Marks the questions that produced code that will be written. This has the same index as the questions in their vector. - // Undo option - let mut prod_code: Vec = vec![false; questions.len()]; - - // Index of the current question - let mut curr_q = 0; - // Index of the next question - let mut next_q; - // Index of the chosen answer - let mut ans_i; - - let mut valid_ans; - - // User input - let mut input = String::new(); - - // Loads the vectors which contains the ids of questions that may be skipped. - let (info_qs, in_process_qs, forkserver_qs) = read_sections()?; - - // This option allows the user to skip informative question. - // These are questions that don't influence the generation of code, they simply explain the concepts and components used in Libafl. - print!("{esc}c", esc = 27 as char); - println!("Do you wish to skip informative questions? [Y/n]"); - - loop { - io::stdin().read_line(&mut input)?; - input = input.trim().to_string(); - - if validate_answer(&input, &String::from("Yes")) { - skip_questions(&mut questions, &info_qs); - break; - } else if validate_answer(&input, &String::from("No")) { - break; - } - - println!("Please type a valid answer: "); - } - - // Basically, a question is asked, answered by the user and then the generator moves on to the next question. - // Note that not all the questions are going to be asked, for example, if the user chose not to use a monitor, the generator shouldn't - // ask if he wants a monitor with a UI style or a SimpleMonitor. - while !questions[curr_q].end() { - // If the question has a title, it means it contains information to show to the user and expects some input. - if questions[curr_q].has_title() { - questions[curr_q].print_question(); - - loop { - input = "".to_string(); - io::stdin().read_line(&mut input)?; - input = input.trim().to_string(); - - (next_q, valid_ans, ans_i) = questions[curr_q].resolve_answer(&questions, &input); - - if valid_ans { - break; - } - - println!("Please type a valid answer: "); - } - } else { - (next_q, _, ans_i) = questions[curr_q].resolve_answer(&questions, &input); - } - - // Code generation - if validate_answer(&input, &String::from("Undo")) { - // If the user chooses to undo a question that produced code, the code is removed. - // Since the Undo option goes backwards, we can simply pop the last piece of code. - if prod_code[next_q] { - code_content.pop(); - prod_code[next_q] = false; - } - } else { - // Adds the code associated to the user choice - if questions[curr_q].has_code() { - questions[curr_q].add_code(&mut code_content, ans_i); - prod_code[curr_q] = true; - } - } - - // Skip questions that are no longer possible - questions[curr_q].clone().check_skip( - &mut questions, - &input, - next_q, - &in_process_qs, - &forkserver_qs, - ); - - // Only updates the 'previous' field when going forward in the questions diagram. - if !validate_answer(&input, &String::from("Undo")) { - questions[next_q].update_previous(curr_q); - } - - curr_q = next_q; - } - - replace_code(&mut code_content); - - let file_name = write_code(code_content)?; - - print!("{esc}c", esc = 27 as char); - println!("File {} successfully created!", file_name); - println!("\nAll questions answered."); - - Ok(()) -} - -fn main() { - if let Err(err) = run() { - println!("{}", err); - process::exit(1); - } -} diff --git a/libafl_wizard/README.md b/libafl_wizard/README.md index 69dfd83b61..6daeb7243c 100644 --- a/libafl_wizard/README.md +++ b/libafl_wizard/README.md @@ -14,7 +14,7 @@ cargo run ## Have in mind that... -The tool makes use of [graphviz](https://graphviz.org/download/) to generate an image containing the flowchart of the questions diagram, so the users can know beforehand where the answers will take them. Make sure it's installed before running the tool. +The tool makes use of [graphviz](https://graphviz.org/download/) to generate an image containing the flowchart of the questions diagram, so the users can know beforehand where the answers will take them. Make sure it's installed (and added to PATH) before running the tool. When writing answers, the check if an input is a valid answer is such that it simply verifies if what's typed by the user has the same characters so far as the answer (check out `validate_input()`). The thing is that, e.g. if "Crash or Timeout" and "Crash" are both valid answers, if the user answers "crash", the first option will be deemed correct (even though the user wanted the second one). To avoid that, for now, one can simply reverse these answers, so "Crash" comes before "Crash or Timeout". diff --git a/libafl_wizard/questions.toml b/libafl_wizard/questions.toml index 5c5df5737e..37127665b5 100644 --- a/libafl_wizard/questions.toml +++ b/libafl_wizard/questions.toml @@ -100,6 +100,12 @@ previous = "" answer = "Yes" next = "crash/timeout" code = """ + use libafl::InProcessForkExecutor; + use libafl_bolts::{ + shmem::{unix_shmem, ShMemProvider}, + tuples::tuple_list, + }; + let mut shmem_provider = unix_shmem::UnixShMemProvider::new().unwrap(); let mut executor = InProcessForkExecutor::new( @@ -119,6 +125,9 @@ previous = "" answer = "No" next = "crash/timeout" code = """ + use libafl::executors::inprocess::InProcessExecutor; + use libafl_bolts::tuples::tuple_list; + let mut executor = InProcessExecutor::new( &mut harness, tuple_list!(observer), @@ -153,6 +162,8 @@ previous = "" answer = "Crash" next = "default components" code = """ + use libafl::feedbacks::CrashFeedback; + let mut objective = CrashFeedback::new(); """ skip = [] @@ -162,6 +173,11 @@ previous = "" answer = "Crash or Timeout" next = "default components" code = """ + use libafl::{ + feedback_or_fast, + feedbacks::{CrashFeedback, TimeoutFeedback}, + }; + let mut objective = feedback_or_fast!( CrashFeedback::new(), TimeoutFeedback::new() @@ -174,6 +190,8 @@ previous = "" answer = "Timeout" next = "default components" code = """ + use libafl::feedbacks::TimeoutFeedback; + let mut objective = TimeoutFeedback::new(); """ skip = [] @@ -191,6 +209,24 @@ previous = "" answer = "Next" next = "END" code = """ + use std::path::PathBuf; + use libafl::{ + corpus::{InMemoryCorpus, OnDiskCorpus}, + events::SimpleEventManager, + feedbacks::MaxMapFeedback, + fuzzer::{Fuzzer, StdFuzzer}, + monitors::SimpleMonitor, + mutators::scheduled::{havoc_mutations, StdScheduledMutator}, + schedulers::QueueScheduler, + stages::mutational::StdMutationalStage, + state::StdState, + }; + use libafl_bolts::{ + current_nanos, + rands::StdRand, + tuples::tuple_list, + }; + let mut feedback = MaxMapFeedback::new(&observer); let mut state = StdState::new( diff --git a/libafl_wizard/src/main.rs b/libafl_wizard/src/main.rs index 09f098975a..b064c491bc 100644 --- a/libafl_wizard/src/main.rs +++ b/libafl_wizard/src/main.rs @@ -5,7 +5,10 @@ mod question; mod utils; use question::{find_question, flowchart_image, Question}; -use utils::{arrange_code, clear_terminal_screen, separate_code, validate_input, write_code}; +use utils::{ + arrange_code, arrange_imports, clear_terminal_screen, separate_code, separate_imports, + validate_input, write_code, +}; fn main() { // The question diagram is a vector containing all the questions. @@ -26,11 +29,8 @@ fn main() { // Basically, a question is shown, answered by the use and so on, until the last question. while questions[curr_q].id != "END" { clear_terminal_screen(); - questions[curr_q].print_question(); - print!("\nYour answer: "); - io::stdout().flush().unwrap(); io::stdin() .read_line(&mut input) @@ -39,7 +39,6 @@ fn main() { while !questions[curr_q].is_answer(&input) { print!("Please, type a valid answer: "); - io::stdout().flush().unwrap(); input.clear(); io::stdin() @@ -72,7 +71,6 @@ fn main() { questions[curr_q].answers[ans_i].was_chosen = false; } else { (next_q, ans_i) = questions[curr_q].resolve_answer(&questions, &input); - questions[curr_q].answers[ans_i].was_chosen = true; // Adds the code associated to the user choice. @@ -92,12 +90,16 @@ fn main() { questions[next_q].update_previous(q_id); } input.clear(); - curr_q = next_q; } + let (imports_content, code_content) = separate_imports(code_content); + // Separate by instances of components, arrange them in the correct order and write to the file. - let file_name = write_code(arrange_code(separate_code(code_content))); + let file_name = write_code( + arrange_code(separate_code(code_content)), + arrange_imports(imports_content), + ); println!( "\nFile {} successfully created under the ./fuzzers directory.\nAll questions answered!", diff --git a/libafl_wizard/src/question.rs b/libafl_wizard/src/question.rs index 7b5b593248..feb874c9d6 100644 --- a/libafl_wizard/src/question.rs +++ b/libafl_wizard/src/question.rs @@ -46,7 +46,7 @@ impl Question { // Construct the output string output.push_str(&format!( - "+=====================+\n| libafl wizard |\n+=====================+\n\n" + "+=====================+\n| libafl_wizard |\n+=====================+\n\n" )); output.push_str(&format!("{}\n\n", self.title)); output.push_str(&format!("{}\n\n\t", self.content)); diff --git a/libafl_wizard/src/utils.rs b/libafl_wizard/src/utils.rs index 0611ba0007..925c8be063 100644 --- a/libafl_wizard/src/utils.rs +++ b/libafl_wizard/src/utils.rs @@ -108,8 +108,7 @@ pub fn arrange_code(code_content: Vec) -> Vec { ordered_code } -// Write Rust code in the file of the generated fuzzer. -pub fn write_code(code_content: Vec) -> String { +pub fn write_code(code_content: Vec, imports: Vec) -> String { let mut counter = 0; let mut file_name = format!("fuzzer.rs"); @@ -132,18 +131,19 @@ pub fn write_code(code_content: Vec) -> String { .open(&file_path) .expect("Failed to open the fuzzer file."); - // While imports are not resolved, use this. + for i in imports { + out_file + .write_all(&format!("{}\n", i).as_bytes()) + .expect("Failed to write to the fuzzer file."); + } + out_file - .write_all("use libafl::prelude::*;\n\nfn main() {".as_bytes()) + .write_all(&format!("\n\nfn main() {}", "{").as_bytes()) .expect("Failed to write to the fuzzer file."); for code in code_content.iter() { out_file - .write_all("\n\n".as_bytes()) - .expect("Failed to write to the fuzzer file."); - - out_file - .write_all(&format!("{}{}", " ".repeat(4), code).as_bytes()) + .write_all(&format!("\n\n{}{}", " ".repeat(4), code).as_bytes()) .expect("Failed to write to the fuzzer file."); } @@ -171,3 +171,177 @@ pub fn validate_input(input: &String, ans: &String) -> bool { true } + +pub fn separate_imports(code_content: Vec) -> (Vec, Vec) { + let mut imports: Vec = Vec::new(); + let mut new_code_content: Vec = Vec::new(); + + for code in code_content.iter() { + let mut is_import = false; + let mut import_string = String::new(); + let mut code_string = String::new(); + + for line in code.lines() { + if is_import { + import_string.push_str(&format!("{}\n", line)); + if line.contains(";") { + is_import = false; + imports.push(import_string.trim_end().to_string()); + import_string.clear(); + } + } else { + let trimmed_line = line.trim(); + if trimmed_line.starts_with("use") { + if !line.contains(";") { + is_import = true; + import_string.push_str(&format!("{}\n", line)); + } else { + imports.push(format!("{}\n", line).trim_end().to_string()); + } + } else { + if !trimmed_line.is_empty() { + code_string.push_str(&format!("{}\n", line)); + } else { + code_string.push_str("\n"); + } + } + } + } + new_code_content.push(code_string.trim_end().to_string()); + } + + for i in &imports { + println!("nf:{}", i); + } + + (imports, new_code_content) +} + +pub fn arrange_imports(imports_content: Vec) -> Vec { + // Each field of 'result' is a single import (use). + let mut result: Vec = Vec::new(); + + for import in imports_content { + let import_names: Vec = parse_imports(import.clone()); + let mut import_iter = import_names.iter(); + + if let Some(module_name) = import_iter.next() { + if let Some(index) = result + .iter() + .position(|s| s.starts_with(&format!("use {}", module_name(&module_name)))) + { + // Modify in alphabetical order. + let result_names: Vec = parse_imports(result[index].clone()); + let mut result_iter = result_names.iter().skip(0); // VER SE TA CERTO + + while let Some(import_mod) = import_iter.next() { + let result_mod = result_iter.next(); + + if module_name(&result_mod) == module_name(&import_mod) { + // If equal, iterate on the same module. + } else if module_name(&result_mod) < module_name(&import_mod) { + // If less, skip the current module. + let mut multiple_import = false; + + while let Some(value) = result_iter.next() { + if value.contains("{") { + multiple_import = true; + } + + if multiple_import { + if value.contains("},") { + break; + } + } else { + if value.contains(",") { + break; + } + } + } + } else { + // If what we are trying to insert is greater than the current module, insertion happens right here. + if let Some(i) = result[index].find(result_mod) { + let mut import_string = String::new(); + + // Builds the string that will be inserted + for line in import.lines() { + if line.contains(import_mod) { + result[index].insert_str(i, &line); + } + } + } + } + } + } else { + // Insert in alphabetical order. + result.push(import.trim().to_string()); + result.sort(); + } + } + } + + println!("\nRESULT:"); + for i in &result { + println!("{}", i); + } + result +} + +fn parse_imports(import: String) -> Vec { + let mut imports_names: Vec = Vec::new(); + + if let Some(import_stripped) = import.trim().strip_prefix("use ") { + let mut import_string = String::new(); + let mut chars = import_stripped.chars().peekable(); + + while let Some(c) = chars.next() { + import_string.push(c); + + // We want to break the import string into 'word::' or 'word};' patterns. + if c == ':' || c == '{' || c == '}' || c == ',' || c == ';' { + if import_string.contains("::") { + if let Some(&next_char) = chars.peek() { + if next_char != '{' { + imports_names.push(import_string.trim().to_string().clone()); + import_string.clear(); + } + } + } else if import_string.contains(",") || import_string.contains(";") { + imports_names.push(import_string.trim().to_string().clone()); + import_string.clear(); + } + } + } + } + + // Resolve "};" characters + let mut indices_to_remove: Vec = Vec::new(); + + for (index, string) in imports_names.iter().enumerate() { + if string.contains("};") { + indices_to_remove.push(index); + } + } + + for index in indices_to_remove.iter().rev() { + let string = imports_names[*index].clone(); + + imports_names[index - 1] += &string; + imports_names.remove(*index); + } + + println!("\nIMPORTS NAMES:"); + for i in &imports_names { + println!("{}", i) + } + + imports_names +} + +fn module_name(input: &String) -> String { + // Removes the ';', '::', etc from the string (module name). + input + .chars() + .filter(|&c| c != ':' && c != ';' && c != ',' && c != '{' && c != '}') + .collect() +} From b71d705f67ec3937fadd49d4932286d015b04585 Mon Sep 17 00:00:00 2001 From: matheusbaptistella Date: Wed, 20 Dec 2023 22:48:35 -0300 Subject: [PATCH 18/21] (WIP) Restructured the functions related to imports. --- libafl_wizard/fuzzers/fuzzer.rs | 44 +++++++ libafl_wizard/src/main.rs | 2 +- libafl_wizard/src/utils.rs | 226 ++++++++++++++++++++++++-------- 3 files changed, 214 insertions(+), 58 deletions(-) create mode 100644 libafl_wizard/fuzzers/fuzzer.rs diff --git a/libafl_wizard/fuzzers/fuzzer.rs b/libafl_wizard/fuzzers/fuzzer.rs new file mode 100644 index 0000000000..04fea93586 --- /dev/null +++ b/libafl_wizard/fuzzers/fuzzer.rs @@ -0,0 +1,44 @@ +use libafl:: corpus::{InMemoryCorpus, OnDiskCorpus},executors:: corpus::{InMemoryCorpus, OnDiskCorpus},inprocess::InProcessExecutor; +use libafl_bolts:: current_nanos,tuples:: rands::StdRand,tuple_list; +use std::path::PathBuf; + +fn main() { + let mut objective = CrashFeedback::new(); + + let mut feedback = MaxMapFeedback::new(&observer); + + let mut state = StdState::new( + StdRand::with_seed(current_nanos()), + InMemoryCorpus::new(), + OnDiskCorpus::new(PathBuf::from("./crashes")).unwrap(), + &mut feedback, + &mut objective, + ) + .unwrap(); + + let mon = SimpleMonitor::new(|s| println!("{s}")); + + let mut mgr = SimpleEventManager::new(mon); + + let scheduler = QueueScheduler::new(); + + let mut fuzzer = StdFuzzer::new(scheduler, feedback, objective); + + let mut executor = InProcessExecutor::new( + &mut harness, + tuple_list!(observer), + &mut fuzzer, + &mut state, + &mut mgr, + ) + .expect("Failed to create the Executor"); + + let mutator = StdScheduledMutator::new(havoc_mutations()); + + let mut stages = tuple_list!(StdMutationalStage::new(mutator)); + + fuzzer + .fuzz_loop(&mut stages, &mut executor, &mut state, &mut mgr) + .expect("Error in the fuzzing loop"); + +} \ No newline at end of file diff --git a/libafl_wizard/src/main.rs b/libafl_wizard/src/main.rs index b064c491bc..0b71a9cd08 100644 --- a/libafl_wizard/src/main.rs +++ b/libafl_wizard/src/main.rs @@ -102,7 +102,7 @@ fn main() { ); println!( - "\nFile {} successfully created under the ./fuzzers directory.\nAll questions answered!", + "\nFile {} successfully created in the ./fuzzers directory.\nAll questions answered!", file_name ); } diff --git a/libafl_wizard/src/utils.rs b/libafl_wizard/src/utils.rs index 925c8be063..4a2d4d806c 100644 --- a/libafl_wizard/src/utils.rs +++ b/libafl_wizard/src/utils.rs @@ -138,17 +138,17 @@ pub fn write_code(code_content: Vec, imports: Vec) -> String { } out_file - .write_all(&format!("\n\nfn main() {}", "{").as_bytes()) + .write_all(&format!("\nfn main() {}", "{\n").as_bytes()) .expect("Failed to write to the fuzzer file."); for code in code_content.iter() { out_file - .write_all(&format!("\n\n{}{}", " ".repeat(4), code).as_bytes()) + .write_all(&format!("{}{}\n\n", " ".repeat(4), code).as_bytes()) .expect("Failed to write to the fuzzer file."); } out_file - .write_all("\n}".as_bytes()) + .write_all("}".as_bytes()) .expect("Failed to write to the fuzzer file."); file_name @@ -210,10 +210,6 @@ pub fn separate_imports(code_content: Vec) -> (Vec, Vec) new_code_content.push(code_string.trim_end().to_string()); } - for i in &imports { - println!("nf:{}", i); - } - (imports, new_code_content) } @@ -222,58 +218,92 @@ pub fn arrange_imports(imports_content: Vec) -> Vec { let mut result: Vec = Vec::new(); for import in imports_content { - let import_names: Vec = parse_imports(import.clone()); - let mut import_iter = import_names.iter(); - - if let Some(module_name) = import_iter.next() { - if let Some(index) = result - .iter() - .position(|s| s.starts_with(&format!("use {}", module_name(&module_name)))) - { - // Modify in alphabetical order. - let result_names: Vec = parse_imports(result[index].clone()); - let mut result_iter = result_names.iter().skip(0); // VER SE TA CERTO - - while let Some(import_mod) = import_iter.next() { - let result_mod = result_iter.next(); - - if module_name(&result_mod) == module_name(&import_mod) { - // If equal, iterate on the same module. - } else if module_name(&result_mod) < module_name(&import_mod) { - // If less, skip the current module. - let mut multiple_import = false; - - while let Some(value) = result_iter.next() { - if value.contains("{") { - multiple_import = true; + let mut i: Option = None; + let mut single_line_import = false; + + // Check if the crate that we are trying to insert is already in the 'result' vector (final imports). + if let Some(i_line) = import.lines().next() { + if let Some(crate_name) = parse_imports(i_line.trim().to_string()).iter().next() { + println!("CRATE NAME: {}", crate_name); + single_line_import = crate_name.contains(";"); + if let Some(index) = result + .iter() + .position(|s| s.starts_with(&format!("use {}", crate_name))) + { + i = Some(index) + } + } + } + + match i { + Some(i) => { + let mut single_line_result = false; + + if let Some(r_line) = result[i].lines().next() { + if let Some(crate_name) = parse_imports(r_line.trim().to_string()).iter().next() { + single_line_result = crate_name.contains(";"); + } + } + if single_line_import { + let import_names = parse_imports(import.trim().to_string()); + + if single_line_result { + // Both are single line imports, so no need to iterate through their "lines". + let result_names = parse_imports(result[i].trim().to_string()); + + if let Some(new_import) = insert_import(&import_names, &result_names, &result[i]) { + result[i] = new_import; + } + } else { + // Single line into multiline. + let mut r_lines_iter = result[i].lines(); + + while let Some(r_line) = r_lines_iter.next() { + let result_names = parse_imports(r_line.trim().to_string()); + + if let Some(new_import) = insert_import(&import_names, &result_names, &result[i]) { + result[i] = new_import; + break; } + } + } + } else { + let mut i_lines_iter = import.lines(); - if multiple_import { - if value.contains("},") { - break; - } - } else { - if value.contains(",") { - break; - } + if single_line_result { + // Multiline into single, so we simply do the opposite. + let result_names = parse_imports(result[i].trim().to_string()); + + while let Some(i_line) = i_lines_iter.next() { + let i_line_names = parse_imports(i_line.trim().to_string()); + + if let Some(new_import) = insert_import(&result_names, &i_line_names, &result[i]) { + result[i] = new_import; + break; } } } else { - // If what we are trying to insert is greater than the current module, insertion happens right here. - if let Some(i) = result[index].find(result_mod) { - let mut import_string = String::new(); - - // Builds the string that will be inserted - for line in import.lines() { - if line.contains(import_mod) { - result[index].insert_str(i, &line); + // Both are multiline imports, so we have to iterate through their lines until the last component is checked for insertion. + let mut r_lines_iter = result[i].lines(); + let mut temp_import = String::new(); + + while let Some(r_line) = r_lines_iter.next() { + if let Some(i_line) = import.lines().next() { + let r_line_names = parse_imports(r_line.trim().to_string()); + let i_line_names = parse_imports(i_line.trim().to_string()); + + if let Some(new_import) = insert_import(&i_line_names, &r_line_names, &result[i]) + { + temp_import = new_import; } } } + result[i] = temp_import } } - } else { - // Insert in alphabetical order. + } + None => { + // Insert and sort alphabetically. result.push(import.trim().to_string()); result.sort(); } @@ -297,7 +327,7 @@ fn parse_imports(import: String) -> Vec { while let Some(c) = chars.next() { import_string.push(c); - // We want to break the import string into 'word::' or 'word};' patterns. + // We want to break the import string into 'word::', 'word};'... patterns. if c == ':' || c == '{' || c == '}' || c == ',' || c == ';' { if import_string.contains("::") { if let Some(&next_char) = chars.peek() { @@ -330,18 +360,100 @@ fn parse_imports(import: String) -> Vec { imports_names.remove(*index); } - println!("\nIMPORTS NAMES:"); - for i in &imports_names { - println!("{}", i) - } - imports_names } -fn module_name(input: &String) -> String { - // Removes the ';', '::', etc from the string (module name). +fn rm_punct(input: &String) -> String { + // Removes the ';', '::', etc from the string. input .chars() .filter(|&c| c != ':' && c != ';' && c != ',' && c != '{' && c != '}') .collect() } + +fn insert_import(import: &Vec, result: &Vec, curr_import: &String) -> Option { + // Basically, we try to insert 'import' in 'result', as a new string. + let mut new_import = curr_import.clone(); + let mut i_iter = import.iter(); + let mut r_iter = result.iter(); + + if let Some(i_name_punct) = i_iter.next() { + if let Some(r_name_punct) = r_iter.next() { + let i_name = rm_punct(&i_name_punct); + let r_name = rm_punct(&r_name_punct); + + if i_name == r_name { + // Insert into this module. + while let Some(r_name_punct) = r_iter.next() { + if let Some(i_name_punct) = i_iter.next() { + let r_name = rm_punct(&r_name); + + if i_name < r_name { + if let Some(position) = new_import.find(r_name_punct) { + let mut insert_string = String::new(); + insert_string.push_str(i_name_punct); + + while let Some(i_name_punct) = i_iter.next() { + insert_string.push_str(i_name_punct); + } + insert_string = insert_string.replace(";", ","); + + new_import.insert_str(position, &insert_string); + + return Some(new_import); + } + } else if r_name_punct.contains("},") && i_name > r_name { + if let Some(position) = new_import.find(r_name_punct) { + let mut insert_string = String::new(); + insert_string.push_str(i_name_punct); + + while let Some(i_name_punct) = i_iter.next() { + insert_string.push_str(i_name_punct); + } + insert_string = insert_string.replace(";", "},"); + new_import = new_import.replace("},", ","); + new_import.insert_str(position, &insert_string); + + return Some(new_import); + } + } + } + } + } else if i_name < r_name { + // No equal module was found, so insert here. + if let Some(position) = new_import.find(r_name_punct) { + let mut insert_string = String::new(); + insert_string.push_str(i_name_punct); + + while let Some(i_name_punct) = i_iter.next() { + insert_string.push_str(i_name_punct); + } + insert_string = insert_string.replace(";", ","); + insert_string.push_str("\n"); + new_import.insert_str(position, &insert_string); + + return Some(new_import); + } + } else { + if r_name_punct.contains("};") && (i_name > r_name) { + // Insert it as the last import. + if let Some(position) = new_import.find(r_name_punct) { + let mut insert_string = String::new(); + insert_string.push_str(i_name_punct); + + while let Some(i_name_punct) = i_iter.next() { + insert_string.push_str(i_name_punct); + } + insert_string = insert_string.replace(";", "};"); + new_import = new_import.replace("};", ","); + new_import.insert_str(position, &insert_string); + + return Some(new_import); + } + } + } + } + } + + None +} From b4e68d1153d3cf9a985e25cc1e333bb1b8efb41d Mon Sep 17 00:00:00 2001 From: matheusbaptistella Date: Tue, 26 Dec 2023 19:19:21 -0300 Subject: [PATCH 19/21] Implemented functions to arrange imports. --- libafl_wizard/flowchart.png | Bin 74583 -> 73996 bytes libafl_wizard/fuzzers/fuzzer.rs | 19 +- libafl_wizard/questions.toml | 4 +- libafl_wizard/src/main.rs | 2 +- libafl_wizard/src/question.rs | 2 +- libafl_wizard/src/utils.rs | 336 ++++++++++++++++++++++---------- 6 files changed, 255 insertions(+), 108 deletions(-) diff --git a/libafl_wizard/flowchart.png b/libafl_wizard/flowchart.png index fc463e5763313a1da54707bb6870211d51a522df..db5f373eeb30adc51adf473d8b76587acc0ee785 100644 GIT binary patch literal 73996 zcmdSBcRZGV^gn)=kciN-vo{UdD{gxwvPUJ{A$xBjWbf>vl7xipy-5b!zH`W^~}6Ny5d-aCs2 zKe=E^Y7T$kJyMcGqy8fQy{gWRMWL>t6wr4xT~k-a+#IRqswIv~s}#nWh9Y*D?fA{< zZ|I(V&4(8wxri%N8Yp!-=xr+M+uPr#=YC5qd%mt)s{SpQT^guwPlNGL3T?diieJT- z%wPK2#UFz#0S|(>KGTfE2(;%`eOr$_On+G1xjcwHaQa5AkkxZ5LzmB8d`tA!5BV4- zzu=RvwxA0oIM*1Eugs;$c1F^Zuf68k=zqUIJf|Uof?p<6($LV*wz{~unAqBWf9mPu zBjN7h;gujHDjN3f+c$y`5|pg0?1Rz~){mm}H*b;&r&%j@5)u+hTUmW<-3gOr_{r&w(TR{|xKjr-NxcwtNR1^~de~Jo^ zxvlMmv9U4i^7y#X@132_f>mb`coeFPRX$%qPfd*k4-ap4pyTQp(=bJ8Y3apZzbNPQ zUM;ES_A_vBbUgLMVAy`USC6<3F!Ay5sCus@_f@boxL4D@e*GGS3YW#n>S3$BLQ3kl zxQN+v($u_Ite1B<{NVaECZ;C#=TT7?t`gyuy16O63c>9E*s#t;qxt&L49qc^l63I| zv24;w#UYpZOzr2{NvW@1l~hyfE=!cwRd>#7s?^#xREX=TOL(2&}_vv1LV zkL8@=xL%2)FbxAE<5-J_lCnWL%f*@7J#*zO+Zy-N8>b|VjWb4EjR|V9$#H!T2ypB5 zmp@@22U;$FS~fS(PmkyB%P*`*FTR_8mx6O{o0xA((_7Y4BJLpfs=%-u1NLNH+v7W7 zxdf?+2d((ar!9+yzE4aj;Gw~vd!<-_GJmv`N(7F&U$sQ}H{!K@GMwpva z$l+=D`pQbv#>OX&(;P7m=88L*Mg|mK_jsCpY)vg>Nt^C@a9t9XmW2hcu(0sEMalQ& zKfw_Z&$V&`doaJBy)C~jiKM>%(^?Z%B8usqkV5~gxU2Ee0wl)L1krv*#qM(YO^Jsd}7z#m@;1p2nq&&`NCiP z-ub6bpBlxA4{WAee_&V>XY*zfI|}~w$6csBG&D4pyl!w%N9e{y0X=#KhI_GsQ|x4F z18;h*OFfR#F8X8Fen`2xmUW|h|5P_Mp}!{G!Y3dgP!`Q*XNg4f&A>vvDlF{Dsm#8b zoSZy5UZlfiEud_>S~HVt8Mz#ln)-El6P&|EgUZnevkgbx=LHkf#l?JY-o2{`S5r}$ zyPXjm24_3R;_>4%TDh0tJ3Ku6lU^Ri+FDjagIrHfZ#F?{b5uj%dqBV$CMKpfbI$kz za&q#tmXJ;5W4QA>lFBijzdt!W&V>wg2>V?%_*)~J+h1`s&dSQlc;f~sJ3G6)ii*s= zdt^U;{D_K+YqAt>^@S&@oP$ky_l_k};kA8gzeO_`@u5(fYS8TL<2P^L3Nd?k zGgSJJf#VTROH0E%eHtIDGVrG8?OR-KZf<0Z78drEHMe+ph~Xis1f~`iA4GY?#Ap;0 z6y%kaXB8Iy(#6U#P{v0`lky1&WaZ}*pFe;8eL+Fckd>^Lml!1#)!duAZmebBzu#qI zW)@-&eDdUpysBzKYY5JlT@4K4WkY6d1s@dZd>(#(wI^XJb|@$t;H>F59AdT3lM1_4@TGCnqOb@}{kY z?#=<`fPjE&%*-<4wq}nX3#Jv4D?Ee+(#H=84#u>=5p+~yN!2tRKC-q_nj8(?2di)W~UlRQRfCF3<@h(*Q?p8X$_k*t#*gIcBz7PQmR**ZwJX{^(?LYoNf-C^H(=8NbOLP zM1yPh__MP!^LwfHeO_KXxuV^4ZA}erU0`PbY``Z>4+EEB#YIl7k98gKoP}0HH=CN8 zl%G^7(}tJ@gM-o3(wbiE$r5y4xf($y5y4w~NJbol17Sv|%$8m&-yj4gWHQwdXdm

Ws{nfqs+e$aU;{>d06o}^D6n&4@YS-z!< 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 z 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 O9)qW=pUXO@geCy5q!3^L literal 74583 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 diff --git a/libafl_wizard/fuzzers/fuzzer.rs b/libafl_wizard/fuzzers/fuzzer.rs index 04fea93586..cd8a8f4efd 100644 --- a/libafl_wizard/fuzzers/fuzzer.rs +++ b/libafl_wizard/fuzzers/fuzzer.rs @@ -1,5 +1,20 @@ -use libafl:: corpus::{InMemoryCorpus, OnDiskCorpus},executors:: corpus::{InMemoryCorpus, OnDiskCorpus},inprocess::InProcessExecutor; -use libafl_bolts:: current_nanos,tuples:: rands::StdRand,tuple_list; +use libafl::{ + corpus::{InMemoryCorpus, OnDiskCorpus}, + events::SimpleEventManager, + executors::inprocess::InProcessExecutor, + feedbacks::{CrashFeedback, MaxMapFeedback}, + fuzzer::{Fuzzer, StdFuzzer}, + monitors::SimpleMonitor, + mutators::scheduled::{havoc_mutations, StdScheduledMutator}, + schedulers::QueueScheduler, + stages::mutational::StdMutationalStage, + state::StdState, +}; +use libafl_bolts::{ + current_nanos, + rands::StdRand, + tuples::tuple_list, +}; use std::path::PathBuf; fn main() { diff --git a/libafl_wizard/questions.toml b/libafl_wizard/questions.toml index 37127665b5..34699854c3 100644 --- a/libafl_wizard/questions.toml +++ b/libafl_wizard/questions.toml @@ -198,7 +198,7 @@ previous = "" [[question]] id = "default components" -title = "TODO: create questions to choose between these components." +title = "Type in finsish to end the generation." content = """ """ skipped_by = "" @@ -206,7 +206,7 @@ previous = "" [[question.answers]] was_chosen = false - answer = "Next" + answer = "Finish" next = "END" code = """ use std::path::PathBuf; diff --git a/libafl_wizard/src/main.rs b/libafl_wizard/src/main.rs index 0b71a9cd08..daf8f75fd3 100644 --- a/libafl_wizard/src/main.rs +++ b/libafl_wizard/src/main.rs @@ -30,7 +30,7 @@ fn main() { while questions[curr_q].id != "END" { clear_terminal_screen(); questions[curr_q].print_question(); - print!("\nYour answer: "); + print!("\n >> "); io::stdout().flush().unwrap(); io::stdin() .read_line(&mut input) diff --git a/libafl_wizard/src/question.rs b/libafl_wizard/src/question.rs index feb874c9d6..30a4c5c79a 100644 --- a/libafl_wizard/src/question.rs +++ b/libafl_wizard/src/question.rs @@ -52,7 +52,7 @@ impl Question { output.push_str(&format!("{}\n\n\t", self.content)); for ans in self.answers.iter() { - output.push_str(&format!("{}{}", ans.answer, " ".repeat(8))); + output.push_str(&format!("{}{}|{}", ans.answer, " ".repeat(4), " ".repeat(4))); } output.push_str("Undo\n"); diff --git a/libafl_wizard/src/utils.rs b/libafl_wizard/src/utils.rs index 4a2d4d806c..6bb90a1275 100644 --- a/libafl_wizard/src/utils.rs +++ b/libafl_wizard/src/utils.rs @@ -223,15 +223,22 @@ pub fn arrange_imports(imports_content: Vec) -> Vec { // Check if the crate that we are trying to insert is already in the 'result' vector (final imports). if let Some(i_line) = import.lines().next() { - if let Some(crate_name) = parse_imports(i_line.trim().to_string()).iter().next() { - println!("CRATE NAME: {}", crate_name); - single_line_import = crate_name.contains(";"); - if let Some(index) = result - .iter() - .position(|s| s.starts_with(&format!("use {}", crate_name))) - { - i = Some(index) + let mut crate_name = String::new(); + single_line_import = i_line.contains(";"); + + if single_line_import { + if let Some(name) = parse_imports(i_line.trim().to_string()).iter().next() { + crate_name = name.to_string(); } + } else { + crate_name = i_line.trim().strip_prefix("use ").unwrap().to_string(); + } + + if let Some(index) = result + .iter() + .position(|s| s.starts_with(&format!("use {}::", rm_punct(&crate_name)))) + { + i = Some(index); } } @@ -240,67 +247,136 @@ pub fn arrange_imports(imports_content: Vec) -> Vec { let mut single_line_result = false; if let Some(r_line) = result[i].lines().next() { - if let Some(crate_name) = parse_imports(r_line.trim().to_string()).iter().next() { - single_line_result = crate_name.contains(";"); - } + single_line_result = r_line.contains(";"); } + if single_line_import { - let import_names = parse_imports(import.trim().to_string()); + let mut i_line_names = parse_imports(import.trim().to_string()); + if !i_line_names.is_empty() { + i_line_names.remove(0); // Skip the crate name. + } if single_line_result { // Both are single line imports, so no need to iterate through their "lines". - let result_names = parse_imports(result[i].trim().to_string()); + let mut r_line_names = parse_imports(result[i].trim().to_string()); - if let Some(new_import) = insert_import(&import_names, &result_names, &result[i]) { + if !r_line_names.is_empty() { + r_line_names.remove(0); // Skip the crate name. + } + + if let Some(new_import) = + insert_import(&i_line_names, &r_line_names, &result[i]) + { result[i] = new_import; } } else { // Single line into multiline. - let mut r_lines_iter = result[i].lines(); + let mut r_lines_iter = result[i].lines().skip(1); while let Some(r_line) = r_lines_iter.next() { - let result_names = parse_imports(r_line.trim().to_string()); + let r_line_names = parse_imports(r_line.trim().to_string()); - if let Some(new_import) = insert_import(&import_names, &result_names, &result[i]) { + if let Some(new_import) = + insert_import(&i_line_names, &r_line_names, &result[i]) + { result[i] = new_import; break; } } } } else { - let mut i_lines_iter = import.lines(); + let mut i_lines_iter = import.lines().skip(1); if single_line_result { // Multiline into single, so we simply do the opposite. - let result_names = parse_imports(result[i].trim().to_string()); + let mut result_names = parse_imports(result[i].trim().to_string()); + if !result_names.is_empty() { + result_names.remove(0); // Skip the crate name. + } + let mut insert = false; while let Some(i_line) = i_lines_iter.next() { - let i_line_names = parse_imports(i_line.trim().to_string()); + if i_line.trim() != "};" { + let i_line_names = parse_imports(i_line.trim().to_string()); - if let Some(new_import) = insert_import(&result_names, &i_line_names, &result[i]) { - result[i] = new_import; - break; + if let Some(new_import) = + insert_import(&result_names, &i_line_names, &import) + { + result[i] = new_import; + insert = true; + break; + } + } + } + if !insert { + result[i].clear(); + for (index, line) in import.lines().enumerate() { + let mut line = line.to_string(); + if index > 0 { + if line.trim() != "};" { + line = line.trim_start().to_string(); + line.insert_str(0, " "); + line.push('\n'); + result[i].push_str(&line); + } else { + result[i].push_str(line.trim_start()); + } + } else { + line = line.trim_start().to_string(); + line.push('\n'); + result[i].push_str(&line); + } } } } else { // Both are multiline imports, so we have to iterate through their lines until the last component is checked for insertion. - let mut r_lines_iter = result[i].lines(); - let mut temp_import = String::new(); + let mut temp_result = result[i].clone(); + let mut i_lines_iter = import.lines().skip(1); // Skip the crate name. - while let Some(r_line) = r_lines_iter.next() { - if let Some(i_line) = import.lines().next() { - let r_line_names = parse_imports(r_line.trim().to_string()); + while let Some(i_line) = i_lines_iter.next() { + if i_line.trim() != "};" { let i_line_names = parse_imports(i_line.trim().to_string()); - - if let Some(new_import) = insert_import(&i_line_names, &r_line_names, &result[i]) - { - temp_import = new_import; + let mut r_lines_iter = result[i].lines().skip(1); + + while let Some(r_line) = r_lines_iter.next() { + if r_line.trim() != "};" { + let r_line_names = parse_imports(r_line.trim().to_string()); + + if let Some(new_import) = insert_import( + &i_line_names, + &r_line_names, + &temp_result, + ) { + temp_result = new_import; + break; + } + } } + result[i] = temp_result.clone(); } } - result[i] = temp_import } } + // Fix the formatting. + let mut new_result = String::new(); + for (index, line) in result[i].lines().enumerate() { + let mut line = line.to_string(); + if index > 0 { + if line.trim() != "};" { + line = line.trim().to_string(); + line.insert_str(0, " "); + line.push('\n'); + new_result.push_str(&line); + } else { + new_result.push_str(line.trim()); + } + } else { + line = line.trim().to_string(); + line.push('\n'); + new_result.push_str(&line); + } + } + result[i] = new_result; } None => { // Insert and sort alphabetically. @@ -310,54 +386,37 @@ pub fn arrange_imports(imports_content: Vec) -> Vec { } } - println!("\nRESULT:"); - for i in &result { - println!("{}", i); - } result } fn parse_imports(import: String) -> Vec { let mut imports_names: Vec = Vec::new(); + let mut import = import; if let Some(import_stripped) = import.trim().strip_prefix("use ") { - let mut import_string = String::new(); - let mut chars = import_stripped.chars().peekable(); - - while let Some(c) = chars.next() { - import_string.push(c); - - // We want to break the import string into 'word::', 'word};'... patterns. - if c == ':' || c == '{' || c == '}' || c == ',' || c == ';' { - if import_string.contains("::") { - if let Some(&next_char) = chars.peek() { - if next_char != '{' { - imports_names.push(import_string.trim().to_string().clone()); - import_string.clear(); - } - } - } else if import_string.contains(",") || import_string.contains(";") { - imports_names.push(import_string.trim().to_string().clone()); - import_string.clear(); - } - } - } + import = import_stripped.to_string(); } - // Resolve "};" characters - let mut indices_to_remove: Vec = Vec::new(); + let mut import_string = String::new(); + let mut chars = import.chars().peekable(); - for (index, string) in imports_names.iter().enumerate() { - if string.contains("};") { - indices_to_remove.push(index); - } - } + while let Some(c) = chars.next() { + import_string.push(c); - for index in indices_to_remove.iter().rev() { - let string = imports_names[*index].clone(); - - imports_names[index - 1] += &string; - imports_names.remove(*index); + // We want to break the import string into 'word::', 'word};'... patterns. + if c == ':' || c == '{' || c == '}' || c == ',' || c == ';' { + if import_string.contains("::") { + if let Some(&next_char) = chars.peek() { + if next_char != '{' { + imports_names.push(import_string.trim().to_string().clone()); + import_string.clear(); + } + } + } else if import_string.contains(",") || import_string.contains(";") { + imports_names.push(import_string.trim().to_string().clone()); + import_string.clear(); + } + } } imports_names @@ -371,8 +430,12 @@ fn rm_punct(input: &String) -> String { .collect() } -fn insert_import(import: &Vec, result: &Vec, curr_import: &String) -> Option { - // Basically, we try to insert 'import' in 'result', as a new string. +fn insert_import( + import: &Vec, + result: &Vec, + curr_import: &String, +) -> Option { + // Basically, we try to insert 'import' in 'result', and return the new import. let mut new_import = curr_import.clone(); let mut i_iter = import.iter(); let mut r_iter = result.iter(); @@ -381,40 +444,56 @@ fn insert_import(import: &Vec, result: &Vec, curr_import: &Strin if let Some(r_name_punct) = r_iter.next() { let i_name = rm_punct(&i_name_punct); let r_name = rm_punct(&r_name_punct); - if i_name == r_name { // Insert into this module. while let Some(r_name_punct) = r_iter.next() { if let Some(i_name_punct) = i_iter.next() { - let r_name = rm_punct(&r_name); - + let r_name = rm_punct(&r_name_punct); + let i_name = rm_punct(&i_name_punct); if i_name < r_name { if let Some(position) = new_import.find(r_name_punct) { let mut insert_string = String::new(); insert_string.push_str(i_name_punct); - while let Some(i_name_punct) = i_iter.next() { insert_string.push_str(i_name_punct); } insert_string = insert_string.replace(";", ","); - new_import.insert_str(position, &insert_string); return Some(new_import); } - } else if r_name_punct.contains("},") && i_name > r_name { - if let Some(position) = new_import.find(r_name_punct) { - let mut insert_string = String::new(); - insert_string.push_str(i_name_punct); - - while let Some(i_name_punct) = i_iter.next() { - insert_string.push_str(i_name_punct); + } else if r_name_punct.ends_with(",") && i_name > r_name { + // Check if this is the last element. + if let None = r_iter.clone().next() { + let mut r_peek = result.iter().peekable(); + while let Some(name_to_modify) = r_peek.next() { + if let Some(name) = r_peek.peek() { + if &r_name_punct == name { + let mut new_name = name_to_modify.clone(); + new_name.push('{'); + new_import = + new_import.replace(name_to_modify, &new_name); + if let Some(position) = new_import.find(r_name_punct) { + let mut insert_string = String::new(); + insert_string.push_str(i_name_punct); + insert_string.insert(0, ' '); + if insert_string.ends_with(";") { + insert_string = + insert_string.replace(";", "},"); + } else if insert_string.ends_with(",") { + insert_string = + insert_string.replace(",", "},"); + } + new_import.insert_str( + position + r_name_punct.len(), + &insert_string, + ); + + return Some(new_import); + } + } + } } - insert_string = insert_string.replace(";", "},"); - new_import = new_import.replace("},", ","); - new_import.insert_str(position, &insert_string); - - return Some(new_import); } } } @@ -423,32 +502,85 @@ fn insert_import(import: &Vec, result: &Vec, curr_import: &Strin // No equal module was found, so insert here. if let Some(position) = new_import.find(r_name_punct) { let mut insert_string = String::new(); + let mut sp = String::new(); insert_string.push_str(i_name_punct); - + if i_name_punct.contains("{") { + sp = " ".to_string(); + } + let mut i = 0; while let Some(i_name_punct) = i_iter.next() { - insert_string.push_str(i_name_punct); + if i > 0 { + insert_string.push_str(&(sp.clone() + i_name_punct)); + } else { + insert_string.push_str(&i_name_punct); + i += 1; + } + if i_name_punct.contains("{") { + sp = " ".to_string(); + i = 0; + } } insert_string = insert_string.replace(";", ","); - insert_string.push_str("\n"); + insert_string.push_str("\n "); new_import.insert_str(position, &insert_string); return Some(new_import); } } else { - if r_name_punct.contains("};") && (i_name > r_name) { - // Insert it as the last import. - if let Some(position) = new_import.find(r_name_punct) { - let mut insert_string = String::new(); + if new_import.lines().next()?.contains(";") { + let mut insert_string = String::new(); + insert_string.push_str(i_name_punct); + while let Some(i_name_punct) = i_iter.next() { insert_string.push_str(i_name_punct); + } + let index = new_import.find("::").unwrap_or(0); + let (crate_name, after_insertion) = new_import.split_at(index); + let new_import = format!( + "{}::{}\n {}\n {}\n{}", + crate_name, + "{", + after_insertion.trim_start_matches("::").replace(";", ","), + insert_string.replace(";", ","), + "};", + ); - while let Some(i_name_punct) = i_iter.next() { - insert_string.push_str(i_name_punct); + return Some(new_import); + } else { + let mut curr_import_lines = curr_import.lines(); + while let Some(line) = curr_import_lines.next() { + if line.contains(r_name_punct) { + break; } - insert_string = insert_string.replace(";", "};"); - new_import = new_import.replace("};", ","); - new_import.insert_str(position, &insert_string); + } + if let Some(next) = curr_import_lines.next() { + if next == "};" && (i_name > r_name) { + // Insert it as the last import. + if let Some(position) = new_import.rfind('\n') { + let mut insert_string = String::new(); + let mut sp = String::new(); + insert_string.push_str(i_name_punct); + insert_string.insert_str(0, "\n "); + if i_name_punct.contains("{") { + sp = " ".to_string(); + } + let mut i = 0; + while let Some(i_name_punct) = i_iter.next() { + if i > 0 { + insert_string.push_str(&(sp.clone() + i_name_punct)); + } else { + insert_string.push_str(&i_name_punct); + i += 1; + } + if i_name_punct.contains("{") { + sp = " ".to_string(); + i = 0; + } + } + new_import.insert_str(position, &insert_string); - return Some(new_import); + return Some(new_import); + } + } } } } From ea612f051e6cadd87c04efb263d125f043cee646 Mon Sep 17 00:00:00 2001 From: matheusbaptistella Date: Tue, 2 Jan 2024 21:09:26 -0300 Subject: [PATCH 20/21] Added documentation and begin refactoring the imports function --- libafl_wizard/fuzzers/fuzzer.rs | 59 ---- libafl_wizard/src/answer.rs | 57 ++- libafl_wizard/src/main.rs | 53 +-- libafl_wizard/src/question.rs | 194 +++++++---- libafl_wizard/src/utils.rs | 601 ++++++++++++-------------------- 5 files changed, 433 insertions(+), 531 deletions(-) delete mode 100644 libafl_wizard/fuzzers/fuzzer.rs diff --git a/libafl_wizard/fuzzers/fuzzer.rs b/libafl_wizard/fuzzers/fuzzer.rs deleted file mode 100644 index cd8a8f4efd..0000000000 --- a/libafl_wizard/fuzzers/fuzzer.rs +++ /dev/null @@ -1,59 +0,0 @@ -use libafl::{ - corpus::{InMemoryCorpus, OnDiskCorpus}, - events::SimpleEventManager, - executors::inprocess::InProcessExecutor, - feedbacks::{CrashFeedback, MaxMapFeedback}, - fuzzer::{Fuzzer, StdFuzzer}, - monitors::SimpleMonitor, - mutators::scheduled::{havoc_mutations, StdScheduledMutator}, - schedulers::QueueScheduler, - stages::mutational::StdMutationalStage, - state::StdState, -}; -use libafl_bolts::{ - current_nanos, - rands::StdRand, - tuples::tuple_list, -}; -use std::path::PathBuf; - -fn main() { - let mut objective = CrashFeedback::new(); - - let mut feedback = MaxMapFeedback::new(&observer); - - let mut state = StdState::new( - StdRand::with_seed(current_nanos()), - InMemoryCorpus::new(), - OnDiskCorpus::new(PathBuf::from("./crashes")).unwrap(), - &mut feedback, - &mut objective, - ) - .unwrap(); - - let mon = SimpleMonitor::new(|s| println!("{s}")); - - let mut mgr = SimpleEventManager::new(mon); - - let scheduler = QueueScheduler::new(); - - let mut fuzzer = StdFuzzer::new(scheduler, feedback, objective); - - let mut executor = InProcessExecutor::new( - &mut harness, - tuple_list!(observer), - &mut fuzzer, - &mut state, - &mut mgr, - ) - .expect("Failed to create the Executor"); - - let mutator = StdScheduledMutator::new(havoc_mutations()); - - let mut stages = tuple_list!(StdMutationalStage::new(mutator)); - - fuzzer - .fuzz_loop(&mut stages, &mut executor, &mut state, &mut mgr) - .expect("Error in the fuzzing loop"); - -} \ No newline at end of file diff --git a/libafl_wizard/src/answer.rs b/libafl_wizard/src/answer.rs index 34c9aad6e7..abca527461 100644 --- a/libafl_wizard/src/answer.rs +++ b/libafl_wizard/src/answer.rs @@ -1,26 +1,55 @@ use serde::Deserialize; +/// The Answer struct contains all the necessary information that an answer must +/// have, such as the code to be added and the next question to be asked. #[derive(Clone, Deserialize, PartialEq, Debug)] pub struct Answer { - pub was_chosen: bool, // Used when undoing. - pub answer: String, - pub next: String, // The next question if this answer is chosen. - pub code: String, // The code added to the file. - pub skip: Vec, // The questions to skip. + was_chosen: bool, + answer: String, + next: String, + code: String, + skip: Vec, } impl Answer { - pub fn has_code(&self) -> bool { - if !self.code.is_empty() { - return true; - } + /// Returns true if this answer was chosen between all the possibilities for + /// a given question. + pub fn was_chosen(&self) -> bool { + self.was_chosen + } + + /// Returns true if this answer was chosen between all the possibilities for + /// a given question. + pub fn set_was_chosen(&self, new_value: bool) { + self.was_chosen = new_value; + } + + /// Returns a String that represents the text of that answer, e.g "Yes" or + /// "No". + pub fn answer(&self) -> String { + self.answer + } + + /// Returns the id of the next question that will be asked, considering that + /// this answer was chosen. + pub fn next(&self) -> String { + self.next + } - false + /// Returns the Rust code that will be added to the fuzzer file, considering + /// that this answer was chosen. + pub fn code(&self) -> String { + self.code } - pub fn add_code(&self, code_content: &mut Vec) { - if !self.code.is_empty() { - code_content.push(self.code.to_string()); - } + /// Returns the ids of the questions that should be skipped, considering + /// that this answer was chosen. + /// + /// In some cases, depending on the answer that the user chooses for a + /// particular question, it will skip other questions that shouldn't be + /// asked, e.g. if the user doesn't have the source code of the that target + /// the wizard shouldn't ask if they can provide a harness. + pub fn skip(&self) -> Vec { + self.skip } } diff --git a/libafl_wizard/src/main.rs b/libafl_wizard/src/main.rs index daf8f75fd3..9351cccf41 100644 --- a/libafl_wizard/src/main.rs +++ b/libafl_wizard/src/main.rs @@ -1,3 +1,10 @@ +/*! +libafl_wizard is a crate that allows users to generate fuzzers that make use of +Libafl's components by simply answering some questions. + +This is the entry point into libafl_wizard. +*/ + use std::{io, io::Write}; mod answer; @@ -6,8 +13,8 @@ mod utils; use question::{find_question, flowchart_image, Question}; use utils::{ - arrange_code, arrange_imports, clear_terminal_screen, separate_code, separate_imports, - validate_input, write_code, + arrange_code, arrange_imports, clear_terminal_screen, separate_imports, validate_input, + write_code, }; fn main() { @@ -26,8 +33,7 @@ fn main() { // Generate a flowchat image to help guide the user. flowchart_image(&questions); - // Basically, a question is shown, answered by the use and so on, until the last question. - while questions[curr_q].id != "END" { + while questions[curr_q].id() != "END" { clear_terminal_screen(); questions[curr_q].print_question(); print!("\n >> "); @@ -50,44 +56,47 @@ fn main() { if validate_input(&input, &String::from("Undo")) { // The "Undo" option makes the generator go back to the previous answered question, so if the user do something by // mistake they can correct it. - next_q = find_question(&questions, &questions[curr_q].previous); + next_q = find_question(&questions, &questions[curr_q].previous()); // If the user chooses to undo a question that produced code, the associated code is removed. // Since the Undo option goes backwards, we can simply pop the last piece of code. - for ans in questions[next_q].answers.iter() { - if ans.was_chosen && !ans.code.is_empty() { + for ans in questions[next_q].answers().iter() { + if ans.was_chosen() && !ans.code().is_empty() { code_content.pop(); } } // Also, if we are undoing this question and it skipped others, we undo this too. ans_i = questions[curr_q].chosen_answer(); - if !questions[next_q].answers[ans_i].skip.is_empty() { + let answers = questions[next_q].answers(); + + if !answers[ans_i].skip().is_empty() { questions[next_q] .clone() .unskip_questions(&mut questions, ans_i); } - questions[curr_q].answers[ans_i].was_chosen = false; + answers[ans_i].set_was_chosen(false); } else { (next_q, ans_i) = questions[curr_q].resolve_answer(&questions, &input); - questions[curr_q].answers[ans_i].was_chosen = true; + let answers = questions[curr_q].answers(); + answers[ans_i].set_was_chosen(true); // Adds the code associated to the user choice. - if questions[curr_q].answers[ans_i].has_code() { - questions[curr_q].answers[ans_i].add_code(&mut code_content); + if !answers[ans_i].code().is_empty() { + code_content.push(answers[ans_i].code().to_string()); } - // If there are any questions that should be skipped because of that answer. - if !questions[curr_q].answers[ans_i].skip.is_empty() { + // If there are any questions that should be skipped because of that answer, we skip them. + if !answers[ans_i].skip().is_empty() { questions[curr_q] .clone() .skip_questions(&mut questions, ans_i); } // Only updates the 'previous' field when going forward (not undoing) in the questions diagram. - let q_id = questions[curr_q].id.clone(); - questions[next_q].update_previous(q_id); + let q_id = questions[curr_q].id().clone(); + questions[next_q].set_previous(q_id); } input.clear(); curr_q = next_q; @@ -95,11 +104,13 @@ fn main() { let (imports_content, code_content) = separate_imports(code_content); - // Separate by instances of components, arrange them in the correct order and write to the file. - let file_name = write_code( - arrange_code(separate_code(code_content)), - arrange_imports(imports_content), - ); + println!("IMPORTS:"); + for i in &imports_content { + println!("{}", i); + } + + // Separate by instances of components/imports, arrange them in the correct order and write to the file. + let file_name = write_code(arrange_code(code_content), arrange_imports(imports_content)); println!( "\nFile {} successfully created in the ./fuzzers directory.\nAll questions answered!", diff --git a/libafl_wizard/src/question.rs b/libafl_wizard/src/question.rs index 30a4c5c79a..c8afece335 100644 --- a/libafl_wizard/src/question.rs +++ b/libafl_wizard/src/question.rs @@ -3,36 +3,35 @@ use graphviz_rust::{ exec, printer::PrinterContext, }; - -use std::fs::read_to_string; - use serde::Deserialize; - +use std::fs::read_to_string; use toml::from_str; use crate::answer::Answer; use crate::utils::validate_input; -// Used to read the TOML file. +/// Used to read the TOML file containing the questions. #[derive(Deserialize)] pub struct QuestionList { question: Vec, } +/// The Question struct contains all the necessary information that a question +/// must have, such as the title containing the question being asked and the set +/// of possible answers for this particular question. #[derive(Clone, Deserialize, PartialEq, Debug)] pub struct Question { - pub id: String, // The id is resolved to local indexes. - pub title: String, // The question itself. - pub content: String, // Description related to the question, to help the user. - pub skipped_by: String, // The question that skipped the current one. - pub previous: String, // The question that led to the current one. - pub answers: Vec, + id: String, + title: String, + content: String, + skipped_by: String, + previous: String, + answers: Vec, } impl Question { - // Builds the diagram of questions from the toml file. - // The diagram is a vector of Questions (vector of nodes): each Question, depending on the answer, will have the index of the next - // Question that should be asked. + /// Reads the questions in the TOML file to a vector, where each field is an + /// unique question. pub fn new() -> Vec { let contents = read_to_string("questions.toml").expect("Failed to read questions file."); @@ -41,6 +40,56 @@ impl Question { q_list.question } + /// Returns the id of the question, which is used to differentiate between + /// questions. + pub fn id(&self) -> String { + self.id + } + + /// Returns the title of the question, which in most cases is the questions + /// being asked. + /// + /// The 'title' is also used as the text of the nodes in the flowchart + /// image. + pub fn title(&self) -> String { + self.title + } + + /// Returns the description of the question, usually some information to + /// help the user understand the concepts associated with a particular + /// question. + pub fn content(&self) -> String { + self.content + } + + /// Returns the id of the question that skipped the one under consideration. + pub fn skipped_by(&self) -> String { + self.skipped_by + } + + /// Sets that this particular question was skipped by the one with this id. + pub fn set_skipped_by(&self, id: String) { + self.skipped_by = id; + } + + /// Returns the id of the question that led to the current one. + pub fn previous(&self) -> String { + self.previous + } + + /// Sets that this particular question came after the one with this id was + /// answered. + pub fn set_previous(&self, id: String) { + self.previous = id; + } + + /// Returns the set of possible answers for this question, excluding the + /// Undo option. + pub fn answers(&self) -> Vec { + self.answers + } + + /// Prints all the relevant information of this question. pub fn print_question(&self) { let mut output = String::new(); @@ -48,11 +97,16 @@ impl Question { output.push_str(&format!( "+=====================+\n| libafl_wizard |\n+=====================+\n\n" )); - output.push_str(&format!("{}\n\n", self.title)); - output.push_str(&format!("{}\n\n\t", self.content)); - - for ans in self.answers.iter() { - output.push_str(&format!("{}{}|{}", ans.answer, " ".repeat(4), " ".repeat(4))); + output.push_str(&format!("{}\n\n", self.title())); + output.push_str(&format!("{}\n\n\t", self.content())); + + for ans in self.answers().iter() { + output.push_str(&format!( + "{}{}|{}", + ans.answer(), + " ".repeat(4), + " ".repeat(4) + )); } output.push_str("Undo\n"); @@ -60,28 +114,28 @@ impl Question { print!("{}", output); } - // Checks if the user typed one of the acceptable answers or is undoing. + /// Checks if the user typed one of the acceptable answers or is undoing. pub fn is_answer(&self, input: &String) -> bool { if input.is_empty() { return false; + } else if validate_input(&input, &String::from("Undo")) { + return true; } - for ans in self.answers.iter() { - if validate_input(&input, &ans.answer) { + for ans in self.answers().iter() { + if validate_input(&input, &ans.answer()) { return true; } } - if validate_input(&input, &String::from("Undo")) { - return true; - } - false } + /// Returns the index of the chosen answer in the vector of possible answer + /// for this given question. pub fn chosen_answer(&self) -> usize { - for (i, ans) in self.answers.iter().enumerate() { - if ans.was_chosen { + for (i, ans) in self.answers().iter().enumerate() { + if ans.was_chosen() { return i; } } @@ -89,17 +143,22 @@ impl Question { 0 } + /// Returns a tuple containing the id of the next question and the index of + /// answer chosen for this question. + /// + /// If an invalid answer is provided, the function returns 0 as default for + /// both values. pub fn resolve_answer(&self, questions: &Vec, input: &String) -> (usize, usize) { // Checks which of the acceptable answers the user typed. If so, returns the index of the next question associated to it. - for (i, ans) in self.answers.iter().enumerate() { - if validate_input(&input, &ans.answer) { - let mut next_q = find_question(questions, &ans.next); + for (i, ans) in self.answers().iter().enumerate() { + if validate_input(&input, &ans.answer()) { + let mut next_q = find_question(questions, &ans.next()); // If the question should be skipped, then the wizard goes to next question. // These types of questions should always have only one possibility for next question because the wizard cant infer // which answer the user would have chosen. - while !questions[next_q].skipped_by.is_empty() { - next_q = find_question(questions, &ans.next); + while !questions[next_q].skipped_by().is_empty() { + next_q = find_question(questions, &ans.next()); } return (next_q, i); @@ -109,38 +168,41 @@ impl Question { (0, 0) } + /// Marks the questions to be skipped. pub fn skip_questions(&self, questions: &mut Vec, ans_i: usize) { - for q_id in self.answers[ans_i].skip.iter() { + let answers = self.answers(); + + for q_id in answers[ans_i].skip().iter() { let i = questions .iter() - .position(|question| &question.id == q_id) + .position(|question| &question.id() == q_id) .unwrap(); - questions[i].skipped_by = self.id.clone(); + questions[i].set_skipped_by(self.id().clone()); } } + /// Unmarks the questions that would be skipped. pub fn unskip_questions(&self, questions: &mut Vec, ans_i: usize) { - for q_id in self.answers[ans_i].skip.iter() { + let answers = self.answers(); + + for q_id in answers[ans_i].skip().iter() { let i = questions .iter() - .position(|question| &question.id == q_id) + .position(|question| &question.id() == q_id) .unwrap(); - questions[i].skipped_by.clear(); + questions[i].set_skipped_by("".to_string()); } } - pub fn update_previous(&mut self, q_id: String) -> () { - // Saves the current questions as the previous for the next one. - self.previous = q_id; - } - + /// Returns true if, for the given set of answers for this question, at + /// least one leads to a different next question than the others. pub fn diff_next_questions(&self) -> bool { - for (i, ans1) in self.answers.iter().enumerate() { - for (j, ans2) in self.answers.iter().enumerate() { + for (i, ans1) in self.answers().iter().enumerate() { + for (j, ans2) in self.answers().iter().enumerate() { if i != j { - if ans1.next != ans2.next { + if ans1.next() != ans2.next() { return true; } } @@ -151,61 +213,69 @@ impl Question { } } -// Resolves the index in the vector for the specific question. +/// Returns the index of the question in the questions vector that has id == q. pub fn find_question(questions: &Vec, q: &String) -> usize { questions .iter() - .position(|question| &question.id == q) + .position(|question| &question.id() == q) .unwrap() } -// Requires 'graphviz' to be installed on the machine, or results in an error. +/// Generates an image containg the flowchart of the questions of the wizard. +/// +/// Requires 'graphviz' to be installed on the machine, or panics. pub fn flowchart_image(questions: &Vec) { let mut dot_string = String::from("digraph t {\n"); for q in questions { - if q.id != "END" { - dot_string.push_str(&format!("\t\"{}\"[color=black]\n", q.title)); + if q.id() != "END" { + dot_string.push_str(&format!("\t\"{}\"[color=black]\n", q.title())); - // CHANGE HERE if !q.diff_next_questions() { let j = questions .iter() - .position(|question| &question.id == &q.answers[0].next) + .position(|question| &question.id() == &q.answers[0].next()) .unwrap(); // Yes or No questions that lead to the same next. - if q.answers.len() <= 2 { - for ans in &q.answers { + if q.answers().len() <= 2 { + for ans in &q.answers() { dot_string.push_str(&format!( "\t\"{}\" -> \"{}\"\n[label=\"{}\"]", - q.title, questions[j].title, ans.answer, + q.title(), + questions[j].title(), + ans.answer(), )); } } else { // Multiple answers that lead to the same next. dot_string.push_str(&format!( "\t\"{}\" -> \"{}\"\n[label=\"{}\"]", - q.title, questions[j].title, q.answers[0].answer, + q.title(), + questions[j].title(), + q.answers[0].answer(), )); dot_string.push_str(&format!( "\t\"{}\" -> \"{}\"\n[label=\"...\"]", - q.title, questions[j].title, + q.title(), + questions[j].title(), )); } } // Multiple answers that lead to distinct next questions. else { - for ans in q.answers.iter() { + for ans in q.answers().iter() { let j = questions .iter() - .position(|question| question.id == ans.next) + .position(|question| question.id() == ans.next()) .unwrap(); dot_string.push_str(&format!( "\t\"{}\" -> \"{}\"\n[label=\"{}\"]", - q.title, questions[j].title, ans.answer, + q.title(), + questions[j].title(), + ans.answer(), )); } } diff --git a/libafl_wizard/src/utils.rs b/libafl_wizard/src/utils.rs index 6bb90a1275..6455080899 100644 --- a/libafl_wizard/src/utils.rs +++ b/libafl_wizard/src/utils.rs @@ -5,6 +5,7 @@ use std::{ process::Command, }; +/// Clears the terminal screen. pub fn clear_terminal_screen() { if cfg!(target_os = "windows") { Command::new("cmd") @@ -22,7 +23,28 @@ pub fn clear_terminal_screen() { }; } -pub fn separate_code(code_content: Vec) -> Vec { +/// Returns true if the 'input' provided by the user is equal to 'ans'. +pub fn validate_input(input: &String, ans: &String) -> bool { + let input_low = input.to_lowercase(); + let mut input_chars = input_low.chars(); + let ans_low = ans.to_lowercase(); + let mut ans_chars = ans_low.chars(); + + // Basically, an aswer is valid if it is an acceptable variant of that given answer. Acceptable variants are strings that contain + // the characters in the same order as the answer, so for the answer "Yes", acceptable variants are: "y", "Ye", "yes", "YES", but + // not "Yess", "yy", "Yhes", "yYess"... + while let (Some(input_c), Some(ans_c)) = (input_chars.next(), ans_chars.next()) { + if input_c != ans_c { + return false; + } + } + + true +} + +/// Returns a vector containing indivdual declarations of Libafl's components +/// and sorted according to correct order of components. +pub fn arrange_code(code_content: Vec) -> Vec { // List of libafl's components. let components = vec![ "Observer", @@ -38,6 +60,33 @@ pub fn separate_code(code_content: Vec) -> Vec { "Stage", ]; + let code_content = separate_code(code_content, &components); + + let mut ordered_code: Vec = Vec::new(); + let mut placed_code: Vec = vec![false; code_content.len()]; + + for comp in components { + for (i, code_line) in code_content.iter().enumerate() { + if code_line.contains(comp) { + // Place in the correct order. + ordered_code.push(code_line.to_string()); + placed_code[i] = true; + } + } + } + + // Deals with cases where there is no definition of a component. + for (i, code_line) in code_content.iter().enumerate() { + if !placed_code[i] { + ordered_code.insert(i, code_line.to_string()); + } + } + + ordered_code +} + +/// Returns a vector containing individual declarations of Libafl's components. +fn separate_code(code_content: Vec, components: &Vec<&str>) -> Vec { let mut separated_code: Vec = Vec::new(); for code_string in code_content { @@ -69,45 +118,7 @@ pub fn separate_code(code_content: Vec) -> Vec { separated_code } -pub fn arrange_code(code_content: Vec) -> Vec { - // List of libafl's components. - let components = vec![ - "Observer", - "Feedback", - "State", - "Monitor", - "Event", - "Scheduler", - "Fuzzer", - "Executor", - "Generator", - "Mutator", - "Stage", - ]; - - let mut ordered_code: Vec = Vec::new(); - let mut placed_code: Vec = vec![false; code_content.len()]; - - for comp in components { - for (i, code_line) in code_content.iter().enumerate() { - if code_line.contains(comp) { - // Place in the correct order. - ordered_code.push(code_line.to_string()); - placed_code[i] = true; - } - } - } - - // Deals with cases where there is no definition of a component. - for (i, code_line) in code_content.iter().enumerate() { - if !placed_code[i] { - ordered_code.insert(i, code_line.to_string()); - } - } - - ordered_code -} - +/// Creates a file and writes the imports and code to that file. pub fn write_code(code_content: Vec, imports: Vec) -> String { let mut counter = 0; let mut file_name = format!("fuzzer.rs"); @@ -154,24 +165,8 @@ pub fn write_code(code_content: Vec, imports: Vec) -> String { file_name } -pub fn validate_input(input: &String, ans: &String) -> bool { - let input_low = input.to_lowercase(); - let mut input_chars = input_low.chars(); - let ans_low = ans.to_lowercase(); - let mut ans_chars = ans_low.chars(); - - // Basically, an aswer is valid if it is an acceptable variant of that given answer. Acceptable variants are strings that contain - // the characters in the same order as the answer, so for the answer "Yes", acceptable variants are: "y", "Ye", "yes", "YES", but - // not "Yess", "yy", "Yhes", "yYess"... - while let (Some(input_c), Some(ans_c)) = (input_chars.next(), ans_chars.next()) { - if input_c != ans_c { - return false; - } - } - - true -} - +/// Returns a tuple containing a vector with only the code of the components and +/// another containing only the imports. pub fn separate_imports(code_content: Vec) -> (Vec, Vec) { let mut imports: Vec = Vec::new(); let mut new_code_content: Vec = Vec::new(); @@ -186,7 +181,7 @@ pub fn separate_imports(code_content: Vec) -> (Vec, Vec) import_string.push_str(&format!("{}\n", line)); if line.contains(";") { is_import = false; - imports.push(import_string.trim_end().to_string()); + imports.push(format_import(&import_string)); import_string.clear(); } } else { @@ -196,7 +191,7 @@ pub fn separate_imports(code_content: Vec) -> (Vec, Vec) is_import = true; import_string.push_str(&format!("{}\n", line)); } else { - imports.push(format!("{}\n", line).trim_end().to_string()); + imports.push(format_import(&line.to_string())); } } else { if !trimmed_line.is_empty() { @@ -213,170 +208,185 @@ pub fn separate_imports(code_content: Vec) -> (Vec, Vec) (imports, new_code_content) } +/// Fixes identation and new line characters for the imports. +fn format_import(import: &String) -> String { + let mut new_import = String::new(); + + for (index, line) in import.lines().enumerate() { + let mut line = line.trim().to_string(); + + if index > 0 { + if line != "};" { + line.insert_str(0, " "); + line.push('\n'); + new_import.push_str(&line); + } else { + new_import.push_str(&line); + } + } else { + if !line.contains(";") { + line.push('\n'); + } + new_import.push_str(&line); + } + } + + new_import +} + +/// Arranges all the imports by sorting them alphabetically and making +/// insertions. +/// +/// For example, if there are two 'use libafl::' imports, then their code +/// will be joined so that it becomes only one 'use libafl::' import. pub fn arrange_imports(imports_content: Vec) -> Vec { - // Each field of 'result' is a single import (use). + // Each field of 'result' will be a single import/use of a crate, after the insertions. let mut result: Vec = Vec::new(); for import in imports_content { let mut i: Option = None; - let mut single_line_import = false; - // Check if the crate that we are trying to insert is already in the 'result' vector (final imports). + // Check if the crate that we are trying to insert is already in 'result'. if let Some(i_line) = import.lines().next() { - let mut crate_name = String::new(); - single_line_import = i_line.contains(";"); - - if single_line_import { - if let Some(name) = parse_imports(i_line.trim().to_string()).iter().next() { - crate_name = name.to_string(); + if let Some(crate_name) = i_line.split("::").next() { + if let Some(index) = result.iter().position(|s| s.starts_with(crate_name)) { + i = Some(index); } - } else { - crate_name = i_line.trim().strip_prefix("use ").unwrap().to_string(); - } - - if let Some(index) = result - .iter() - .position(|s| s.starts_with(&format!("use {}::", rm_punct(&crate_name)))) - { - i = Some(index); } } match i { Some(i) => { - let mut single_line_result = false; - - if let Some(r_line) = result[i].lines().next() { - single_line_result = r_line.contains(";"); - } + let mut i_lines = import.lines(); + let mut r_lines = result[i].lines().peekable(); - if single_line_import { - let mut i_line_names = parse_imports(import.trim().to_string()); - if !i_line_names.is_empty() { - i_line_names.remove(0); // Skip the crate name. - } - - if single_line_result { - // Both are single line imports, so no need to iterate through their "lines". - let mut r_line_names = parse_imports(result[i].trim().to_string()); - - if !r_line_names.is_empty() { - r_line_names.remove(0); // Skip the crate name. - } + while let Some(i_line) = i_lines.next() { + if i_line != "};" { + let mut i_chars = i_line.chars().peekable(); + let mut i_name_punct = next_module_name(&i_chars); - if let Some(new_import) = - insert_import(&i_line_names, &r_line_names, &result[i]) - { - result[i] = new_import; + if i_name_punct.starts_with("use ") { + i_name_punct = next_module_name(&i_chars); } - } else { - // Single line into multiline. - let mut r_lines_iter = result[i].lines().skip(1); + let i_name = rm_punct(&i_name_punct).trim(); - while let Some(r_line) = r_lines_iter.next() { - let r_line_names = parse_imports(r_line.trim().to_string()); + while let Some(r_line) = r_lines.next() { + if r_line != "};" { + let mut r_chars = r_line.chars().peekable(); + let mut r_name_punct = next_module_name(&r_chars); - if let Some(new_import) = - insert_import(&i_line_names, &r_line_names, &result[i]) - { - result[i] = new_import; - break; - } - } - } - } else { - let mut i_lines_iter = import.lines().skip(1); - - if single_line_result { - // Multiline into single, so we simply do the opposite. - let mut result_names = parse_imports(result[i].trim().to_string()); - - if !result_names.is_empty() { - result_names.remove(0); // Skip the crate name. - } - let mut insert = false; - while let Some(i_line) = i_lines_iter.next() { - if i_line.trim() != "};" { - let i_line_names = parse_imports(i_line.trim().to_string()); - - if let Some(new_import) = - insert_import(&result_names, &i_line_names, &import) - { - result[i] = new_import; - insert = true; - break; + if r_name_punct.starts_with("use ") { + r_name_punct = next_module_name(&r_chars); } - } - } - if !insert { - result[i].clear(); - for (index, line) in import.lines().enumerate() { - let mut line = line.to_string(); - if index > 0 { - if line.trim() != "};" { - line = line.trim_start().to_string(); - line.insert_str(0, " "); - line.push('\n'); - result[i].push_str(&line); + let r_name = rm_punct(&r_name_punct).trim(); + + if i_name == r_name { + // Iterate on this line. + loop { + i_name_punct = next_module_name(&i_chars); + i_name = rm_punct(&i_name_punct).trim(); + r_name_punct = next_module_name(&r_chars); + r_name = rm_punct(&r_name_punct).trim(); + + if i_name < r_name { + // Check if have to make it a multiple import here. + } else if i_name > r_name { + if let None = peek_next_module_name(&r_chars) { + // Insert at the end and check if have to make it a multiple import. + } + } + } + } else if i_name < r_name { + if r_line.ends_with(";") { + // If inserting in a SL: then make it ML and insert at the beginning. + let (first, second) = r_line.split_inclusive("::"); + let insert_line = i_line.trim().to_string(); + + first.push_str("{\n"); + if insert_line.starts_with("use ") { + insert_line = + insert_line.split_once("::").skip(1).collect(); + } + insert_line.insert_str(0, &" ".repeat(4)); + insert_line.push('\n'); + insert_line = insert_line.replace(";", ","); + second.insert_str(0, &" ".repeat(4)); + second.push('\n'); + second = second.replace(";", ","); + result[i] = + format!("{}{}{}{}", first, insert_line, second, "};"); } else { - result[i].push_str(line.trim_start()); + // If inserting in ML, simply insert the line here. + let mut result_lines = result[i].lines().collect(); + + for (i, line) in result[i].lines().enumerate() { + if line.contains(r_name_punct) { + let insert_line = i_line.trim().to_string(); + + if insert_line.starts_with("use ") { + insert_line = insert_line + .split_once("::") + .skip(1) + .collect(); + } + insert_line.insert_str(0, &" ".repeat(4)); + insert_line.push('\n'); + insert_line = insert_line.replace(";", ","); + result_lines.insert(i, insert_line); + break; + } + } + result[i] = result_lines.join(""); + break; } } else { - line = line.trim_start().to_string(); - line.push('\n'); - result[i].push_str(&line); - } - } - } - } else { - // Both are multiline imports, so we have to iterate through their lines until the last component is checked for insertion. - let mut temp_result = result[i].clone(); - let mut i_lines_iter = import.lines().skip(1); // Skip the crate name. - - while let Some(i_line) = i_lines_iter.next() { - if i_line.trim() != "};" { - let i_line_names = parse_imports(i_line.trim().to_string()); - let mut r_lines_iter = result[i].lines().skip(1); - - while let Some(r_line) = r_lines_iter.next() { - if r_line.trim() != "};" { - let r_line_names = parse_imports(r_line.trim().to_string()); - - if let Some(new_import) = insert_import( - &i_line_names, - &r_line_names, - &temp_result, - ) { - temp_result = new_import; - break; + if r_line.ends_with(";") { + // If inserting in a SL: the make it ML and insert the line at the end. + let (first, second) = r_line.split_inclusive("::"); + let insert_line = i_line.trim().to_string(); + + first.push_str("{\n"); + second.insert_str(0, &" ".repeat(4)); + second.push('\n'); + second = second.replace(";", ","); + if insert_line.starts_with("use ") { + insert_line = + insert_line.split_once("::").skip(1).collect(); + } + insert_line.insert_str(0, &" ".repeat(4)); + insert_line.push('\n'); + insert_line = insert_line.replace(";", ","); + result[i] = + format!("{}{}{}{}", first, second, insert_line, "};"); + break; + } else { + // If inserting in ML, if there arent anymore lines: then insert the line at the end. + if let Some(end) = r_lines.peek() { + if end == "};" { + let mut result_lines = result[i].lines().collect(); + let insert_line = i_line.trim().to_string(); + + if insert_line.starts_with("use ") { + insert_line = insert_line + .split_once("::") + .skip(1) + .collect(); + } + insert_line.insert_str(0, &" ".repeat(4)); + insert_line.push('\n'); + insert_line = insert_line.replace(";", ","); + result_lines + .insert(result_lines.len() - 2, insert_line); + result[i] = result_lines.join(""); + break; + } } } } - result[i] = temp_result.clone(); } } } } - // Fix the formatting. - let mut new_result = String::new(); - for (index, line) in result[i].lines().enumerate() { - let mut line = line.to_string(); - if index > 0 { - if line.trim() != "};" { - line = line.trim().to_string(); - line.insert_str(0, " "); - line.push('\n'); - new_result.push_str(&line); - } else { - new_result.push_str(line.trim()); - } - } else { - line = line.trim().to_string(); - line.push('\n'); - new_result.push_str(&line); - } - } - result[i] = new_result; } None => { // Insert and sort alphabetically. @@ -389,39 +399,40 @@ pub fn arrange_imports(imports_content: Vec) -> Vec { result } -fn parse_imports(import: String) -> Vec { - let mut imports_names: Vec = Vec::new(); - let mut import = import; - - if let Some(import_stripped) = import.trim().strip_prefix("use ") { - import = import_stripped.to_string(); - } - - let mut import_string = String::new(); - let mut chars = import.chars().peekable(); +/// Returns the next module name for an iterator of characters of a line of an +/// import. +fn next_module_name(chars: &mut std::iterator::Peekable) -> String +where + I: Iterator, +{ + let mut module_name = String::new(); while let Some(c) = chars.next() { - import_string.push(c); + module_name.push(c); - // We want to break the import string into 'word::', 'word};'... patterns. - if c == ':' || c == '{' || c == '}' || c == ',' || c == ';' { - if import_string.contains("::") { + if c == ':' { + if module_name.contains("::") { if let Some(&next_char) = chars.peek() { if next_char != '{' { - imports_names.push(import_string.trim().to_string().clone()); - import_string.clear(); + break; } } - } else if import_string.contains(",") || import_string.contains(";") { - imports_names.push(import_string.trim().to_string().clone()); - import_string.clear(); } + } else if module_name.contains(",") || module_name.contains("{") { + if let Some(&next_char) = chars.peek() { + if next_char != '\n' { + break; + } + } + } else if c == ';' { + break; } } - imports_names + module_name } +/// Removes the punctuation characters of the name of a module. fn rm_punct(input: &String) -> String { // Removes the ';', '::', etc from the string. input @@ -429,163 +440,3 @@ fn rm_punct(input: &String) -> String { .filter(|&c| c != ':' && c != ';' && c != ',' && c != '{' && c != '}') .collect() } - -fn insert_import( - import: &Vec, - result: &Vec, - curr_import: &String, -) -> Option { - // Basically, we try to insert 'import' in 'result', and return the new import. - let mut new_import = curr_import.clone(); - let mut i_iter = import.iter(); - let mut r_iter = result.iter(); - - if let Some(i_name_punct) = i_iter.next() { - if let Some(r_name_punct) = r_iter.next() { - let i_name = rm_punct(&i_name_punct); - let r_name = rm_punct(&r_name_punct); - if i_name == r_name { - // Insert into this module. - while let Some(r_name_punct) = r_iter.next() { - if let Some(i_name_punct) = i_iter.next() { - let r_name = rm_punct(&r_name_punct); - let i_name = rm_punct(&i_name_punct); - if i_name < r_name { - if let Some(position) = new_import.find(r_name_punct) { - let mut insert_string = String::new(); - insert_string.push_str(i_name_punct); - while let Some(i_name_punct) = i_iter.next() { - insert_string.push_str(i_name_punct); - } - insert_string = insert_string.replace(";", ","); - new_import.insert_str(position, &insert_string); - - return Some(new_import); - } - } else if r_name_punct.ends_with(",") && i_name > r_name { - // Check if this is the last element. - if let None = r_iter.clone().next() { - let mut r_peek = result.iter().peekable(); - while let Some(name_to_modify) = r_peek.next() { - if let Some(name) = r_peek.peek() { - if &r_name_punct == name { - let mut new_name = name_to_modify.clone(); - new_name.push('{'); - new_import = - new_import.replace(name_to_modify, &new_name); - if let Some(position) = new_import.find(r_name_punct) { - let mut insert_string = String::new(); - insert_string.push_str(i_name_punct); - insert_string.insert(0, ' '); - if insert_string.ends_with(";") { - insert_string = - insert_string.replace(";", "},"); - } else if insert_string.ends_with(",") { - insert_string = - insert_string.replace(",", "},"); - } - new_import.insert_str( - position + r_name_punct.len(), - &insert_string, - ); - - return Some(new_import); - } - } - } - } - } - } - } - } - } else if i_name < r_name { - // No equal module was found, so insert here. - if let Some(position) = new_import.find(r_name_punct) { - let mut insert_string = String::new(); - let mut sp = String::new(); - insert_string.push_str(i_name_punct); - if i_name_punct.contains("{") { - sp = " ".to_string(); - } - let mut i = 0; - while let Some(i_name_punct) = i_iter.next() { - if i > 0 { - insert_string.push_str(&(sp.clone() + i_name_punct)); - } else { - insert_string.push_str(&i_name_punct); - i += 1; - } - if i_name_punct.contains("{") { - sp = " ".to_string(); - i = 0; - } - } - insert_string = insert_string.replace(";", ","); - insert_string.push_str("\n "); - new_import.insert_str(position, &insert_string); - - return Some(new_import); - } - } else { - if new_import.lines().next()?.contains(";") { - let mut insert_string = String::new(); - insert_string.push_str(i_name_punct); - while let Some(i_name_punct) = i_iter.next() { - insert_string.push_str(i_name_punct); - } - let index = new_import.find("::").unwrap_or(0); - let (crate_name, after_insertion) = new_import.split_at(index); - let new_import = format!( - "{}::{}\n {}\n {}\n{}", - crate_name, - "{", - after_insertion.trim_start_matches("::").replace(";", ","), - insert_string.replace(";", ","), - "};", - ); - - return Some(new_import); - } else { - let mut curr_import_lines = curr_import.lines(); - while let Some(line) = curr_import_lines.next() { - if line.contains(r_name_punct) { - break; - } - } - if let Some(next) = curr_import_lines.next() { - if next == "};" && (i_name > r_name) { - // Insert it as the last import. - if let Some(position) = new_import.rfind('\n') { - let mut insert_string = String::new(); - let mut sp = String::new(); - insert_string.push_str(i_name_punct); - insert_string.insert_str(0, "\n "); - if i_name_punct.contains("{") { - sp = " ".to_string(); - } - let mut i = 0; - while let Some(i_name_punct) = i_iter.next() { - if i > 0 { - insert_string.push_str(&(sp.clone() + i_name_punct)); - } else { - insert_string.push_str(&i_name_punct); - i += 1; - } - if i_name_punct.contains("{") { - sp = " ".to_string(); - i = 0; - } - } - new_import.insert_str(position, &insert_string); - - return Some(new_import); - } - } - } - } - } - } - } - - None -} From a5fb809746930fd2c2814235c41f72dfefa579d7 Mon Sep 17 00:00:00 2001 From: matheusbaptistella Date: Sun, 7 Jan 2024 14:18:06 -0300 Subject: [PATCH 21/21] Finished the wizard. --- libafl_wizard/Cargo.toml | 5 +- libafl_wizard/flowchart.png | Bin 73996 -> 0 bytes libafl_wizard/src/answer.rs | 22 +- libafl_wizard/src/main.rs | 8 +- libafl_wizard/src/question.rs | 48 ++-- libafl_wizard/src/utils.rs | 456 +++++++++++++++++++++++----------- 6 files changed, 353 insertions(+), 186 deletions(-) delete mode 100644 libafl_wizard/flowchart.png diff --git a/libafl_wizard/Cargo.toml b/libafl_wizard/Cargo.toml index e4c6157abe..e9f5e6b13f 100644 --- a/libafl_wizard/Cargo.toml +++ b/libafl_wizard/Cargo.toml @@ -9,10 +9,7 @@ repository = "https://github.com/AFLplusplus/LibAFL/" readme = "../README.md" license = "MIT OR Apache-2.0" keywords = ["fuzzing", "testing", "security"] -categories = ["TODO"] - -[features] -ui = [] +categories = ["development-tools::testing"] [dependencies] toml = "0.7.6" diff --git a/libafl_wizard/flowchart.png b/libafl_wizard/flowchart.png deleted file mode 100644 index db5f373eeb30adc51adf473d8b76587acc0ee785..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73996 zcmdSBcRZGV^gn)=kciN-vo{UdD{gxwvPUJ{A$xBjWbf>vl7xipy-5b!zH`W^~}6Ny5d-aCs2 zKe=E^Y7T$kJyMcGqy8fQy{gWRMWL>t6wr4xT~k-a+#IRqswIv~s}#nWh9Y*D?fA{< zZ|I(V&4(8wxri%N8Yp!-=xr+M+uPr#=YC5qd%mt)s{SpQT^guwPlNGL3T?diieJT- z%wPK2#UFz#0S|(>KGTfE2(;%`eOr$_On+G1xjcwHaQa5AkkxZ5LzmB8d`tA!5BV4- zzu=RvwxA0oIM*1Eugs;$c1F^Zuf68k=zqUIJf|Uof?p<6($LV*wz{~unAqBWf9mPu zBjN7h;gujHDjN3f+c$y`5|pg0?1Rz~){mm}H*b;&r&%j@5)u+hTUmW<-3gOr_{r&w(TR{|xKjr-NxcwtNR1^~de~Jo^ zxvlMmv9U4i^7y#X@132_f>mb`coeFPRX$%qPfd*k4-ap4pyTQp(=bJ8Y3apZzbNPQ zUM;ES_A_vBbUgLMVAy`USC6<3F!Ay5sCus@_f@boxL4D@e*GGS3YW#n>S3$BLQ3kl zxQN+v($u_Ite1B<{NVaECZ;C#=TT7?t`gyuy16O63c>9E*s#t;qxt&L49qc^l63I| zv24;w#UYpZOzr2{NvW@1l~hyfE=!cwRd>#7s?^#xREX=TOL(2&}_vv1LV zkL8@=xL%2)FbxAE<5-J_lCnWL%f*@7J#*zO+Zy-N8>b|VjWb4EjR|V9$#H!T2ypB5 zmp@@22U;$FS~fS(PmkyB%P*`*FTR_8mx6O{o0xA((_7Y4BJLpfs=%-u1NLNH+v7W7 zxdf?+2d((ar!9+yzE4aj;Gw~vd!<-_GJmv`N(7F&U$sQ}H{!K@GMwpva z$l+=D`pQbv#>OX&(;P7m=88L*Mg|mK_jsCpY)vg>Nt^C@a9t9XmW2hcu(0sEMalQ& zKfw_Z&$V&`doaJBy)C~jiKM>%(^?Z%B8usqkV5~gxU2Ee0wl)L1krv*#qM(YO^Jsd}7z#m@;1p2nq&&`NCiP z-ub6bpBlxA4{WAee_&V>XY*zfI|}~w$6csBG&D4pyl!w%N9e{y0X=#KhI_GsQ|x4F z18;h*OFfR#F8X8Fen`2xmUW|h|5P_Mp}!{G!Y3dgP!`Q*XNg4f&A>vvDlF{Dsm#8b zoSZy5UZlfiEud_>S~HVt8Mz#ln)-El6P&|EgUZnevkgbx=LHkf#l?JY-o2{`S5r}$ zyPXjm24_3R;_>4%TDh0tJ3Ku6lU^Ri+FDjagIrHfZ#F?{b5uj%dqBV$CMKpfbI$kz za&q#tmXJ;5W4QA>lFBijzdt!W&V>wg2>V?%_*)~J+h1`s&dSQlc;f~sJ3G6)ii*s= zdt^U;{D_K+YqAt>^@S&@oP$ky_l_k};kA8gzeO_`@u5(fYS8TL<2P^L3Nd?k zGgSJJf#VTROH0E%eHtIDGVrG8?OR-KZf<0Z78drEHMe+ph~Xis1f~`iA4GY?#Ap;0 z6y%kaXB8Iy(#6U#P{v0`lky1&WaZ}*pFe;8eL+Fckd>^Lml!1#)!duAZmebBzu#qI zW)@-&eDdUpysBzKYY5JlT@4K4WkY6d1s@dZd>(#(wI^XJb|@$t;H>F59AdT3lM1_4@TGCnqOb@}{kY z?#=<`fPjE&%*-<4wq}nX3#Jv4D?Ee+(#H=84#u>=5p+~yN!2tRKC-q_nj8(?2di)W~UlRQRfCF3<@h(*Q?p8X$_k*t#*gIcBz7PQmR**ZwJX{^(?LYoNf-C^H(=8NbOLP zM1yPh__MP!^LwfHeO_KXxuV^4ZA}erU0`PbY``Z>4+EEB#YIl7k98gKoP}0HH=CN8 zl%G^7(}tJ@gM-o3(wbiE$r5y4xf($y5y4w~NJbol17Sv|%$8m&-yj4gWHQwdXdm

    Ws{nfqs+e$aU;{>d06o}^D6n&4@YS-z!< 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 z zCk;NES?nxtuaGF=(M_DVkE5E@Ztn769$d4rsE@jJYrqs*OiFp~%5ZMIMMQIU>SgoU zw%e6{9CSXOM!h2pHtEfwo0P|x(Sivfcy^G$&owDODlf4emJAzNLOW3L($r!g|0!cN zTPQ_Gtt(Bo)2c${ayhZZ;??iky<9t}`Yk%{riwZ4U05c&F%T7wb!8vrdSJJ7^Os%! z;{qH)j>gKw64Qzy47Mn%qtB#Hnlrg;3wqgLJC9HOh0WS-eRX>#6Z+hbjw%50JSs^t z?&G~fG|^Vv{@`?bEX#5nJ}bLeBl|{fq(f_Hacn-5rc9Z?QZpHKCj6BDaOlftpYBMV zbz|LMkg50fYCB^umKSr7D2fqk8}03?eTAt}V@|0dE*ZB8=)KI9lCXUP~iMH@<-&)X}MATQ_{Mf@mGgC z{->L+_o^ym^o9+;4aV)Sxf$t@S-|p>2u-XE2J#GE+yDF2?PlRl5Kooy3h?y-6oM>M zm6T%ybeH@t)PX)ralIEtCtM1q*nL_wHUj*}lQG0=2tsp-EmM3ngmXV?0G=oJ@H$u8 z*Ra;1rq^k_JTx+F;7r}8m|)6eBG%>1-F`8;d|r=ud{jQ@V6Y^{V{lpnWDC>CcS<)zRd+N z%InQ>>m974?l5RiP&}QL#8wOHI_`KxR&u{<9?2Vo&?M(1JWMt}cKWfri1)`RH@q1~ z)W~M04m{O#{_*JFZXkjCp{KYg}pNT%u-=*27Hd9JMCQjsZN>)H8@qrkw zOjaEHtGtOsLHZwmIM%$5a{ZbSIeWv;mMkdV=;v678GTb|)r3>Qh}F4-sld!#k<=?% z;yEfiC|`j4J9hIWJXOPKyhZ-Wt~I3OpK~XS*Ouvt4->Wj59&i^lxYi;8?v<%ji8Ld zoT(G-p~EZdy-t$`)31piHe9#Y32m3(#lVRTzrE`W^Ry<)t5>N4MhA8A_G~g(gfc3O z!Pt&P_26hY#Z_7}PF96PK7w%`JgT<_JAG=pnOtkcE~}sPUlD-tv4{1=AqbOmH~jW| zo}En*Fyjx-BW%X7dIE4H~1(fOStKS2b=E*E;UH-%4I7_FCB@{<*J z4#_&bekoi+F)4S}c{P7dN7pInAOjCc zjd&jC5uMX%Qo9~Kd)~!LdY6cJ5GhFNg4^JU`b91O{MIq1#S9Onb`(=*sboyFZ=5-E zW^ebv+$e0P#vV4T1z;fPmEDG)YX%t`KeTP7p*~Uh>ndLU{yO4ag< zhD&@L<9adAR%>ZBp*uG7IBYwM%{*B22)GrYu_eX~WCLpbDHqiZMdMBuq>q@OqK4T5 zwd%{ScE77F6t~2=e8IyOes22jGJ6@)(}pk* z5hFejUP)3Cmj%8M>8UMK9O zOG;L_pt6xmimk8+g1=+)OF=2G6br@tiz~{k&QFngY~j=6yP44*)?Nr&Dqb3s5H$+7 zmGRE9UY+${l!Y~s&r64kBH^8I{zl%`sQ!7wOO6$!X2Aug6{$;=w%wA=D74}CPfrZ2 zxekOyZpIyOL=8f5Ko#NPZo2L3GymSrAw1?P`$%PY<7=^kXa(B%!`dUyrb;S=Bxlq_ zT^$;VcwS@%+$iY14T0iiYgZ5kx0lWa^sWP>1B^ay(}gre3b!iV++4XpEFLm5&b_~# zXJz{MZI`2?6G>>1qPuG7)YF;8lBo@D6K%4)n#6%y&=q%soiLedxZ!(t9%Cmx`$%*1 zgy)|r8v5M=v=FyRw7LpoH9byUQdq>%ylSeO_aTn|V|XGlp(QS7HF~sYXbO>C80r#L zLIcoeP&423xqt4)A%J0_Oj8bu^qU!B^4Hlnd8S$N1cbAjoVio>J}L`{c7p^;{$D_Dc(c*1A_mfeDzA-w!mBnzL zIvTTKfVDyuyJoB(5Gq42q*3h3 z9T)_S8G7cz!O?#xsxO}UA3OHyw#y ztn6&dkQ)kGf{mCi&H>jDa9P*$%OnvVP8y)$JLAvl;=`9toqF&KQHVn++yQ!c%$iWE z12KUk3D*@k3~zS}@Iy%?1Y#l&k;jAg5XKZx*tOQdN&k^r>soPBP`!d?F`sM$f&(|m z3u>|acQ#tHY26PpqS(TU2nKk18%xl=iovXV@-8MMj4U)`mncPVRZ2T7!ndMuvH<1iiK}PL`qlfD9^(V-&Q$01FWu!RS+1`7(o1L zOw2I+spJ0|H0V}(dP@a|A~}5#Tb^=m9}YE}=Ww!{e`HUW45Jy4Cs*&>2^^#t@`u+e zDUi0dj{TOgzKK-DIvE;1=YEna1H9BQ-BBf~8$+Uzb0a>*Q)08!K>TKOVgza|-77pe zF)7EGRM77iZ+RA7l-J%I0GAraz(F-wYz%t>ccTI4A`b=LvJ~|A?Bmamo{ryMBGcHUpFx|FDR=)H6Ze zwLqlNu>XOeaTLH9SwMdw%bH^0CDE~HwYpAGtyfPB0O&uZ*K>a0v-pzazUUWi!WRRU zV&KV>Cto72Y)99oSYO%{9JSuip+jM*n!_69J=t{}zV+vR3CiV=?NLS_G*q$gTN}(W zjCq%aPd7EoLd-4WV5(8NiQu0dLl5`bKLkcuKqW&YQoH8+cN*;4EMLp3`s(R<4Rk-N z3$Mu;yhVKFkq(a>ypyzq)cMdfM()wx4t|Ao#Yp$fTecjDYkbh>To1W^izh<)mYDK# zsQ;Gj`+x-i$loe8dBadw%tUaWWyWZ*#T*p(NbuR)NV9}t?IbT zr{$66(;FU=p${s#N9oNcZ4liN5E&}~b(%Lk#zJRotQdy!=t^SyNR#J6=55ksQ6v3I zOCH>6gs&`HbJBJgI91>;AO`@q>x-mrM7!!6NlKuP>S-{kA74@@45CI9mmNM>0>m{8?du@Nl`rI<1!UVg!|W;M>Jhy1rRT|-UK zpt1HKJ)M0I@JM07hI%2h)1K2WDZnQXfP~}(HKWg0ek{Du*UX$L+y+V)#LmoO#Xzqf zI=KW!U@%2HxgIfBu|oNVJK-(>Aht{i_-1}_oBcc-Unu$cF+o-(M%&M|mSWj=YV$g^ zIPnB>WPH%^2{Tm)T(e8j(SEUG1BSlmBc9W7i+eq%MWrll6!4@1#N?4f zr|qhGa#bV7Fn|)1OQ4kJz#y@-s8nkPFSky7HZCPAWtxgtbeJEr@j!7l9Q>xe$6hTO`y)LR;$Ba4nR z_=yJ0nlw;aAK#0DgG<36R+}>8m!6m>d!^q9bF)!_$*=gkL~$*JZ}4i#*zUuaq&<(%Z&IE0t+*g}CZM_8lkm+#wMdr_q*1=nl55?wLb~=8~%Ax{o1YG^|Oz!PRX;JBUQ3Dmz@rD%z7K{*8CB~|)Z{#gV;-nKo z@+Dj15~StzZMAF7p)G}Lry`*Duy;${j{_GfqkOzWt>(=O$mz8DLEopQ-f+18QyVI$ zuI6c7goeP~o2Sh6OmPJICW{+{QsKp(__f;fuETShZf9hs;$XORG!u=K;q!~kUR4$6 zBgbp9W!Of@k7&s>Jq^}J{YRhtv8FgfQou&04sdn!r&7RJvEQ*lz2ddh5}W&VLgCE| z)+*h8kLJpIZeiT8qgCloqTymLjtiZA^Ttb$d7cH;1#5LeJkUHx7U9g#yd~#@amte$ zed8;2+O^vYBKoiGV05iIp@SXldDgKMZVRo#TjmTFbtn`6E~6C}UK~Ec!8}>|Tyj$F z>I*4LQ5e}?u_^!N^Qf@LqsNYI@gI#6!PCdQn|X_gt4?>C35fkEck=lu!-U<4i)TNb z@C?qY0e{cOU?QynkHqBSKm&s(Z;bFbYrrRutk|`4XLFozV#{d`7EW0{Y}lrL{!fbf zbi#&Jp-0ZFOX|n%-;T}<+nUfqXj=SulDG%wB!YYjtxvj|cx3tM5w)54U#yspA(tx=kP+2Za! zryGYvm2N*3@W~K(FJ)DHS%*8P+vYpnNn6Z9|7!Zl;^qKf`& zyoRWG&FlL3>C@Iic=dF85K~XD?hwmFoQs+(>O%%id5@{k$CXEo&&~ZLRty+Xk1jD{ zimz;eYVPW|=4_-AkTAIttC&vEGQ>Lk%gm2mEllrKEdBI6JbrP^G)ehUdG_l-hD6jT zAdf1@jsPwm7M#vb6PDy3>{D6u?c3;59+WnZ^Q>N;f6sQCKxaIW!iiqob;*`L| zAP9m>{R7e20U4wCJjw^?RP_}V=pQm=JZLhuXbBn_rbniJ-@{R<> zOznO!En+JX-P<#lyDZQx=elsE*X9VMs(vUbYf5;1e7`BZyW}MvcE3!QmOGtS5BxVP2 zrG@*tMajxE>H+b&=*ry|;oHXdG1vU+bHVC-R@?v!(@G=A%tf`PeC&A7P}}G1*d1pd z?(k1j7#3ZdyzXgP`|;D%x)l@yj|Wa3pzhJaHrmPm!2(f&tZ0>IIeK)TqPqzzO#3u# zquSf~I`8&~i^4|#a3wve_m4|JnZSB7!E=((TUf|hxJ#rVu@6*g0*C)C}{e7N` zyUy-K)z_|i`ee>LT2m78muX3M^aOF{oU?p+Z&OT?mCh+la9Ve*bE=)c<^*7s@g!ah zSoYjY0zFX%OF)rezbNJ&+8&+S)Z^uwn+`=`6s+P9`h)DYyWpQn!y zb#WM$Ke=x2b(D^c6#b6TFSm-89Cyb}Qd7QtKn7Y(Fl=Qe>Mg|+2=b6Ktlk1d6UDyS z$xVGtrDeE(fi7AWn|LzhB#TT;?u5P|`VnB)BwM=^R#<{nRn;r|?pZdrvS{@DamfGB z#Ox7uEQaH>aJR+LT`(vHR4e@~n9xcgbTNa0P|%^Blwj=#3~0rsDWVws8&6wb+j!yA z=knPDW(3mXQ6Ji4RV&$LjCv#t8(woAO5Uxz)l1bZ`YE;JzUdAie^7s!Y|hqWrV14t zj?*1bMJalfhlq>;)G=^4FxbpvsXMh}ifm4F}9s#-K`+K0uQEcs>TLDQZz?=n&9%IEq1u2f9sG zZi?5;BT_Jh!QK$*%@-LwqryfEDIF6zpiZ|qioN{%?c7`@h1*Asl=i>h$*IVpX-34b z|G(CVMT3?=CJ78DM72dTBjPoxyK9!6i&|0~Vc8mwcB$h}gJWhMtswTSaCW|3UH)2t zM(CT8%0Mr=(r>J}wS@HfsQL>D{osh4?FK!1s3@R0NyG@{_Q=88fZSerxCU*^r(uz> zm;dyB;N`e%(xR&j^wmO}{_XbMVyva5N1scGx9dY;ww<@O#Ypz4BbIcIePS zAYlN`IS?ySDi{>4O#HWI3UAVX;zWAwq3*{|oY>2WDx}~R#h*_728|lM{?ym!oQ)Er zFh4!OTNogMg@v{g{c3L8p~~;cjy_`P3*O$Vt7$dHc>#ews0JmKkIOOa%5PID?XGIt|$n&W%Js znN^YH1HllS?A6=1_bx4|%R_}X<3!j+4F9oq4dkc+hyY`R9`OGL+JGzpJkX%$*!Pbg z9U=Gd7yujni=QW*HhmxI<#MeFlpZ|PfJ2MGd$KhOIuxCOW&qbJB8HlPx6Vo32kw;z z4kiT6$oVZ`UtC<=3>>`!j++BV5*a}wX~6y2z=0Rg4)mg;NtwJSmIK!)0+S`^B1Yg= zWZ>WhaLHU?e7rvEA>aTaa3$2jRja(XI&$TK>(t&Zd;9!3=&n5AyaI6Thy&N(w)201 z+k1g4D}m*Qo3b-;yqz`T3L?>cxJztFmM>wt;A z5tw{nyW+WKJSt!SR%UF~)z!d>ro+II|BNc&hX0&)9gt#RVC=4W25ja?Y`tV=ZVo!h z^}zeTJU--#7trtOt)L5#K+FDsGw4=FF9SoE;lZOvOu!{z zz_JoFWI1o1yTn;j1_p*uPZ!6Kd7$n8z<2=;v-C1;PF$@6T&x2+l?Md=@84^!!obj$ zs2~yW-z{yE5R-Mma)mE}3yMB5GcY))$}uu9tT>_!H0r8K<#iDK<2IARj~o6`wSsX# O9)qW=pUXO@geCy5q!3^L diff --git a/libafl_wizard/src/answer.rs b/libafl_wizard/src/answer.rs index abca527461..e1533bc29a 100644 --- a/libafl_wizard/src/answer.rs +++ b/libafl_wizard/src/answer.rs @@ -14,32 +14,32 @@ pub struct Answer { impl Answer { /// Returns true if this answer was chosen between all the possibilities for /// a given question. - pub fn was_chosen(&self) -> bool { - self.was_chosen + pub fn was_chosen(&self) -> &bool { + &self.was_chosen } /// Returns true if this answer was chosen between all the possibilities for /// a given question. - pub fn set_was_chosen(&self, new_value: bool) { + pub fn set_was_chosen(&mut self, new_value: bool) { self.was_chosen = new_value; } /// Returns a String that represents the text of that answer, e.g "Yes" or /// "No". - pub fn answer(&self) -> String { - self.answer + pub fn answer(&self) -> &String { + &self.answer } /// Returns the id of the next question that will be asked, considering that /// this answer was chosen. - pub fn next(&self) -> String { - self.next + pub fn next(&self) -> &String { + &self.next } /// Returns the Rust code that will be added to the fuzzer file, considering /// that this answer was chosen. - pub fn code(&self) -> String { - self.code + pub fn code(&self) -> &String { + &self.code } /// Returns the ids of the questions that should be skipped, considering @@ -49,7 +49,7 @@ impl Answer { /// particular question, it will skip other questions that shouldn't be /// asked, e.g. if the user doesn't have the source code of the that target /// the wizard shouldn't ask if they can provide a harness. - pub fn skip(&self) -> Vec { - self.skip + pub fn skip(&self) -> &Vec { + &self.skip } } diff --git a/libafl_wizard/src/main.rs b/libafl_wizard/src/main.rs index 9351cccf41..ca982f45bf 100644 --- a/libafl_wizard/src/main.rs +++ b/libafl_wizard/src/main.rs @@ -61,7 +61,7 @@ fn main() { // If the user chooses to undo a question that produced code, the associated code is removed. // Since the Undo option goes backwards, we can simply pop the last piece of code. for ans in questions[next_q].answers().iter() { - if ans.was_chosen() && !ans.code().is_empty() { + if *ans.was_chosen() && !ans.code().is_empty() { code_content.pop(); } } @@ -75,13 +75,12 @@ fn main() { .clone() .unskip_questions(&mut questions, ans_i); } - + let answers = questions[next_q].mut_answers(); answers[ans_i].set_was_chosen(false); } else { (next_q, ans_i) = questions[curr_q].resolve_answer(&questions, &input); let answers = questions[curr_q].answers(); - answers[ans_i].set_was_chosen(true); // Adds the code associated to the user choice. if !answers[ans_i].code().is_empty() { code_content.push(answers[ans_i].code().to_string()); @@ -97,6 +96,9 @@ fn main() { // Only updates the 'previous' field when going forward (not undoing) in the questions diagram. let q_id = questions[curr_q].id().clone(); questions[next_q].set_previous(q_id); + + let answers = questions[curr_q].mut_answers(); + answers[ans_i].set_was_chosen(true); } input.clear(); curr_q = next_q; diff --git a/libafl_wizard/src/question.rs b/libafl_wizard/src/question.rs index c8afece335..89070b2cb9 100644 --- a/libafl_wizard/src/question.rs +++ b/libafl_wizard/src/question.rs @@ -42,8 +42,8 @@ impl Question { /// Returns the id of the question, which is used to differentiate between /// questions. - pub fn id(&self) -> String { - self.id + pub fn id(&self) -> &String { + &self.id } /// Returns the title of the question, which in most cases is the questions @@ -51,42 +51,48 @@ impl Question { /// /// The 'title' is also used as the text of the nodes in the flowchart /// image. - pub fn title(&self) -> String { - self.title + pub fn title(&self) -> &String { + &self.title } /// Returns the description of the question, usually some information to /// help the user understand the concepts associated with a particular /// question. - pub fn content(&self) -> String { - self.content + pub fn content(&self) -> &String { + &self.content } /// Returns the id of the question that skipped the one under consideration. - pub fn skipped_by(&self) -> String { - self.skipped_by + pub fn skipped_by(&self) -> &String { + &self.skipped_by } /// Sets that this particular question was skipped by the one with this id. - pub fn set_skipped_by(&self, id: String) { + pub fn set_skipped_by(&mut self, id: String) { self.skipped_by = id; } /// Returns the id of the question that led to the current one. - pub fn previous(&self) -> String { - self.previous + pub fn previous(&self) -> &String { + &self.previous } /// Sets that this particular question came after the one with this id was /// answered. - pub fn set_previous(&self, id: String) { + pub fn set_previous(&mut self, id: String) { self.previous = id; } /// Returns the set of possible answers for this question, excluding the /// Undo option. - pub fn answers(&self) -> Vec { - self.answers + pub fn answers(&self) -> &Vec { + &self.answers + } + + /// Returns a mutable set of possible answers for this question, excluding + /// the Undo option. + pub fn mut_answers(&mut self) -> &mut Vec { + &mut self.answers } /// Prints all the relevant information of this question. @@ -99,7 +105,6 @@ impl Question { )); output.push_str(&format!("{}\n\n", self.title())); output.push_str(&format!("{}\n\n\t", self.content())); - for ans in self.answers().iter() { output.push_str(&format!( "{}{}|{}", @@ -108,9 +113,7 @@ impl Question { " ".repeat(4) )); } - output.push_str("Undo\n"); - print!("{}", output); } @@ -121,7 +124,6 @@ impl Question { } else if validate_input(&input, &String::from("Undo")) { return true; } - for ans in self.answers().iter() { if validate_input(&input, &ans.answer()) { return true; @@ -135,7 +137,7 @@ impl Question { /// for this given question. pub fn chosen_answer(&self) -> usize { for (i, ans) in self.answers().iter().enumerate() { - if ans.was_chosen() { + if *ans.was_chosen() { return i; } } @@ -175,7 +177,7 @@ impl Question { for q_id in answers[ans_i].skip().iter() { let i = questions .iter() - .position(|question| &question.id() == q_id) + .position(|question| question.id() == q_id) .unwrap(); questions[i].set_skipped_by(self.id().clone()); @@ -189,7 +191,7 @@ impl Question { for q_id in answers[ans_i].skip().iter() { let i = questions .iter() - .position(|question| &question.id() == q_id) + .position(|question| question.id() == q_id) .unwrap(); questions[i].set_skipped_by("".to_string()); @@ -217,7 +219,7 @@ impl Question { pub fn find_question(questions: &Vec, q: &String) -> usize { questions .iter() - .position(|question| &question.id() == q) + .position(|question| question.id() == q) .unwrap() } @@ -239,7 +241,7 @@ pub fn flowchart_image(questions: &Vec) { // Yes or No questions that lead to the same next. if q.answers().len() <= 2 { - for ans in &q.answers() { + for ans in q.answers() { dot_string.push_str(&format!( "\t\"{}\" -> \"{}\"\n[label=\"{}\"]", q.title(), diff --git a/libafl_wizard/src/utils.rs b/libafl_wizard/src/utils.rs index 6455080899..4804fcbece 100644 --- a/libafl_wizard/src/utils.rs +++ b/libafl_wizard/src/utils.rs @@ -30,11 +30,15 @@ pub fn validate_input(input: &String, ans: &String) -> bool { let ans_low = ans.to_lowercase(); let mut ans_chars = ans_low.chars(); - // Basically, an aswer is valid if it is an acceptable variant of that given answer. Acceptable variants are strings that contain + // Basically, an answer is valid if it is an acceptable variant of that given answer. Acceptable variants are strings that contain // the characters in the same order as the answer, so for the answer "Yes", acceptable variants are: "y", "Ye", "yes", "YES", but // not "Yess", "yy", "Yhes", "yYess"... - while let (Some(input_c), Some(ans_c)) = (input_chars.next(), ans_chars.next()) { - if input_c != ans_c { + while let Some(input_c) = input_chars.next() { + if let Some(ans_c) = ans_chars.next() { + if input_c != ans_c { + return false; + } + } else { return false; } } @@ -237,8 +241,8 @@ fn format_import(import: &String) -> String { /// Arranges all the imports by sorting them alphabetically and making /// insertions. /// -/// For example, if there are two 'use libafl::' imports, then their code -/// will be joined so that it becomes only one 'use libafl::' import. +/// For example, if there are two 'use libafl::' imports their code +/// will be joined, so that it becomes only one 'use libafl::' import. pub fn arrange_imports(imports_content: Vec) -> Vec { // Each field of 'result' will be a single import/use of a crate, after the insertions. let mut result: Vec = Vec::new(); @@ -258,130 +262,22 @@ pub fn arrange_imports(imports_content: Vec) -> Vec { match i { Some(i) => { let mut i_lines = import.lines(); - let mut r_lines = result[i].lines().peekable(); while let Some(i_line) = i_lines.next() { - if i_line != "};" { - let mut i_chars = i_line.chars().peekable(); - let mut i_name_punct = next_module_name(&i_chars); - - if i_name_punct.starts_with("use ") { - i_name_punct = next_module_name(&i_chars); - } - let i_name = rm_punct(&i_name_punct).trim(); + if (i_line.starts_with("use ") && i_line.ends_with(";")) + || (!i_line.starts_with("use ") && i_line != "};") + { + let mut r_lines = result[i].lines().peekable(); while let Some(r_line) = r_lines.next() { - if r_line != "};" { - let mut r_chars = r_line.chars().peekable(); - let mut r_name_punct = next_module_name(&r_chars); - - if r_name_punct.starts_with("use ") { - r_name_punct = next_module_name(&r_chars); - } - let r_name = rm_punct(&r_name_punct).trim(); - - if i_name == r_name { - // Iterate on this line. - loop { - i_name_punct = next_module_name(&i_chars); - i_name = rm_punct(&i_name_punct).trim(); - r_name_punct = next_module_name(&r_chars); - r_name = rm_punct(&r_name_punct).trim(); - - if i_name < r_name { - // Check if have to make it a multiple import here. - } else if i_name > r_name { - if let None = peek_next_module_name(&r_chars) { - // Insert at the end and check if have to make it a multiple import. - } - } - } - } else if i_name < r_name { - if r_line.ends_with(";") { - // If inserting in a SL: then make it ML and insert at the beginning. - let (first, second) = r_line.split_inclusive("::"); - let insert_line = i_line.trim().to_string(); - - first.push_str("{\n"); - if insert_line.starts_with("use ") { - insert_line = - insert_line.split_once("::").skip(1).collect(); - } - insert_line.insert_str(0, &" ".repeat(4)); - insert_line.push('\n'); - insert_line = insert_line.replace(";", ","); - second.insert_str(0, &" ".repeat(4)); - second.push('\n'); - second = second.replace(";", ","); - result[i] = - format!("{}{}{}{}", first, insert_line, second, "};"); - } else { - // If inserting in ML, simply insert the line here. - let mut result_lines = result[i].lines().collect(); - - for (i, line) in result[i].lines().enumerate() { - if line.contains(r_name_punct) { - let insert_line = i_line.trim().to_string(); - - if insert_line.starts_with("use ") { - insert_line = insert_line - .split_once("::") - .skip(1) - .collect(); - } - insert_line.insert_str(0, &" ".repeat(4)); - insert_line.push('\n'); - insert_line = insert_line.replace(";", ","); - result_lines.insert(i, insert_line); - break; - } - } - result[i] = result_lines.join(""); - break; - } - } else { - if r_line.ends_with(";") { - // If inserting in a SL: the make it ML and insert the line at the end. - let (first, second) = r_line.split_inclusive("::"); - let insert_line = i_line.trim().to_string(); - - first.push_str("{\n"); - second.insert_str(0, &" ".repeat(4)); - second.push('\n'); - second = second.replace(";", ","); - if insert_line.starts_with("use ") { - insert_line = - insert_line.split_once("::").skip(1).collect(); - } - insert_line.insert_str(0, &" ".repeat(4)); - insert_line.push('\n'); - insert_line = insert_line.replace(";", ","); - result[i] = - format!("{}{}{}{}", first, second, insert_line, "};"); - break; - } else { - // If inserting in ML, if there arent anymore lines: then insert the line at the end. - if let Some(end) = r_lines.peek() { - if end == "};" { - let mut result_lines = result[i].lines().collect(); - let insert_line = i_line.trim().to_string(); - - if insert_line.starts_with("use ") { - insert_line = insert_line - .split_once("::") - .skip(1) - .collect(); - } - insert_line.insert_str(0, &" ".repeat(4)); - insert_line.push('\n'); - insert_line = insert_line.replace(";", ","); - result_lines - .insert(result_lines.len() - 2, insert_line); - result[i] = result_lines.join(""); - break; - } - } - } + if (r_line.starts_with("use ") && r_line.ends_with(";")) + || (!r_line.starts_with("use ") && r_line != "};") + { + if let Some(new_result) = + insert_import(i_line, r_line, r_lines.clone(), &result[i]) + { + result[i] = new_result; + break; } } } @@ -399,13 +295,11 @@ pub fn arrange_imports(imports_content: Vec) -> Vec { result } -/// Returns the next module name for an iterator of characters of a line of an -/// import. -fn next_module_name(chars: &mut std::iterator::Peekable) -> String -where - I: Iterator, -{ +/// Returns a vector containing all the modules names in a line of an import. +fn modules_names(line: &str) -> Vec { + let mut chars = line.chars().peekable(); let mut module_name = String::new(); + let mut names: Vec = Vec::new(); while let Some(c) = chars.next() { module_name.push(c); @@ -414,29 +308,301 @@ where if module_name.contains("::") { if let Some(&next_char) = chars.peek() { if next_char != '{' { - break; + names.push(module_name.clone()); + module_name.clear(); } } } } else if module_name.contains(",") || module_name.contains("{") { - if let Some(&next_char) = chars.peek() { - if next_char != '\n' { - break; + names.push(module_name.clone()); + module_name.clear(); + } else if c == ';' { + names.push(module_name.clone()); + module_name.clear(); + } + } + + names +} + +/// Removes the punctuation characters from the end of the name of a module. +fn rm_punct(name: &String) -> String { + let chars_to_remove = [';', ':', ',', '{', '}']; + + name.trim_end_matches(|c| chars_to_remove.contains(&c)) + .to_string() +} + +/// Checks which kind of insertion should be applied to the import, based on the +/// name of the module. +fn insert_import<'a, T>( + i_line: &str, + r_line: &str, + r_lines: std::iter::Peekable, + curr_result: &String, +) -> Option +where + T: Iterator, +{ + let i_line_names = modules_names(i_line); + let mut i_line_names_iter = i_line_names.iter().peekable(); + let mut i_name_punct = i_line_names_iter.next().unwrap().to_string(); + if i_name_punct.starts_with("use ") { + i_name_punct = i_line_names_iter.next().unwrap().to_string(); + } + let i_name = rm_punct(&i_name_punct); + let i_name = i_name.trim().to_string(); + + let r_line_names = modules_names(r_line); + let mut r_line_names_iter = r_line_names.iter().peekable(); + let mut r_name_punct = r_line_names_iter.next().unwrap().to_string(); + if r_name_punct.starts_with("use ") { + r_name_punct = r_line_names_iter.next().unwrap().to_string(); + } + let r_name = rm_punct(&r_name_punct); + let r_name = r_name.trim().to_string(); + + if i_name == r_name { + insert_on_line(i_line_names_iter, r_line_names_iter, r_line, curr_result) + } else if i_name < r_name { + insert_before_line(i_line, r_line, r_name_punct, curr_result) + } else { + insert_after_line(i_line, r_line, r_lines, curr_result) + } +} + +/// Inserts the import on the current line. +/// +/// For example, "use libafl::feedback::CrashFeedback;" and +/// "use libafl::feedback::TimeoutFeedback" will return: +/// "use libafl::feedback::{CrashFeedback, TimeoutFeedback};" +fn insert_on_line<'a, T>( + mut i_line_names_iter: std::iter::Peekable, + mut r_line_names_iter: std::iter::Peekable, + r_line: &str, + curr_result: &String, +) -> Option +where + T: Iterator + std::iter::DoubleEndedIterator, + T: Clone, +{ + let mut inserted = false; + let mut new_r_line = r_line.to_string(); + + while let Some(i_name_punct) = i_line_names_iter.peek() { + let i_name = rm_punct(&i_name_punct); + + if let Some(r_name_punct) = r_line_names_iter.peek() { + let r_name = rm_punct(&r_name_punct); + + if i_name < r_name { + if r_name_punct.ends_with(",") { + // Make it a multiple import and insert here. + let insert_string = rm_punct(&i_name_punct); + let (first, second) = + new_r_line.split_at(new_r_line.find(r_name_punct.as_str()).unwrap()); + let second = rm_punct(&second.to_string()); + let mut end = "},"; + + if new_r_line.ends_with(";") { + end = "};"; + } + new_r_line = format!("{}{}{}, {}{}", first, "{", insert_string, second, end); + inserted = true; + } else { + let mut r_line_names_iter_rev = r_line_names_iter.clone().rev(); + + if let Some(r_name_punct) = r_line_names_iter_rev.next() { + let insert_string = rm_punct(&i_name_punct); + let (first, second) = + new_r_line.split_at(new_r_line.find(r_name_punct).unwrap()); + let second = rm_punct(&second.to_string()); + let mut end = "},"; + + if new_r_line.ends_with(";") { + end = "};"; + } + new_r_line = + format!("{}{}{}, {}{}", first, "{", insert_string, second, end); + inserted = true; + } } } - } else if c == ';' { - break; + } + // Advance the iterators + if let Some(r_name_punct) = r_line_names_iter.next() { + if let Some(i_name_punct) = i_line_names_iter.next() { + let r_name = rm_punct(&r_name_punct); + + if i_name > r_name { + // If there are no more elements, insert at the end. + if let None = r_line_names_iter.peek() { + let mut insert_string = i_name_punct.to_string(); + + while let Some(i_name_punct) = i_line_names_iter.next() { + insert_string.push_str(i_name_punct); + } + insert_string = rm_punct(&insert_string).trim_end().to_string(); + if r_name_punct.ends_with("},") || r_name_punct.ends_with("};") { + let (first, second) = + new_r_line.split_at(new_r_line.rfind("}").unwrap()); + + new_r_line = format!("{}, {}{}", first, insert_string, second); + } else { + let (first, second) = + r_line.split_at(r_line.find(r_name_punct.as_str()).unwrap()); + let second = second.trim_end().replace(";", ","); + let mut end = "},"; + + if new_r_line.ends_with(";") { + end = "};"; + } + new_r_line = + format!("{}{}{} {}{}", first, "{", second, insert_string, end); + } + let mut result_lines: Vec = + curr_result.lines().map(|line| line.to_string()).collect(); + + for (i, line) in curr_result.lines().enumerate() { + if line == r_line { + result_lines.remove(i); + result_lines.insert(i, new_r_line); + break; + } + } + + return Some(result_lines.join("\n")); + } + } + } + } + } + if inserted { + let mut result_lines: Vec = + curr_result.lines().map(|line| line.to_string()).collect(); + + for (i, line) in curr_result.lines().enumerate() { + if line == r_line { + result_lines.remove(i); + result_lines.insert(i, new_r_line); + break; + } + } + + return Some(result_lines.join("\n")); + } + + None +} + +/// Inserts the import before the current line. +/// +/// For example, "use libafl::executor::InProcessExecutor;" and +/// "use libafl::{ +/// feedback::TimeoutFeedback, +/// };", will return: +/// "use libafl::{ +/// executor::InProcessExecutor, +/// feedback::TimeoutFeedback, +/// };" +fn insert_before_line( + i_line: &str, + r_line: &str, + r_name_punct: String, + curr_result: &String, +) -> Option { + let new_result: String; + + if r_line.ends_with(";") { + // Change format to multiple import and insert as the first line. + let (first, second) = r_line.split_at(r_line.find("::").unwrap() + 2); + let insert_line = format_insert_line(i_line); + let mut first = first.to_string(); + let second = format_insert_line(second); + + first.push_str("{\n"); + new_result = format!("{}{}{}{}", first, insert_line, second, "};"); + } else { + // Simply insert the line here.. + let mut result_lines: Vec = + curr_result.lines().map(|line| line.to_string()).collect(); + + for (i, line) in curr_result.lines().enumerate() { + if line.contains(&r_name_punct) { + let insert_line = format_insert_line(i_line).replace("\n", ""); + + result_lines.insert(i, insert_line); + break; + } + } + new_result = result_lines.join("\n"); + } + + return Some(new_result); +} + +/// Inserts the import before the current line. +/// +/// For example, "use libafl::state::StdState;" and +/// "use libafl::{ +/// feedback::TimeoutFeedback, +/// };", will return: +/// "use libafl::{ +/// feedback::TimeoutFeedback, +/// state::StdState, +/// };" +fn insert_after_line<'a, T>( + i_line: &str, + r_line: &str, + mut r_lines: std::iter::Peekable, + curr_result: &String, +) -> Option +where + T: Iterator, +{ + if r_line.ends_with(";") { + // Change format to multiple import and insert as the last line. + let new_result: String; + let (first, second) = r_line.split_at(r_line.find("::").unwrap() + 2); + let insert_line = format_insert_line(i_line); + let mut first = first.to_string(); + let second = format_insert_line(second); + + first.push_str("{\n"); + new_result = format!("{}{}{}{}", first, second, insert_line, "};"); + + return Some(new_result); + } else { + if let Some(end) = r_lines.peek() { + if end == &"};" { + // If there are no more elements, insert as the last line. + let new_result: String; + let mut result_lines: Vec = + curr_result.lines().map(|line| line.to_string()).collect(); + let insert_line = format_insert_line(i_line).replace("\n", ""); + + result_lines.insert(result_lines.len() - 1, insert_line); + new_result = result_lines.join("\n"); + + return Some(new_result); + } } } - module_name + None } -/// Removes the punctuation characters of the name of a module. -fn rm_punct(input: &String) -> String { - // Removes the ';', '::', etc from the string. - input - .chars() - .filter(|&c| c != ':' && c != ';' && c != ',' && c != '{' && c != '}') - .collect() +/// Formats the import line for insertion. +fn format_insert_line(line: &str) -> String { + let mut insert_line = line.trim().to_string(); + + if insert_line.starts_with("use ") { + let (_, second) = insert_line.split_once("::").unwrap(); + insert_line = second.to_string(); + } + insert_line.insert_str(0, &" ".repeat(4)); + insert_line.push('\n'); + insert_line = insert_line.replace(";", ","); + + insert_line }