باستخدام lib fuzzing (python)
سؤال
أحاول استخدام هذه المكتبة: 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
إذن ما الذي يجب أن أفعله لأتمكن من استخدام هذه الوظيفة على معلمات الاختبار؟
شكرًا !
المحلول
بدلاً من pack = packet[:]
, ، استعمال pack = list(packet)
, ، وثم return ''.join(pack)
في نهايةالمطاف.
لا يمكنك استبدال بايت واحد من سلسلة ، ولكن يمكنك تحويلها إلى قائمة بالأحرف ، واستبدال عنصر واحد ، ثم تحويله مرة أخرى.
نصائح أخرى
في بيثون ، السلاسل غير قابلة للتغيير. أنت تمر للعمل 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
أ list
هو بنية أكثر عمومية من array.array
تحتاج حقًا هنا ، حيث تباطؤ أكثر من سبعة من الأوقات في اختيار بنية البيانات الخاطئة. (إنه أقل رعباً في Python 2.7 ، "فقط" تباطؤ بزمن 4 أوقات-ولكن ، فكر في مدى كلفك شراء آلة أسرع أربع مرات من الجهاز الحالي ، وربما توافق على أن السرعة حتى السرعة لا تزال الأمور من خلال "Just" 4+ مرات ، بدلاً من 7+ مرات ، من الناتج الثانوي في الوقت نفسه ؛-).