2026中国工业互联网安全大赛全国线上预选赛 Writeup 上篇
字数 6330
更新时间 2026-10-25 19:55:42

2026中国工业互联网安全大赛全国线上预选赛 Writeup 上篇

一句话结论:本篇是这套工控安全赛题上篇的复盘,集中在「密码误用的成因与检出」和「工控私有协议的取证与隐蔽信道」两条线;凡解密还原出的明文、flag、诱饵串与答案数值一律剔除,只保留算法缺陷根因、检测范式、加固做法与验证方法论。

排版说明:正文按「机理 / 研判与加固」分节;引号统一用直角引号,公式一律写成纯文本(指数用脱字符或「的 N 次方」,不上 LaTeX),代码内双引号改单引号(序列化载荷除外),字节与十六进制以无转义写法呈现。

一、密码误用与攻击机理

自参考密钥的分组密码(密钥取自同一块明文)

机理:脚本把明文按固定字节分块、每块拆成若干大字,而密钥直接取自同一块明文里的某几个字。这种自参考结构意味着只要能把「用后段做密钥加密的那一段」逆回去,立刻得到这一块的后半,再拿它当密钥逆前半,整块不需要爆破。承载算法是一个加解密小变体:改动只在常数与轮次结构上——把标准的单循环拆成两段连续累加的循环,数学上仍等价,把那个著名增量常数换成另一个奇数,也不改变可解性,因为该类 Feistel 结构的安全性不依赖这个常数的具体取值、它只需保证轮函数扩散,真正影响安全的是轮数与结构本身,这两处没动。

研判与加固:核心认知是「密钥绝不能由它要保护的明文派生」——自参考等于把机密性建立在明文可逆之上,形同没有独立密钥。实现类审计要专门排查密钥调度里是否混入了被加密数据本身。解这类变体的工程教训是解密要严格逆序(先解哪半、和的递减位置、两行先后都不能写反),写错不报错、只会安静解出另一串看似随机的数;唯一可靠的自检是拿加密函数对解密结果再加密一遍、与原密文逐字节比对。这一题本地把明文完整还原、三层独立验证加往返闭合都通过,但没拿到任何外部回执,按口径只能登记为「明文已证明恢复、答案未验证」,投稿时讲清楚比含糊宣称更负责。

批量模数里的共享素因子(生成侧随机源失效)

机理:形态本身就是信号——二十组同指数密文并列给出,正常出题不会一次给这么多、除非预期你在批内做比对。基础体检把常见缺陷逐个过一遍后命中一对非平凡最大公约数,其余各对全部互素,说明是确定性缺陷不是巧合。这个确定性可以从概率上说明:两个独立生成的大素数相同的概率约为二的负一千零二十四次方、实际不可能发生,一旦公因子非平凡,只能是生成侧随机源出问题,典型场景是熵池未初始化、种子硬编码、或同一进程连续生成多对密钥时随机状态未更新——审计报告里写「共享素因子」时,把这三个场景写进去比只写「用了相同素数」有信息量得多。同时把小因子试除、小私钥指数的连分数攻击、模数是否素数幂都过了一遍都没命中,就把范围收敛到共享素因子这一种;连分数那项全部无解还额外说明私钥指数没刻意取小、出题人的缺陷设计集中在密钥生成而非使用环节。

研判与加固:批量场景里共享素因子的检出成本极低,两两求公约数是平方量级的大数除法、二十组只要百来次,实际中只要看到多个模数并列给出,这一步就应是第一动作,比试其它攻击或查因子库都快。加固落在生成侧——密钥生成必须接足熵的随机源、跨设备跨进程不得复用随机状态、上线前跑一遍批量互素自检(对自己签发或采购的全部模数两两求公约数)。恢复出因子后走标准流程(欧拉函数、求私钥指数、解密),且正向重加密回环必须做,因为私钥指数算错时数值仍解得出来、不会报错。

OTA 许可载荷的两条独立缺陷路径

