Как в python грамотно мутировать строку, готовой библиотекой или вручную
Сначала хочу поделится не большой предысторией: Обязали нас проводить фаззинг тестирование, для получение какого то сертификата, вообщем не суть, "всерьёз" мы этим не пользуемся, делаем "для галочки", но и то что получилось по итогу мне как то не оч нравится. Сейчас делаем так:
- Отлавливаем сырой пакет
- Распарсиваем нужные поля мутируем(!здесь будет вопрос) их вставляем обратно
- И кидаем испорченный пакет на сервер
Все это делается на 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 шт):
Если я правильно понял, то вам нужен скрипт, который случайно заменит символы строки на случайные символы.
Накидал пример:
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!
Наивная реализация:
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¥^