Windows DHCP 客户端主机名编码
Windows DHCP client hostname encoding
最近我一直在尝试从捕获的 DHCP 数据包中保存主机名列表。我发现,每个 DHCP 主机名(选项 12) 都应该具有 RFC 1035 中定义的格式。因此,如果我理解正确的话,主机名应该以 7 位 ASCII 编码,并且还有其他限制,例如:
- 名称不应以数字开头,并且应省略一些禁用字符。
我在数据包中遇到的几乎所有设备都满足此限制条件,但 Windows 设备(供应商 ID MSFT 5.0)不满足。恕我直言 Windows DHCP 客户端采用计算机(移动)名称并将其填写在主机名选项中。
当计算机名称设置为 "Lukáš-PC" 时出现问题。 Wireshark 将此主机名显示为 Luk07-PC。 (240 和 347 是八进制数字)。为了亲自查看,我使用 printf("%hhu", c)(C 语言)在数据包中打印了值。
á = 160
š = 231
恕我直言,我认为这是简单的字符变量溢出。我尝试从溢出值中推断出原始值,但我没有发现字符和已知编码之间有任何关系。所以我的问题是:
有什么方法可以将这些值转换回原始值吗?
如果是,原始字符编码是什么,何时发生溢出?
谢谢。
默认 char
通常是有符号的,并在传递给可变函数时扩展到 int
。为确保打印无符号,请使用 printf("%hhu", c)
或 printf("%d", (unsigned char)c);
.
无法知道正确的编码,因为它取决于每个系统的设置。
请注意,任何兼容的系统必须根据RFC 3490对名称进行编码,但Windows似乎喜欢违反标准。
您看到的字符 á 和 š 是使用 code page 852 (Latin-2 - Central European languages) 编码的。
不幸的是,没有简单的方法可以仅通过查看 DHCP 请求来找出所使用的编码。原则上,DHCP 客户端可以使用它想要的任何代码页。如果您在 private/controlled 网络中工作,那么假设所有客户端都使用相同的代码页并使用该特定代码页显式编码字符串可能是安全的。
最近我一直在尝试从捕获的 DHCP 数据包中保存主机名列表。我发现,每个 DHCP 主机名(选项 12) 都应该具有 RFC 1035 中定义的格式。因此,如果我理解正确的话,主机名应该以 7 位 ASCII 编码,并且还有其他限制,例如: - 名称不应以数字开头,并且应省略一些禁用字符。
我在数据包中遇到的几乎所有设备都满足此限制条件,但 Windows 设备(供应商 ID MSFT 5.0)不满足。恕我直言 Windows DHCP 客户端采用计算机(移动)名称并将其填写在主机名选项中。
当计算机名称设置为 "Lukáš-PC" 时出现问题。 Wireshark 将此主机名显示为 Luk07-PC。 (240 和 347 是八进制数字)。为了亲自查看,我使用 printf("%hhu", c)(C 语言)在数据包中打印了值。
á = 160
š = 231
恕我直言,我认为这是简单的字符变量溢出。我尝试从溢出值中推断出原始值,但我没有发现字符和已知编码之间有任何关系。所以我的问题是:
有什么方法可以将这些值转换回原始值吗? 如果是,原始字符编码是什么,何时发生溢出?
谢谢。
默认 char
通常是有符号的,并在传递给可变函数时扩展到 int
。为确保打印无符号,请使用 printf("%hhu", c)
或 printf("%d", (unsigned char)c);
.
无法知道正确的编码,因为它取决于每个系统的设置。
请注意,任何兼容的系统必须根据RFC 3490对名称进行编码,但Windows似乎喜欢违反标准。
您看到的字符 á 和 š 是使用 code page 852 (Latin-2 - Central European languages) 编码的。
不幸的是,没有简单的方法可以仅通过查看 DHCP 请求来找出所使用的编码。原则上,DHCP 客户端可以使用它想要的任何代码页。如果您在 private/controlled 网络中工作,那么假设所有客户端都使用相同的代码页并使用该特定代码页显式编码字符串可能是安全的。