Mit Fuzzing lib (Python)
Frage
Ich versuche, diese Bibliothek zu verwenden: http://pastebin.com/xgPXpGtw (ein Beispiel Verwendung: http://pastebin.com/fNFAW3Fh ) Ich habe einige Probleme, da ich in einem Array alle Byte Split nicht wollen, wie er.
Ihr Testskript sieht wie folgt aus:
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)
Und tatsächlich zurückkehrt:
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
Also, was soll ich tun, der Lage sein, diese Funktion auf die Testparameter zu benutzen?
Danke!
Lösung
statt pack = packet[:]
, Verwendung pack = list(packet)
und dann return ''.join(pack)
am Ende.
Sie können nicht ein einziges Byte einer Zeichenfolge ersetzen, aber man kann es auf eine Liste von Zeichen konvertieren, ersetzen Sie ein Element, und dann konvertieren zurück.
Andere Tipps
In Python sind Strings unveränderlich. Sie passieren zu Funktion onerand
eine Zeichenfolge, Argument Name packet
, kopieren Sie einen lokalen Namen pack
(noch eine Zeichenfolge, nach wie vor damit unveränderlich) geben, dann versuchen Sie zu tun
pack[whatever] = byte
hat der Index keine Rolle: Sie versuchen, die unveränderliche Zeichenfolge zu ändern. Das ist, was die Fehlermeldung Sie, so klar wie möglich erzählt es scheint mir. Sie können das nicht
Ich habe nicht alle in einem Array teilen möchte das Byte
Nun können Sie sicher nicht verwenden, um eine string , wenn Sie einige von ihnen zuweisen müssen. Was haben Sie gegen Arrays eigentlich? import array
, Verwendung pack = array.array('c', packet)
statt pack = packet[:]
und Live für immer glücklich - ein array.array
sehr kompakt und schnell, und zu wandelbar
Bearbeiten : Sie könnte tut es mit einer Liste, wie sie in der akzeptierten Antwort, aber das ist nur bei einem wirklich steil relativ Kosten der Leistung. Betrachten wir zum Beispiel:
$ 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
Ein list
ist eine viel allgemeinere Struktur als die array.array
Sie wirklich hier braucht, von wo aus der Mehr-als-seven-mal Verlangsamung in der falsche Datenstruktur wählen. (Es ist weniger schrecklich in Python 2.7, „nur“ eine 4-fach-plus Verlangsamung - aber denken, wie viel würde es kosten, eine Maschine bis zu viermal schneller als die aktuellen, einem zu kaufen, und vielleicht sehen Sie, dass auch die Beschleunigung zustimmen Dinge von „nur“ 4+ mal, statt 7+ Zeiten, ist immer noch ein gut lohnt Nebenprodukt; -).