Skip to content

Commit 93a89de

Browse files
committed
moar porting
1 parent 1256b03 commit 93a89de

File tree

4 files changed

+123
-105
lines changed

4 files changed

+123
-105
lines changed

fuzzers/baby_fuzzer_swap_differential/Makefile.toml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ command = "cargo"
1919
args = ["build" , "--profile", "${PROFILE}", "--bin", "${FUZZER_NAME}"]
2020
dependencies = [ "cc" ]
2121

22+
[tasks.build]
23+
alias = "fuzzer"
24+
2225
# Run the fuzzer
2326
[tasks.run]
2427
command = "${CARGO_TARGET_DIR}/${PROFILE_DIR}/${FUZZER_NAME}"
@@ -50,4 +53,4 @@ clear = true
5053
script_runner="@shell"
5154
script='''
5255
cargo clean
53-
'''
56+
'''

fuzzers/frida_executable_libpng/src/fuzzer.rs

Lines changed: 46 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,50 @@
11
//! A libfuzzer-like fuzzer with llmp-multithreading support and restarts
22
//! The example harness is built for libpng.
3+
use std::{path::PathBuf, ptr::null};
4+
35
use frida_gum::Gum;
46
use libafl::{
57
corpus::{CachedOnDiskCorpus, Corpus, OnDiskCorpus},
6-
Error,
7-
events::{EventConfig, launcher::Launcher, llmp::LlmpRestartingEventManager},
8-
executors::{ExitKind, inprocess::InProcessExecutor, ShadowExecutor}, feedback_or,
9-
feedback_or_fast,
8+
events::{launcher::Launcher, llmp::LlmpRestartingEventManager, EventConfig},
9+
executors::{inprocess::InProcessExecutor, ExitKind, ShadowExecutor},
10+
feedback_or, feedback_or_fast,
1011
feedbacks::{CrashFeedback, MaxMapFeedback, TimeFeedback, TimeoutFeedback},
1112
fuzzer::{Fuzzer, StdFuzzer},
1213
inputs::{BytesInput, HasTargetBytes},
1314
monitors::MultiMonitor,
1415
mutators::{
15-
scheduled::{havoc_mutations, StdScheduledMutator, tokens_mutations},
16+
scheduled::{havoc_mutations, tokens_mutations, StdScheduledMutator},
1617
token_mutations::{I2SRandReplace, Tokens},
1718
},
18-
observers::{HitcountsMapObserver, StdMapObserver, TimeObserver},
19+
observers::{HitcountsMapObserver, StdMapObserver, TimeObserver, TrackingHinted},
1920
schedulers::{IndexesLenTimeMinimizerScheduler, QueueScheduler},
2021
stages::{ShadowTracingStage, StdMutationalStage},
2122
state::{HasCorpus, HasMetadata, StdState},
23+
Error,
2224
};
2325
#[cfg(unix)]
2426
use libafl::{feedback_and_fast, feedbacks::ConstFeedback};
2527
use libafl_bolts::{
26-
AsSlice,
27-
cli::{FuzzerOptions, parse_args},
28+
cli::{parse_args, FuzzerOptions},
2829
current_nanos,
2930
rands::StdRand,
3031
shmem::{ShMemProvider, StdShMemProvider},
31-
tuples::{Merge, tuple_list},
32+
tuples::{tuple_list, Merge},
33+
AsSlice,
34+
};
35+
#[cfg(unix)]
36+
use libafl_frida::asan::{
37+
asan_rt::AsanRuntime,
38+
errors::{AsanErrorsFeedback, AsanErrorsObserver, ASAN_ERRORS},
3239
};
3340
use libafl_frida::{
3441
cmplog_rt::CmpLogRuntime,
3542
coverage_rt::{CoverageRuntime, MAP_SIZE},
3643
executor::FridaInProcessExecutor,
3744
helper::FridaInstrumentationHelper,
3845
};
39-
#[cfg(unix)]
40-
use libafl_frida::asan::{
41-
asan_rt::AsanRuntime,
42-
errors::{ASAN_ERRORS, AsanErrorsFeedback, AsanErrorsObserver},
43-
};
4446
use libafl_targets::cmplog::CmpLogObserver;
4547
use mimalloc::MiMalloc;
46-
use std::{path::PathBuf, ptr::null};
4748

4849
#[global_allocator]
4950
static GLOBAL: MiMalloc = MiMalloc;
@@ -103,21 +104,22 @@ unsafe fn fuzz(
103104

104105
let coverage = CoverageRuntime::new();
105106
#[cfg(unix)]
106-
let asan = AsanRuntime::new(&options);
107+
let asan = AsanRuntime::new(&options);
107108

108109
#[cfg(unix)]
109-
let mut frida_helper =
110+
let mut frida_helper =
110111
FridaInstrumentationHelper::new(&gum, options, tuple_list!(coverage, asan));
111112
#[cfg(windows)]
112-
let mut frida_helper =
113+
let mut frida_helper =
113114
FridaInstrumentationHelper::new(&gum, &options, tuple_list!(coverage));
114115

115116
// Create an observation channel using the coverage map
116117
let edges_observer = HitcountsMapObserver::new(StdMapObserver::from_mut_ptr(
117118
"edges",
118119
frida_helper.map_mut_ptr().unwrap(),
119120
MAP_SIZE,
120-
));
121+
))
122+
.track_indices();
121123

122124
// Create an observation channel to keep track of the execution time
123125
let time_observer = TimeObserver::new("time");
@@ -133,14 +135,14 @@ unsafe fn fuzz(
133135

134136
// Feedbacks to recognize an input as solution
135137
#[cfg(unix)]
136-
let mut objective = feedback_or_fast!(
138+
let mut objective = feedback_or_fast!(
137139
CrashFeedback::new(),
138140
TimeoutFeedback::new(),
139141
// true enables the AsanErrorFeedback
140142
feedback_and_fast!(ConstFeedback::from(true), AsanErrorsFeedback::new())
141143
);
142144
#[cfg(windows)]
143-
let mut objective = feedback_or_fast!(CrashFeedback::new(), TimeoutFeedback::new());
145+
let mut objective = feedback_or_fast!(CrashFeedback::new(), TimeoutFeedback::new());
144146

145147
// If not restarting, create a State from scratch
146148
let mut state = state.unwrap_or_else(|| {
@@ -156,7 +158,7 @@ unsafe fn fuzz(
156158
&mut feedback,
157159
&mut objective,
158160
)
159-
.unwrap()
161+
.unwrap()
160162
});
161163

162164
println!("We're a client, let's fuzz :)");
@@ -176,19 +178,20 @@ unsafe fn fuzz(
176178
let mutator = StdScheduledMutator::new(havoc_mutations().merge(tokens_mutations()));
177179

178180
// A minimization+queue policy to get testcasess from the corpus
179-
let scheduler = IndexesLenTimeMinimizerScheduler::new(QueueScheduler::new());
181+
let scheduler =
182+
IndexesLenTimeMinimizerScheduler::new(&edges_observer, QueueScheduler::new());
180183

181184
// A fuzzer with feedbacks and a corpus scheduler
182185
let mut fuzzer = StdFuzzer::new(scheduler, feedback, objective);
183186

184187
#[cfg(unix)]
185-
let observers = tuple_list!(
188+
let observers = tuple_list!(
186189
edges_observer,
187190
time_observer,
188191
AsanErrorsObserver::new(&ASAN_ERRORS)
189192
);
190193
#[cfg(windows)]
191-
let observers = tuple_list!(edges_observer, time_observer);
194+
let observers = tuple_list!(edges_observer, time_observer);
192195

193196
// Create the executor for an in-process function with just one observer for edge coverage
194197
let mut executor = FridaInProcessExecutor::new(
@@ -234,7 +237,8 @@ unsafe fn fuzz(
234237
"edges",
235238
frida_helper.map_mut_ptr().unwrap(),
236239
MAP_SIZE,
237-
));
240+
))
241+
.track_indices();
238242

239243
// Create an observation channel to keep track of the execution time
240244
let time_observer = TimeObserver::new("time");
@@ -249,13 +253,13 @@ unsafe fn fuzz(
249253
);
250254

251255
#[cfg(unix)]
252-
let mut objective = feedback_or_fast!(
256+
let mut objective = feedback_or_fast!(
253257
CrashFeedback::new(),
254258
TimeoutFeedback::new(),
255259
feedback_and_fast!(ConstFeedback::from(false), AsanErrorsFeedback::new())
256260
);
257261
#[cfg(windows)]
258-
let mut objective = feedback_or_fast!(CrashFeedback::new(), TimeoutFeedback::new());
262+
let mut objective = feedback_or_fast!(CrashFeedback::new(), TimeoutFeedback::new());
259263

260264
// If not restarting, create a State from scratch
261265
let mut state = state.unwrap_or_else(|| {
@@ -271,7 +275,7 @@ unsafe fn fuzz(
271275
&mut feedback,
272276
&mut objective,
273277
)
274-
.unwrap()
278+
.unwrap()
275279
});
276280

277281
println!("We're a client, let's fuzz :)");
@@ -291,19 +295,20 @@ unsafe fn fuzz(
291295
let mutator = StdScheduledMutator::new(havoc_mutations().merge(tokens_mutations()));
292296

293297
// A minimization+queue policy to get testcasess from the corpus
294-
let scheduler = IndexesLenTimeMinimizerScheduler::new(QueueScheduler::new());
298+
let scheduler =
299+
IndexesLenTimeMinimizerScheduler::new(&edges_observer, QueueScheduler::new());
295300

296301
// A fuzzer with feedbacks and a corpus scheduler
297302
let mut fuzzer = StdFuzzer::new(scheduler, feedback, objective);
298303

299304
#[cfg(unix)]
300-
let observers = tuple_list!(
305+
let observers = tuple_list!(
301306
edges_observer,
302307
time_observer,
303308
AsanErrorsObserver::new(&ASAN_ERRORS)
304309
);
305310
#[cfg(windows)]
306-
let observers = tuple_list!(edges_observer, time_observer,);
311+
let observers = tuple_list!(edges_observer, time_observer,);
307312

308313
// Create the executor for an in-process function with just one observer for edge coverage
309314
let mut executor = FridaInProcessExecutor::new(
@@ -364,7 +369,8 @@ unsafe fn fuzz(
364369
"edges",
365370
frida_helper.map_mut_ptr().unwrap(),
366371
MAP_SIZE,
367-
));
372+
))
373+
.track_indices();
368374

369375
// Create an observation channel to keep track of the execution time
370376
let time_observer = TimeObserver::new("time");
@@ -379,13 +385,13 @@ unsafe fn fuzz(
379385
);
380386

381387
#[cfg(unix)]
382-
let mut objective = feedback_or_fast!(
388+
let mut objective = feedback_or_fast!(
383389
CrashFeedback::new(),
384390
TimeoutFeedback::new(),
385391
feedback_and_fast!(ConstFeedback::from(false), AsanErrorsFeedback::new())
386392
);
387393
#[cfg(windows)]
388-
let mut objective = feedback_or_fast!(CrashFeedback::new(), TimeoutFeedback::new());
394+
let mut objective = feedback_or_fast!(CrashFeedback::new(), TimeoutFeedback::new());
389395

390396
// If not restarting, create a State from scratch
391397
let mut state = state.unwrap_or_else(|| {
@@ -401,7 +407,7 @@ unsafe fn fuzz(
401407
&mut feedback,
402408
&mut objective,
403409
)
404-
.unwrap()
410+
.unwrap()
405411
});
406412

407413
println!("We're a client, let's fuzz :)");
@@ -421,19 +427,20 @@ unsafe fn fuzz(
421427
let mutator = StdScheduledMutator::new(havoc_mutations().merge(tokens_mutations()));
422428

423429
// A minimization+queue policy to get testcasess from the corpus
424-
let scheduler = IndexesLenTimeMinimizerScheduler::new(QueueScheduler::new());
430+
let scheduler =
431+
IndexesLenTimeMinimizerScheduler::new(&edges_observer, QueueScheduler::new());
425432

426433
// A fuzzer with feedbacks and a corpus scheduler
427434
let mut fuzzer = StdFuzzer::new(scheduler, feedback, objective);
428435

429436
#[cfg(unix)]
430-
let observers = tuple_list!(
437+
let observers = tuple_list!(
431438
edges_observer,
432439
time_observer,
433440
AsanErrorsObserver::new(&ASAN_ERRORS)
434441
);
435442
#[cfg(windows)]
436-
let observers = tuple_list!(edges_observer, time_observer,);
443+
let observers = tuple_list!(edges_observer, time_observer,);
437444

438445
// Create the executor for an in-process function with just one observer for edge coverage
439446
let mut executor = FridaInProcessExecutor::new(

0 commit comments

Comments
 (0)