使用模糊测试库(python)

时间:2010-08-15 02:46:34

标签: python string fuzzing

我正在尝试使用此库: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 个答案:

答案 0 :(得分:3)

在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

list是一个比你真正需要的array.array更通用的结构,因为选择错误的数据结构的速度超过7倍。 (在Python 2.7中它不那么糟糕,“只有”4倍以上的减速 - 但是,想想购买一台机器比现在快4倍的成本是多少,也许你会同意甚至加速“只是”4次以上,而不是7次以上,仍然是一个非常值得的副产品; - )。

答案 1 :(得分:2)

而不是pack = packet[:],最后使用pack = list(packet),然后使用return ''.join(pack)

您无法替换字符串的单个字节,但您可以将其转换为字符列表,替换一个项目,然后转换回来。