Python小脚本折腾记(1)

自己想要尝试对S7协议测试,想通过在保证数据包格式正确的情况下,随意构造不真实的数据发送到目的地,一定程度上算是一种模糊测试?额~~~~

  • 思路

数据包的标识不变,随机生成参数数据,然后通过socket,发送给目标,但是并不能保证每个数据包的内容都是有效的,可能是有很多垃圾内容,所以连接会被RST掉,考虑到这样的情况,只能是不断的重新连接、发包,重复这个过程,并且在每执行一次之后ping设备,设置超时之后将该数据包记录到日志文件中,可能此数据包生效.

  • 编程问题
  • 自动给个位数补"0"
     a = random.randint(0,9)  
     # 括号里的数字表示位数
     b = a.zfill(3)  
     print b  
  • 怎么生成随机的data部分
     # 我neargle给的建议  
     neargle = 20  
     print ''.join(random.choice(string.digits) for i in range(neargle))  
  • 正确生成数据

上面随机生成data部分不合理,我应该是随机生成十六进制的字符串是最理想的状态,在网上搜索得到了写的很好的一段代码

def randomString(n):  
    return (''.join(map(lambda xx:(hex(ord(xx))[2:]),os.urandom(n))))[0:16]  
# 不得不说人家写的真的到位,具体的内容参考连接:[随机生成十六进制字符串](http://blog.csdn.net/amghost/article/details/12883025)  
  • 这一点很重要

这一点很重要,为什么说他重要,因为我们在wireshark抓包的过程中,看到的其实是: 十六进制的ascii显示.

wireshark十六进制ascii显示.png

如果通过python传送的数据应该是下面的格式:

\x03\x00\x00\x16\x11\xe0\x00\x00\x00\x12\x00\xc1\x02\x01\x00\xc2\x02\x01\x02  

而不是:

0300001611e00000001200c1020100c2020102  

这两种方式的显示是一目了然的,后者明显是不会被识别为正常的格式,但是我们生成的是第二种的字符串,我们通过代码转成需要的格式直接发送给目标,中间省略将字符串先转化为"\x00"这样的过程,本来我是不懂得,但是还是找到了我认为比较好的方式,先拿来用了

def str2byte(data):
    base = '0123456789ABCDEF'
    i = 0
    data = data.upper()
    result = ''
    while i < len(data):
        beg = data[i]
        end = data[i+1]
        i += 2
        b1 = base.find(beg)
        b2 = base.find(end)
        if b1 == -1 or b2 == -1:
            return None
        result += chr((b1 << 4) + b2)
    return result  

当时是参照一篇百度知道的回答

所以,基本解决了上面的问题,今晚就开一整晚,让他自己去跑着测试吧,但是感觉效率还是很低,怎么办呢?暂时想不出来…

运行成功wireshark截图.png