En utilisant fuzzing lib (python)
Question
Je suis en train d'utiliser cette bibliothèque: http://pastebin.com/xgPXpGtw (un exemple d'utilisation: http://pastebin.com/fNFAW3Fh ) J'ai quelques questions que je ne veux pas que Split dans un tableau tout l'octet comme il le fait.
Mon script de test ressemble à ceci:
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)
Et en fait des retours:
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
Alors, que dois-je faire pour pouvoir utiliser cette fonction sur les paramètres de test?
Merci!
La solution
au lieu de pack = packet[:]
, utilisez pack = list(packet)
, puis return ''.join(pack)
à la fin.
vous ne pouvez pas remplacer un seul octet d'une chaîne, mais vous pouvez le convertir en une liste de caractères, remplacer un élément, puis reconvertir.
Autres conseils
En Python, les chaînes sont immuables. Vous passez à la fonction onerand
une chaîne, packet
nom de l'argument, le copier donnant un nom local pack
(encore une chaîne, donc toujours immuable), alors vous essayez de faire
pack[whatever] = byte
l'indice n'a pas d'importance: vous essayez de modifier la chaîne immuable. C'est ce que le message d'erreur vous dit aussi clairement que possible, il me semble. Vous ne pouvez pas le faire
Je ne veux pas diviser dans un tableau tous l'octet
Eh bien, vous ne peut certainement pas utiliser un string , si vous avez besoin d'assigner certains d'entre eux. Qu'est-ce que vous avez contre des réseaux, de toute façon? import array
, l'utilisation pack = array.array('c', packet)
au lieu de pack = packet[:]
, et vivre heureux pour toujours - un array.array
est très compact et rapide, et mutable trop
Modifier : vous peut le faire avec une liste, comme dans la réponse acceptée, mais c'est seulement à un coût relatif vraiment forte performance. Prenons, par exemple:
$ 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
est une structure beaucoup plus générale que la array.array
vous avez vraiment besoin ici, d'où le ralentissement de plus-que-sept fois dans le choix de la structure de données erronées. (Il est moins terrible dans Python 2.7, « seulement » un 4 fois-plus ralentissement - mais, pensez combien il vous en coûterait pour acheter une machine quatre fois plus vite que votre actuel, et peut-être vous d'accord que la vitesse excessive même les choses par « juste » 4+ fois, au lieu de 7+ fois, est encore un sous-produit bien utile; -.)