Как в python грамотно мутировать строку, готовой библиотекой или вручную

Сначала хочу поделится не большой предысторией: Обязали нас проводить фаззинг тестирование, для получение какого то сертификата, вообщем не суть, "всерьёз" мы этим не пользуемся, делаем "для галочки", но и то что получилось по итогу мне как то не оч нравится. Сейчас делаем так:

  1. Отлавливаем сырой пакет
  2. Распарсиваем нужные поля мутируем(!здесь будет вопрос) их вставляем обратно
  3. И кидаем испорченный пакет на сервер

Все это делается на bash, отправляет пакеты netcat, а мутацией занимается zzuf. zzuf работает следующим образом. Исходная строка в файле test_file выглядит так:

"Hello world! It's a fucking mutation!"

МОЖНО ЧИТАТЬ ОТСЮДА: А мутация работает так:

[root@ub16 09:28 ~]$ zzuf -r 0.1 cat test_file # мутируем на 10%
Hello worhl�!Iv'S!a$otcking iutidin!

[root@ub16 09:27 ~]$ zzuf -r 0.2 cat test_file #мутируем на 20%
�uhmo g��tv%��ww�!a�fuc+aNg2'�tqtio�H 

Я недавно начал изучать python и все действия кроме мутации уже могу делать там, есть острое желание уйти от линукса с башем. Так вот, извините пожалуйста за такую простыню, но может кто сможет помочь мне пройти этот затык.

Есть ли в python какое нибудь готовое решение что бы мутировать строку, может библиотека какая? Да и вообще был бы благодарен общим советам про фаззинг.


Ответы (2 шт):

Автор решения: gil9red

Если я правильно понял, то вам нужен скрипт, который случайно заменит символы строки на случайные символы.

Накидал пример:

import random

def get_mutation(text: str) -> str:
    items = []

    for c in text:
        # Шанс 33%
        if random.randint(0, 2) == 0:
            c = chr((ord(c) + random.randint(0, 255)) % 255)

        items.append(c)

    return ''.join(items)

text = "Hello world! It's a fucking mutation!"
print(text)

print(get_mutation(text))
# HÝl   o #orl­! IísKa Yudinf muäation!

print(get_mutation(text))
# Melo 8oHld! It's ~ Cucùing mutatlod!
→ Ссылка
Автор решения: mkkik

Наивная реализация:

from random import randint, getrandbits


s = "Hello world! It's a fucking mutation!"

def fuzzer(mut):
    fuzz_ind = set()

    while len(fuzz_ind) < len(s) * mut:
        fuzz_ind.update((randint(0, len(s) - 1),))

    return ''.join(c if not n in fuzz_ind else chr(getrandbits(8)) for n, c in enumerate(s))


for m in range(0, 100, 10):
    print(f'{m / 100}: {fuzzer(m / 100)}')


0.0: Hello world! It's a fucking mutation!
0.1: H3xlo wollR! It's a fucking mutation!
0.2: Hel°o wØrldÙ Iý'Ñ a fuking mutõton!
0.3: HÎllÕwor]d§LIt's a 6uckng mutahoÂr
0.4: He¹lµ woÄd! I'åòa fucÉi`gmÒ×at(InD
0.5: Hell± ¶ØKldý IR-÷ú ckAng ½aËso¸!
0.6: ùe§© o
           »!ýIt ËbÅckrnÿ muØaᢠ
0.7: «£1lw´Er! Dä       çSa j]Z÷ng iuø¹SKni
0.8: }&eàÓ-Ç&K<jt'²õsu+C·ygr«Ùt~on
0.9: H¨▒ñÚ|ÇJ7n mRosóöweª{Gå9¥^
→ Ссылка