C S*_*ith 4 python list fuzzer
我最近一直在努力学习python,遇到了一些我很难理解它是如何工作的事情.首先,它是一个列表的设计.
有问题的列表来自这篇安全文章,讨论了一个简单的模糊测试工具:http://blog.securestate.com/post/2009/10/06/How-a-simple-python-fuzzer-brought-down-SMBv2-在-2- seconds.aspx
有问题的实际清单是:
#Negotiate Protocol Request
packet = [chr(int(a, 16)) for a in """
00 00 00 90
ff 53 4d 42 72 00 00 00 00 18 53 c8 00 00 00 00
00 00 00 00 00 00 00 00 ff ff ff fe 00 00 00 00
00 6d 00 02 50 43 20 4e 45 54 57 4f 52 4b 20 50
52 4f 47 52 41 4d 20 31 2e 30 00 02 4c 41 4e 4d
41 4e 31 2e 30 00 02 57 69 6e 64 6f 77 73 20 66
6f 72 20 57 6f 72 6b 67 72 6f 75 70 73 20 33 2e
31 61 00 02 4c 4d 31 2e 32 58 30 30 32 00 02 4c
41 4e 4d 41 4e 32 2e 31 00 02 4e 54 20 4c 4d 20
30 2e 31 32 00 02 53 4d 42 20 32 2e 30 30 32 00
""".split()]
Run Code Online (Sandbox Code Playgroud)
他使用以下几行从它中拉出一个字节(我认为?):
what = packet[:]
where = choice(range(len(packet)))
which = chr(choice(range(256)))
what[where] = which
Run Code Online (Sandbox Code Playgroud)
我从未见过以这种方式设计的列表,似乎无法遵循它如何选择它所做的任何事情.令我最困惑的是packet = [chr(int(a, 16)) for a in """,他把所有这些东西放在看似是评论栏的地方......然后呢.split().0_o
我知道这是一个模糊的问题,但如果有人能够向我解释这一点,或者指向一些解释列表构建方式的文档,我会非常高兴.这看起来像是一种非常有效的存储/提取大量字节的方法.
ovg*_*vin 10
这个
"""
00 00 00 90
ff 53 4d 42 72 00 00 00 00 18 53 c8 00 00 00 00
00 00 00 00 00 00 00 00 ff ff ff fe 00 00 00 00
00 6d 00 02 50 43 20 4e 45 54 57 4f 52 4b 20 50
52 4f 47 52 41 4d 20 31 2e 30 00 02 4c 41 4e 4d
41 4e 31 2e 30 00 02 57 69 6e 64 6f 77 73 20 66
6f 72 20 57 6f 72 6b 67 72 6f 75 70 73 20 33 2e
31 61 00 02 4c 4d 31 2e 32 58 30 30 32 00 02 4c
41 4e 4d 41 4e 32 2e 31 00 02 4e 54 20 4c 4d 20
30 2e 31 32 00 02 53 4d 42 20 32 2e 30 30 32 00
"""
Run Code Online (Sandbox Code Playgroud)
只是多行字符串.
"""
00 00 00 90
ff 53 4d 42 72 00 00 00 00 18 53 c8 00 00 00 00
""".split()
Run Code Online (Sandbox Code Playgroud)
使用上述字符串的空格生成split:
['00', '00', '00', '90', 'ff', '53', '4d', '42', '72', '00', '00', '00', '00', '18', '53', 'c8', '00', '00', '00', '00']
Run Code Online (Sandbox Code Playgroud)
还有这个:
[chr(int(a, 16)) for a in ['00', '00', '00', '90', 'ff', '53', '4d', '42', '72', '00', '00', '00', '00', '18', '53', 'c8', '00', '00', '00', '00']]
Run Code Online (Sandbox Code Playgroud)
是一个列表理解,它通过形成的列表并转换应用于chr(int(a,16))每个值的所有值a.
int(a,16)将包含十六进制字符串表示的字符串转换为int.
chr 将此整数转换为char.
结果是:
>>> [chr(int(a, 16)) for a in ['00', '00', '00', '90', 'ff', '53', '4d', '42', '72', '00', '00', '00', '00', '18', '53', 'c8', '00', '00', '00', '00']]
['\x00', '\x00', '\x00', '\x90', '\xff', 'S', 'M', 'B', 'r', '\x00', '\x00', '\x00', '\x00', '\x18', 'S', '\xc8', '\x00', '\x00', '\x00', '\x00']
Run Code Online (Sandbox Code Playgroud)