机理:一台保护测控装置支持固件在线升级、升级包尾附许可载荷,厂商用设备公钥封装、设备用私钥解封,而固件摘要签名和许可载荷封装复用了同一批密钥。题面明说存在两类缺陷、各对应一条独立可解路径,等于给了验收标准、两条都要走通。第一条与上一题同源——跨批次比对发现同一个素数被三个批次(在役、已吊销、已被取代)的密钥复用,等于三批私钥全部失效;第二条完全不依赖共享素因子,走小指数广播——在役批次的多条记录公钥指数都取三、模数两两互素、封装同一段明文,这正是同指数广播攻击的充分条件,用中国剩余定理合成后开立方得到精确整数根即可,不需更重的那一步。

研判与加固:两条路解出同一份明文、构成交叉验证,加上逐条记录的重加密回环才算闭环。这道题的设计值得记:同一条链上埋两种缺陷、逼你分别走通,而不是一个缺陷打穿所有;三个状态各有一份能解开的载荷、只有状态字段能裁决。加固落点是——签名密钥与封装密钥必须用途分离、不得复用同一批模数;公钥指数不要取三这类极小值配无填充明文(要用带随机填充的安全填充方案);已吊销与已取代批次的密钥必须真正下线,别把它们和在役批次用同一个素源生成。

窄带链路的线性反馈移位寄存器密钥恢复

机理:抓包里三条上行通道各有一段载荷被改写,但只有台账里标记为当前有效的通道才有取证价值。链路密钥由一个六十四位线性反馈移位寄存器生成——这一点是从帧结构看出来的、不是题面给的。关键突破口是每帧开头的固定明文(链路层标识):已知明文的若干字节在异或加密场景下直接给出等量的比特方程。把多帧联立做高斯消元,秩等于未知数个数说明解唯一、残差为零说明模型正确。

研判与加固:线性反馈移位寄存器被「已知明文加输出直接参与异或加密」打穿是教科书级缺陷——它本身不抗已知明文,绝不能单独拿来当加密。旁证很有说服力:同一通道出现两帧计数器相同、密文之差正好等于明文之差,是计数器复用的直接体现。方法论上,这类题容易出现「模型选错却解出看着可读的内容」,所以要有第二条不依赖线性模型的独立路径(逐帧反推初始状态、跨帧应得同一值)加台账状态裁决,三条证据一致才确认解码正确,单条证据不足以定论。

认证加密的随机数复用与子密钥泄露

机理:台账把协议契约写得很清楚,题面「上行帧计数器异常跳变」是随机数复用的强提示。按随机数与附加认证数据分组统计,得到同组内随机数、附加数据、长度三者都相同的复用组——满足该认证模式灾难性复用的全部条件。这种模式的认证标签是一个有限域上的多项式求值:同一随机数下两帧标签相异或,未知项会部分抵消、把与初始计数块和长度块相关的项都消掉,剩下的就是关于子密钥的低次多项式,在二元一百二十八次域上求根即可;乘法是模某个一百二十八次本原多项式的域乘。根不止一个,区分真根的办法是拿第三帧验证——候选子密钥代入应能重算出抓包里的标签,三根里只有一个同时满足三帧。

研判与加固:最致命的不是标签可伪造,而是「设计上把密钥协商的根和认证的子密钥绑在同一处」——子密钥在整条链路里扮演设备侧长期派生种子,泄露它等价于泄露所有许可的派生源,省一次存储的代价是子密钥一泄露全线失守。加固两条:认证加密的随机数(或计数器)在同一个密钥下绝对不可复用,宁可换密钥也不要重用 nonce;派生根与认证子密钥必须解耦,别让一个中间值同时承担密钥材料与完整性密钥。实现层的坑也值得记:这类域运算的位序是反射的、块内字节进入域元素要与标准严格一致,写错不报错、只会安静给出错误多项式、求出错误子密钥、最后校验失败——看着像密钥错、其实只是字节序错,逐位对拍是唯一办法,且用计算机代数系统的商域实现比手写更稳、两条路径逐位相同再加全部标签匹配,这种密码学自证比看明文是否可读可靠得多。裁决口径仍是「能解开不等于有效」——多份都能正确解开、校验全过,但只有状态标记为当前有效的那份是真结果,其余是自带「非答案」字样的诱饵。

二、工控流量取证与隐蔽信道

私有封装的 Modbus 写载荷还原

