Poprzedni fuzzer był dobrym przykładem do nauki, ale nie możemy się po nim wiele spodziewać. Teraz przejdziemy do nieco bardziej zaawansowanego. Ten kolejny fuzzer wygeneruje losowe instrukcje RDMSR/WRMSR, aby rozmyć rejestry specyficzne dla modelu. Chociaż jest to nadal superprosty fuzzer, podobny był w stanie znaleźć prawdziwe błędy, takie jak CVE-2020-0751
Tym razem zamiast generować MSR z losowych liczb całkowitych, używamy zakodowanej na stałe listy msrs (1). Nawet jeśli ta lista nie jest wyczerpująca (na przykład brakuje nam syntetycznych MSR, które są specyficzne dla hypervisora), pozwalamy fuzzerowi na mutację (2) elementów listy, dzięki czemu ostatecznie odkryje nowe MSR. Odkryte MSR są przechowywane w słowniku (3), więc nie tylko MSR jest zapisywany, ale także zawartość, która została odczytana lub zapisana. W ten sposób poprzednia zawartość może zostać uwzględniona w korpusie fuzzingu (4) kolejnych iteracji. Zawartość operacji WRMSR jest również wysyłana (5), ponieważ oznacza to, że wykonanie instrukcji nie spowodowało wyjątku. Metoda flip_bits (6) została zaimplementowana w celu wykonania mutacji danych. Przyjmuje ona dwa argumenty: dane do mutacji (w formie liczby całkowitej) i rozmiar w bitach. Długość bitu w zakresie od 1 do argumentu rozmiaru jest wybierana losowo, co daje większe prawdopodobieństwo małym rozmiarom. Ta długość bitu jest używana do generowania losowej maski bitowej, która jest XORowana względem danych. Uruchommy fuzzer i zobaczmy, co się stanie
Można zaobserwować irytującą liczbę restartów; znacznie spowalniają one proces rozmycia. Powodem jest to, że nie zaimplementowaliśmy żadnego mechanizmu obsługi wyjątków, więc omówimy ten problem w następnej sekcji.