LibAFL icon indicating copy to clipboard operation
LibAFL copied to clipboard

Which Observer/Feedback Combination Should I Use for Coverage Guidance?

Open riesentoaster opened this issue 1 year ago • 5 comments

I'm confused as to which combination of MapObservers and Feedbacks I should use. Is there a good overview of what the different options do/how to combine them? I have found some ways to accomplish some progress, but I feel like I might be missing something. Sorry if this is a stupid question.

I'm collecting coverage based on clang's -fsanitize-coverage=trace-pc-guard. The implementation of the two functions is a simple set or counter logic, redirected into some shared memory to get coverage back to the fuzzer:

void __sanitizer_cov_trace_pc_guard_init(uint32_t *start, uint32_t *stop)
{
  if (start == stop)
  {
    return;
  };

  guard_start = start;
  guard_stop = stop;

  memset(guard_start, 0, guard_stop - guard_start);
}

void __sanitizer_cov_trace_pc_guard(uint32_t *guard)
{
	if (!cov_shmem_init) return; // ignore coverage before initialization
	// *(guard - guard_start  cov_shmem_ptr) = 1; // set
	*(guard - guard_start  cov_shmem_ptr) += 1; // counter
}

In the fuzzer, I have a ShMem object that contains the coverage data. How do I process it?

riesentoaster avatar Nov 19 '24 17:11 riesentoaster

If you know the size of the map beforehand, use a ConstMapObserver if you con't, use a StdMapObserver (I think?) And then slot it into any kind of map feedback. Probably it's best to take whatever the Fuzzbench fuzzers use

domenukk avatar Nov 19 '24 18:11 domenukk

The fuzzbench example (fuzzers/inprocess/fuzzbench) uses StdMapObserver > HitcountsMapObserver with track_indices > MaxMapFeedback. I'll try that.

In general, it'd be really nice to have some more beginner-friendly documentation for the observers/feedbacks. The book doesn't go into any details and the code documentation isn't very extensive and requires a good understanding of the different options already.

riesentoaster avatar Nov 19 '24 21:11 riesentoaster

PRs welcome :) Hitcounts wrap a normal map observer and reduce them to buckets. It's a weird one since it consumes another observer

domenukk avatar Nov 20 '24 02:11 domenukk

PRs welcome :)

Not sure you want a PR based on my understanding :D.

This also seems related to #833, which is still a good idea imo.

riesentoaster avatar Nov 20 '24 08:11 riesentoaster

Why would we not want PRs? Better documentation is a very good idea

domenukk avatar Nov 20 '24 20:11 domenukk