Python小脚本折腾记(1)
目录
1 0x00 搞事情吧
自己想要尝试对S7协议测试,想通过在保证数据包格式正确的情况下,随意构造不真实的数据发送到目的地,一定程度上算是一种模糊测试?额~~~~
2 0x01 整
- 思路
数据包的标识不变,随机生成参数数据,然后通过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显示.
如果通过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
当时是参照一篇百度知道的回答
3 0x02 最终
所以,基本解决了上面的问题,今晚就开一整晚,让他自己去跑着测试吧,但是感觉效率还是很低,怎么办呢?暂时想不出来…

如果你觉得这篇文章对你有所帮助,欢迎赞赏~
