-
-
[原创]KCTF2026 - 第七题:戌时·暗能潜流 题解(AI)
-
发表于: 1天前 13
-
题目只给四组明密文样例和"密钥 121",要求还原加密流程并解出 FLAG。密文是一套
逐字符 nibble 加常数 + 定长块模板的编码:低 nibble +4、高 nibble +5,
三个字符按"低位在前 / 高位在前 / 低位在前"的之字形(即密钥 1-2-1)写进 12 个 hex 的块模板。
真正的坑在于整条明文在分块前先被整体逆序。
先看长度:TLU(3) → 12 hex,Hello(5) / abcd!(5) / 2026(4) 全都 → 24 hex。
唯一自洽的读法是 12 hex 一块、每块吃 3 个字符,明文补齐到 3 的倍数。
FLAG 共 144 hex = 12 块 = 34 个字符 + 2 个 padding。
把不含 padding 的块(4 个样例首块 + FLAG 前 11 块,共 15 个)按 nibble 位对齐,
发现 索引 1/4/9 恒为 4、索引 6/7/11 恒为 5,15/15 无例外:
剩下 6 个数据 nibble = 24 bit,正好和 3 个字节等宽。另外FLAG[blk7] == 2026[blk0] 逐字节相同,说明块之间完全独立,没有链式或块计数器。
这一步是突破口。统计 15 个块里每个数据位取到多少种不同值:
可打印 ASCII 的高 nibble 只有 2..7(6 种),低 nibble 有 16 种。
所以 idx2/3/10 一定各是某个高 nibble 的函数,idx0/5/8 是低 nibble 的函数——
而且 2..7 恰好平移 5 就是 7..C,直接给出 HI(x) = (x>>4) + 5。
回头看那六个"常量":4 = 0 + 4、5 = 0 + 5,正是 LO(0) 和 HI(0)——
padding 字节 0x00 自己的编码。它们从来不是分隔符。于是低 nibble 的规则也定了:LO(x) = (x & 0xF) + 4。
按上面直接套样例会处处矛盾:Hello 首块若当成 "Hel",同一个高 nibble 6
会同时要求映射到两个不同值。改为整条明文先逆序后全部自洽——Hello 首块实际是 "oll",2026 首块是 "620"。
密钥 121 = 块内三个字符 cell 的朝向模式,即迷宫的之字形回折:
因此三元组 (a,b,c) 在块中的发射顺序是 a、c、b:2 这一步跨过中间字符,
走回头路才把它补上。两个加法常数同样出自密钥——低 nibble 用 1+2+1 = 4,高 nibble 用 4+1 = 5。
块尾 nibble 5 表示整块,3 表示该块含 padding;2233 / 2235 分别是
2 个和 1 个 padding 的固定前缀。完整求解:
运行输出:
逆序串为 }!rets4M_0tpyrC_f7cK_6202_u1T{galf,翻转即得 FLAG(Kc7f 是 KCTF 的 leet 写法)。
冰与火的战歌:Windows内核攻防实战高级班!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。