You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用boofuzz实现DNS协议时无法重复生成label结构的问题

DNS协议模糊测试树构建问题:Label重复生成失败

我用boofuzz构建DNS协议模糊测试树时,卡在label与name的定义环节,无法实现label的重复生成。预期程序能生成连续label以组成name:label由长度字节+对应内容字节构成,name由多组label加空字节组成(代码暂未加入空字节)。尝试两种定义方式均存在问题:

  • 现代方式:无任何输出,模糊测试直接结束
  • 静态方式:有输出,但从未生成超过一个label

原代码如下:

from boofuzz import *


if __name__ == "__main__" :
    labelstr = FromFile("labelstr", filename="./wordlist", max_len = 63 )
    labellen = Size("label_len", block_name="labelstr", length=1, endian=">" )

    label = Block("label", children=(labellen, labelstr))

    labelgrp = Repeat("label", block_name="label", min_reps=2, max_reps=10)

    req = Request("dns", children=(label))



    #*******************************************
    # static spec

    s_initialize("dns")

    if s_block_start("label") : 

        s_size(block_name="labelstr",length=1)

        if s_block_start("labelstr") : 
            s_from_file(filename="./wordlist", max_len=63)
        s_block_end()

    s_block_end()
    s_repeat(block_name="label", min_reps=2, max_reps=10,step=1, name="aaa" , fuzzable=False)

        


    print(s_get("dns").render())



    session = Session(
    target=Target(
        connection=UDPSocketConnection("127.0.0.1", 8021)
    ), sleep_time=0.2)

    session.connect(s_get("dns"))
    session.fuzz()

问题原因与修正方案

1. 核心问题分析

  • 现代方式:创建了labelgrp重复块,但未将其加入Request的children列表,仅传入单个label,导致重复逻辑未生效。
  • 静态方式:s_repeat调用位置错误,需包裹住label块的定义,否则boofuzz无法识别要重复的目标结构。

2. 修正后的静态方式代码

from boofuzz import *

if __name__ == "__main__":
    s_initialize("dns")

    # 用s_repeat包裹label结构,明确重复范围
    with s_repeat(min_reps=2, max_reps=10, step=1, name="label_group"):
        if s_block_start("label"):
            # 关联当前块内的labelstr,确保长度计算准确
            s_size(block_name="labelstr", length=1, endian=">", name="label_len")
            if s_block_start("labelstr"):
                s_from_file(filename="./wordlist", max_len=63)
            s_block_end()
        s_block_end()
    
    # 补充DNS域名要求的结束空字节
    s_byte(0x00, name="name_terminator")

    print(s_get("dns").render())

    session = Session(
        target=Target(
            connection=UDPSocketConnection("127.0.0.1", 8021)
        ), sleep_time=0.2
    )
    session.connect(s_get("dns"))
    session.fuzz()

3. 修正后的现代方式代码

from boofuzz import *

if __name__ == "__main__":
    # 定义单个label结构
    labelstr = FromFile("labelstr", filename="./wordlist", max_len=63)
    labellen = Size("label_len", block_name="labelstr", length=1, endian=">")
    label = Block("label", children=(labellen, labelstr))

    # 定义重复的label组
    label_group = Repeat("label_group", block_name="label", min_reps=2, max_reps=10)

    # 补充DNS域名结束空字节
    terminator = Byte("terminator", default_value=0x00)

    # 将重复组和结束字节加入Request
    req = Request("dns", children=(label_group, terminator))

    session = Session(
        target=Target(
            connection=UDPSocketConnection("127.0.0.1", 8021)
        ), sleep_time=0.2
    )
    session.connect(req)
    session.fuzz()

关键修正点

  • 重复块必须纳入顶级结构:现代方式需将label_group作为Request的子元素;静态方式需用s_repeat包裹label块定义。
  • Size块关联准确:确保s_size/Size的block_name与目标内容块完全对应,避免长度计算错误。
  • 补充协议要求的结束字节:DNS域名必须以0x00结尾,符合协议规范。

内容的提问来源于stack exchange,提问作者dMight

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 15:23:10