Использование fuzzing lib (python) - PullRequest
       6

Использование fuzzing lib (python)

1 голос
/ 15 августа 2010

Я пытаюсь использовать эту библиотеку: http://pastebin.com/xgPXpGtw (пример использования: http://pastebin.com/fNFAW3Fh) У меня есть некоторые проблемы, так как я не хочу разбивать в массиве все байты, как он.

Мой тестовый скрипт выглядит так:

import random
from random import *

def onerand(packet):
    pack  = packet[:]
    byte = str(chr(choice(range(256))))
    pack[choice(range(len(packet)))]= byte
    print "fuzzing rand byte:%s\n" % (byte.encode("hex"))
    return pack

test = "\x63\x63\x63\x63\x63\x63\x63\x63\x63\x63\x63\x63\x63\x63"

while True:
   print onerand(test)

А на самом деле возвращает:

Traceback (most recent call last):
  File "test.py", line 14, in <module> 
    print onerand(test)
  File "test.py", line 7, in onerand
    pack[choice(range(len(packet)))]= byte
TypeError: 'str' object does not support item assignment

Так, что я должен сделать, чтобы использовать эту функцию в параметрах теста?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 15 августа 2010

В Python строки неизменны.Вы передаете функции onerand строку, имя аргумента packet, копируете ее, давая локальное имя pack (все еще строка, поэтому неизменяемая), затем вы пытаетесь сделать

pack[whatever] = byte

Индекс не имеет значения: вы пытаетесь изменить неизменяемую строку.Вот что говорит вам сообщение об ошибке, настолько ясно, насколько это возможно, мне кажется: вы не можете этого сделать.

Я не хочу разбивать в массиве все байты

Ну, конечно, вы не можете использовать строку , если вам нужно назначить некоторые из них.Что ты имеешь против массивов?import array, используйте pack = array.array('c', packet) вместо pack = packet[:] и живите долго и счастливо - array.array очень компактен и быстр, и тоже изменчив!

Отредактируйте : вы могли бы сделать это со списком, как в принятом ответе, но это только при действительно высоких относительных затратах в производительности.Рассмотрим, например:

$ py26 -mtimeit -s's="".join([str(x)[0] for x in range(99)]); import array
> ' 'a=array.array("c",s); a[23]="b"; b=a.tostring()'
1000000 loops, best of 3: 1.09 usec per loop
$ py26 -mtimeit -s's="".join([str(x)[0] for x in range(99)]); import array
> ' 'a=list(s); a[23]="b"; b="".join(a)'
100000 loops, best of 3: 7.68 usec per loop

A list - это гораздо более общая структура, чем array.array, которая вам здесь действительно нужна, откуда более чем в семь раз замедляется выбор неправильной структуры данных,(В Python 2.7 это менее страшно, «всего лишь» в 4 раза медленнее - но подумайте, сколько будет стоить вам купить машину в четыре раза быстрее, чем ваша нынешняя, и, возможно, вы согласитесь, что даже ускорение«просто» 4+ раза, а не 7+, все еще является хорошим побочным продуктом; -).

2 голосов
/ 15 августа 2010

вместо pack = packet[:], используйте pack = list(packet), а затем return ''.join(pack) в конце.

вы не можете заменить один байт строки, но вы можете преобразовать его в списоксимволов, замените один предмет, а затем конвертируйте обратно.

...