(python)处理十六进制字面量转换为字符串或整数或者其他类型

1 投票
1 回答
5379 浏览
提问于 2025-04-17 17:04

我正在做一个作业,任务是模拟一次对我们自己创建的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))也失败了,因为字面量的一部分是文本(导致长度奇怪)。

可能有一个非常简单的解决办法,有谁能帮忙吗?

1 个回答

2

你似乎没有理解在这个上下文中“\x”的意思。“\x”是Python字符串中的一种转义序列,意思是后面跟着的“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])

撰写回答