程序依次执行 DayDayUp、MengXinQiuFangGuo、GoodGoodStudy 三段 64 位代码,外层主程序是 32 位程序。三段代码通过 Heaven's Gate 进入 64 位模式,并大量使用异常、返回地址改写和无效指令混淆控制流。
最终使用的用户名为 KCTF,密码长度为 9226 字节。密码的 SHA256 为:
序列号由固定的 5 字节头、9216 字节主体和固定的 5 字节尾组成:
主体使用 64 字节字母表:
标准 Base64 的第 i 个六位值记为 v[i],实际字符索引为:
6912 字节输入恰好编码为 9216 字节主体,不涉及补位字符。逆向 Meng 后按这个公式编码即可得到最终序列号。
去掉返回地址改写和 32/64 位切换后,每个 16 字节块包含 9 次核心变换和一次末轮。内部状态采用转置布局,核心轮为:
末轮的 16 个输出位置为:
实际运行使用的 S 盒由环境初始化,不能套用插桩环境中得到的旧 S 盒。公开样例共有 432 个块,每块在故障指令处产生 9 份轮状态,共 3888 份状态。设 T 为逆 S 盒,对相邻轮状态有:
把 256 个 T[x] 和 128 个轮密钥字节作为图节点,每条状态方程作为带异或标签的边。432 个块生成的图只有一个连通分量,传播标签后可一次恢复完整逆 S 盒和 8 组轮密钥。初始密钥由第一轮状态直接计算,末轮的输入、输出掩码则对 432 个块逐字节求唯一解。
恢复出的逆 S 盒为:
等效初始密钥为:
8 组等效轮密钥为:
末轮输入、输出掩码为:
这套参数分别在公开输入和一组 432 块互异的输入上进行正向、逆向验证,两组 6912 字节结果均逐字节一致。
逆运算先撤销末轮,再从最后一组轮密钥向前计算:
用户名 KCTF 生成 100 个 14 位行号。每行在索引表中有 11 个对象,索引公式为:
索引项高 8 位是长度,低 24 位是数据区偏移。对象的逐字节解码过程为:
解码对象首字节低 7 位表示十进制数字数,高位表示符号,剩余内容是压缩十进制数。selector=0..10 依次给出一个首一十次多项式从常数项到十次项的 11 个系数。
对 100 个多项式在整数环中因式分解,每个多项式恰好得到 10 个非负整数根。每行根升序排列后拼接,共得到 1000 个互异整数。第一行和最后一行为:
Meng 输出会由 Shape 解析。完整条件为:
1000 个根直接拼接后的长度是 6891。两个十进制解析器都允许前导零,因此在第一个整数前补 6 个 0,数值保持不变,文本长度变为 6897:
传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!!