最近,我一直试图保存从捕获的dhcp包的主机名列表。我发现,每个dhcp主机名(选项12)都应该有rfc 1035中定义的表单。因此,如果我理解正确,主机名应该用7位ascii编码,并有其他限制,如:
-名称不应该以数字开头,并且应该省略一些禁止的字符。
我在数据包中遇到的几乎所有设备都满足此限制,但不是Windows设备(供应商ID MSFT 5.0)。imho windows dhcp client接受计算机(移动)名称并将其填入hostname选项。
例如,当计算机名设置为“luk_-pc”时,就会出现问题。wireshark将此主机名显示为luk\240\347-pc(240和347是八进制数字)。为了亲眼看看,我用printf(“%hhu”,c)(c语言)将值打印在数据包中。
á = 160
š = 231
我认为这是简单的字符变量溢出。我试着从溢出值中推断出原始值,但没有发现字符和已知编码之间的任何关系。所以我的问题是:
有没有办法将这些值转换回原始值?
如果是,当溢出发生时,原始字符编码是什么?
谢谢.
最佳答案
默认值char
通常是有符号的,在传递给变量函数时扩展到int
。要确保打印时无符号,请使用printf("%hhu", c)
或printf("%d", (unsigned char)c);
。
正确的编码是不可能知道的,因为它取决于每个系统的设置。
请注意,任何兼容的系统都必须根据RFC 3490对名称进行编码,但windows似乎喜欢违反标准。