Python帮助理解示例代码

标签 python list fuzzer

我最近一直在尝试学习 python,遇到了一些我很难理解它是如何工作的东西。主要是列表的设计。

有问题的列表来自这篇关于简单模糊测试工具的安全文章:http://blog.securestate.com/post/2009/10/06/How-a-simple-python-fuzzer-brought-down-SMBv2-in-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()]

他使用以下行从中提取一个字节(我想?):

what = packet[:]
where = choice(range(len(packet)))
which = chr(choice(range(256)))
what[where] = which

我从未见过以这种方式设计的列表,而且似乎无法理解它是如何选择的。最让我困惑的是 packet = [chr(int(a, 16)) for a in """,他把所有这些东西都放在了一个看起来像是评论 block 的地方。 . 然后执行 .split(). 0_o

我知道这是一个模糊的问题,但如果有人能向我解释这个问题或指出一些说明这种列表构建风格的文档的方向,我会非常高兴。这看起来是一种非常有效的存储/提取大量字节的方法。

最佳答案

这个

"""
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
"""

只是multiline string .

"""
00 00 00 90
ff 53 4d 42 72 00 00 00 00 18 53 c8 00 00 00 00
""".split()

produces split带有上述字符串的空格:

['00', '00', '00', '90', 'ff', '53', '4d', '42', '72', '00', '00', '00', '00', '18', '53', 'c8', '00', '00', '00', '00']

还有这个:

[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']]

是一个list comprehension它遍历形成的列表并将应用 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']

关于Python帮助理解示例代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10589933/

相关文章:

testing - 模糊测试工具 : Mutate integer within predefined range?

http-post - 用于模糊 HTTP POST 请求的开源模糊工具

c - 模糊 C 网络程序的最佳选择

python 过滤并列出并将 "filtered indices"应用于另一个列表

python - Tkinter 在文本中插入 json 数据

从 R 列表中删除特定类的元素

list - 如何测试两个无序列表的相等性?

python - 如何获取 UTF-8 格式的电子邮件?

python - Matplotlib:绘制像素而不模糊

python - 从python中的列表列表中删除逗号