0

我附加到 tcp 数据包 unsinged long long 值为 4 和附加 unsigned long long 值为 8616616 (我不记得第二个值)。我在 ubuntu 32 上的 c 中执行此操作,因此 unsigned long long 为 8 个字节。

我用 scapy 嗅探数据包并打印 padding.load 。在输出中,我看到了我不理解它们含义的符号 - g, | 另外负载应该是 16 字节,但我没有看到 16 字节。

如果我只附加一个 unsigned long long 我得到 8 个字节,我看不到这些符号

>>> pkt = sniff(count=2,filter="tcp")
>>> raw  = pkt[1].sprintf('%Padding.load%')
>>> raw
"'\\x04\\x00\\x00\\x00\\x00\\x00\\x00\\x00g\\xc4|\\x00\\x00\\x00\\x00\\x00'"


>>> print raw
'\x04\x00\x00\x00\x00\x00\x00\x00g\xc4|\x00\x00\x00\x00\x00'
4

1 回答 1

1

当您打印出 的值时raw,python 会将值大于 31 的所有字节解释为 ASCII 字符。当您看到g该字节的值等于 103 时,同样|是 124 的 ASCII 码。对于 127 以上的字符,python 使用不同的表示形式,这就是您\xc4在输出中使用的原因,该字节的值是 196。

每个字节的实际值raw是:

[4, 0, 0, 0, 0, 0, 0, 0, 103, 196, 124, 0, 0, 0, 0, 0]

长度为 16 个字节。

您可以通过将每个字节的值转换回字符来测试这一点:

>>> values = [4, 0, 0, 0, 0, 0, 0, 0, 103, 196, 124, 0, 0, 0, 0, 0]
>>> as_characters = ''.join(chr(c) for c in values)
>>> as_characters
'\x04\x00\x00\x00\x00\x00\x00\x00g\xc4|\x00\x00\x00\x00\x00'
>>> len(as_characters)
16

我认为您所raw拥有的每个字节都已转义。在我的示例中,当我输出时as_characters我只看到一个反斜杠,你有两个。您可能需要使用类似的东西pkt[1].sprintf('%Padding.loadr%')来获得非转义版本。

于 2012-11-21T21:09:57.473 回答