机理与取证链:抓包直接喂给解析器读不出东西,因为前几个字节不是标准捕获格式魔数、而是某厂商私有封装头,要先剥封装头再交给解析器。题面三句话各是一个可验证线索(走某协议、数据在写寄存器方向、数据被刻意混淆),把写类功能码逐一枚举、只有一类批量写有输出,方向与协议分支就此确定。取出的寄存器值看着随机,判混淆方式的关键观察是——还原出的编码串里填充符号出现在开头,而规范的标准编码填充只出现在尾部,这是「整串被反转过」的强信号;照这个假设反序剥离(双重反转加标准编码、再补齐对齐填充)即可还原。这里有个易踩的坑:标准解码库遇到开头填充符会直接抛「填充非法」,若第一反应是去补填充或删填充符就掉进坑里——开头出现填充符指向的是反转、而不是编码不完整。

研判与加固:响应帧显示这次写入实际被设备拒绝(非法数据地址),取证意义在于「写入没落库、但载荷已经在流量里」——攻击面和取证面在这里是分开的,攻击者以为没写成,审计侧从流量照样能把载荷拿出来。判别谁异常不能看频次而看功能码与方向:背景是脚本生成的均匀轮询(几个读类功能码各刚好相同的帧数),唯二的写请求就藏在这片均匀背景里。方法上要双路独立复现(一路走协议解析器按功能码过滤、一路完全不带解析器、在原始字节里按协议数据单元签名搜索回切),两路还原结果逐字相同才可信。排除法也各有价值:读响应做可打印字节比例统计与特征比对排除「在读响应里藏文本」、按帧长上限排除大载荷异常,每一条都关闭一个方向。

IEC 104 远动的隐蔽信道(台账白名单裁决)

机理:风电场远动系统里多个主站与终端通信,背景混多种工控与网页协议。核心是一条来自公网的未授权主站曾接入终端并执行总召唤、把数据写进了遥测。找未授权主站靠台账白名单:建链走启动帧、总召唤是特定类型标识的应用层数据单元,按源地址统计总召唤发起者、台账之外的即可疑。还原靠把总召唤响应里超出正常模拟量值域的信息对象值按地址排序拼字节——即被写进遥测的隐藏载荷。

研判:判「谁可疑」不能用流量大小或出现频次(抓包来自镜像口、能看到全部主站通信),要用台账白名单这类硬判据;破题关键是把「未授权接入」与「把数据藏进正常测点值域之外」两件事关联起来。这与下篇同源——「用业务合法通道携带超范围值做隐蔽信道」是工控远动的典型范式,检测侧应对遥测值做合法值域校验、对台账外发起者直接告警。

转速越限取证与未完成项

机理:操作员按实时温度下发转速、设备最多接受某上限、事后发现设备因超速故障,要求定位越限的下发报文。判据拆成三条可验证条件(存在一条下发转速的报文、报文值超过上限、报文属于下发方向),把写寄存器帧按值排序即锁定唯一越限者。有一道嵌套压缩包的题最终答案没在本地形成闭环,属未完成项,此处不展开具体内容、避免给出未经确认的结论。涉及「答案粒度」存疑的(只取值、还是带上下文的完整数据层字节串),因无平台回执也如实标注为无法确认,不把推测当结论。

三、编码与隐写识别

后缀撒谎的图片与配置口令闭合

方法论:一个配置文本、一个图片,图片扩展名与实际格式不符——第一动作应是看魔数而不是看扩展名,头两字节是某格式的起始标记就直接判定真实类型、不必再指望扩展名对应的块结构。图片内容是一段加密代码截图,配置里有一个口令字段,两条线索必须在同一套算法上闭合:从截图还原出「口令直接作密钥参与的可逆替换」,用配置口令跑一遍截图逻辑即得结果。要点是「跨文件线索要在同一算法上对齐」——口令与用它加密的代码分处两文件,缺一环就闭不上。

编码家族识别(由字符集反推变体)

方法论:编码混淆家族近年出现频率不低,成员有若干种把合法脚本变成纯符号的形式。识别看字符集与结构——一种产物满是颜文字与固定收尾、执行即得字符串;一种全由下划线、美元符和方括号组成;一种只用六个字符;各种标准编码变体区别在字母表、长度通常是四的倍数。判 base 家族变体有一套系统的「由字符集反推」标志:标准变体的表是大小写字母加数字加两个特定符号、填充用某符号;网址安全变体把那两个符号换成另两个;又一种把斜杠换成加号与减号、行首可能带前缀;还有一种用一段连续字符、首位表示本行长度。当串里出现加号和减号却没有斜杠,就直接指向某变体而非标准编码——做法是取字符集与标准表的差集、非空即排除标准表、再按差集里的字符反查是哪个变体,先把表定对再写解码,比逐个试解码器系统得多、尤其遇到魔改变体能省掉大量无效尝试。多层串联时,外层求值结果末尾可能带换行或引号、直接喂内层会报非法字符,先清理再喂。

