使用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
相关产品推荐
相关产品推荐

