一条最小的 DNS 查询

👁️ 2 人浏览 💬 0 人评论 ❤️ 添加收藏

本节的 DNS 小工具:

encode_name("www.example.com")   b"\x03www\x07example\x03com\x00"(每段前面一个长度字节,末尾 0)
build_query(qid, name)           12 字节头(id、标志 0x0100、问题数 1、其余 0)+ 名字 + 类型 A(1) + 类 IN(1)

把 www.example.com 的查询包拼出来,看总长度、名字部分的十六进制、以及头里的问题数:

def encode_name(name):
    """www.example.com → b"\x03www\x07example\x03com\x00" """
    out = b""
    for label in name.split("."):
        out += bytes([len(label)]) + label.encode()
    return out + b"\x00"


def build_query(qid, name):
    """最小的 DNS 查询:12 字节头 + 问题(名字 + 类型 A + 类 IN)。"""
    header = qid.to_bytes(2, "big") + b"\x01\x00" + b"\x00\x01" + b"\x00\x00" * 3
    return header + encode_name(name) + b"\x00\x01" + b"\x00\x01"

q = build_query(0x1234, "www.example.com")
name = encode_name("www.example.com")
print(str(len(q)) + "/" + name.hex() + "/" + str(int.from_bytes(q[4:6], "big")))
提交你的答案
请登录后提交答案。
去登录
代码编辑器
Ctrl + Enter 运行
本次输入:
输出:

                        
👩‍🏫
AI
💬 题目评论

全部评论