四、逆向与验证方法论

字母替换与双射唯一性论证

机理:脚本是逐字符可逆映射(字母走定长凯撒、数字走定长位移模十、其余原样),逆映射即反向位移;密文藏在脚本自身打印结果留档的注释里,题面给的占位串不是真密文。这题做了一套较完整的验证器,判据分层:结构判据查输出是否合格式、往返判据用题目自带的加密函数现场执行一遍比对是否回到密文、唯一性判据走双射论证不依赖词表、词表判据只作旁证。

研判与方法论:两处取舍很见功力。其一,词表判据要主动降级——原词表里恰好包含答案的组成词,等于贴着答案做判据、换个题就误报,所以词表只能当旁证。其二,短样本明确不采用卡方统计判据——实测最优解反而是错误串、正确明文统计量排第二,样本太短时统计判据不可靠。唯一性改用双射论证:字母分支是二十六元群上的平移、数字分支是十元群上的平移、都是双射,故给定密文的明文唯一、零不确定度,这个论证不依赖任何外部词表、比统计判据硬。再加七组负对照(改一字符、换常见词、双重加密、大小写变化、空内层、半角陷阱等)全部返回失败,证明校验器不是恒真。这题拿到了平台判对回执,属本批验证等级最高的——「能自证唯一且不靠词表」正是高质量解法的标志。

双重流密码的穷举与未解登记

机理:只有题干和密文、没有代码,密文解码后字节数不长。已知明文格式(固定首尾几字节)给出部分比特约束,双重流密码等价于两段密钥流相异或。穷举做了多层尝试:单层全可打印判据、加长仍零命中;双层用中途相遇——先建一把密钥的密钥流前缀表、再对同一候选集逐个算另一把的反查配对,靠的是密钥流异或的结合性把复杂度从平方降到线性,代价是只覆盖同一候选池内的两两组合。还轮换四种判据(全可打印、要求整体解成含若干汉字的宽字符、放宽的双字节编码、末尾填充形态),并用多线程重写把速度提到数千倍,仍零命中。

研判:中途相遇只覆盖「两把密钥来自同一候选池」的情况,若一把是口令变体另一把是随机串,这张表就配不上——这正是零命中的可能原因之一。四种判据各自筛过都为零,说明问题不在判据松紧、而在密钥池本身构造不在试过的字母表范围内(可能含特殊符号、可能非纯字符拼接、也可能算法模型理解有偏差)。结论按纪律如实登记为「未解」:明文在数学上已确定、但密钥空间没搜出来,不虚报、不硬凑。这是「负结果也要讲清楚卡在哪一环」的示范——把搜索空间、判据、复杂度与失败原因摊开,比强行给个答案更有价值。

五、横向小结

上篇的密码题几乎全是「密钥生成或使用的某处偷工减料」:自参考密钥把加密建立在明文可逆上、共享素因子是生成侧随机源没喂够熵、小指数广播是无填充明文配极小指数、线性反馈移位寄存器抗不住已知明文、认证加密复用随机数还把派生根和认证子密钥绑在一处。检出与加固因此都落在同一层——密钥生成要接足熵并做批量互素自检,用途要分离(签名与封装、派生与认证各用各的密钥),随机数在同密钥下绝不复用,别把边界或密钥的正确性建立在「输入自带的声明」或「看着能解」上。取证与验证侧的母题是「多解陷阱加口径裁决」——私有封装要靠剥头与双路复现、隐蔽信道要靠台账白名单这类硬判据、能解开的多份载荷要靠状态字段选、验证器要靠双射论证而非贴着答案的词表。最贯穿的方法论是三件事:结构性验证优先(重加密回环、逐位对拍、双路复现),一切可能的口径或判据列全再各跑一遍而非靠语义猜,以及负结果也如实登记、把卡点摊开而不虚报。

相似文章
相似文章
小程序二维码
 全屏