1

我正在做一项任务,我们必须在我们创建的 dns 服务器上模拟 kaminski 攻击。我目前正在尝试生成伪造的 dns 响应数据包有效负载。使用 dnslib 我正在生成一个数据包,然后 pack() 结果。这给了我一个十六进制文字:

'\xcf\x90\x85\x80\x00\x01\x00\x01\x00\x00\x00\x00\x03abc\x03com\x00\x00\x01\x00\x01\xc0\x0c\x00\x01\x00\ x01\x00\x00\x00\x00\x00\x04\x01\x02\x03\x04'

我不相信这是有效载荷数据的正确格式。具体来说,我认为我需要放弃所有“\ x”,所以我的流将是 cf 90 85 80 ...

不幸的是,我似乎无法做到这一点。字符串操作工具似乎不适用于文字,并且通常的文字-> 字符串转换 (literal_eval) 失败并出现错误:

TypeError: compile() expected string without null bytes

我尝试过的其他转换 (int(packet,0)) 失败,因为部分文字是文本(导致奇数长度)。

可能有一个非常简单的解决方案,有什么帮助吗?

4

1 回答 1

2

在这种情况下,您似乎错过了 '\x' 的含义。'\x' 是Python 字符串文字中可用的转义序列,因此 \xhh 表示十六进制值为hh的字符。

尝试将该字符串转储到文件并将其内容输出为十六进制:

yoni@gaga:~ python -c "file('payload','wb').write('\xcf\x90\x85\x80\x00\x01')"
yoni@gaga:~ hexdump payload 
0000000 cf 90 85 80 00 01                              
0000006

我相信这正是您正在寻找的行为,请继续使用该字符串。但是,如果出于某种原因您确实想将其转换为“人类可读”的十六进制字符串,您可以使用:

''.join(['%x' % ord(x) for x in packet])
于 2013-02-25T20:13:13.070 回答