-
-
[原创]第五题 申时·忆海倒带 Writeup
-
发表于: 13小时前 252
-
题目附件 cm.exe 是一个 32 位 Windows PE。程序读取序列号后输出 verify success. 或 verify fail.retry it...。
样本中包含以下字符串:
这些内容是诱饵。admin123 等字符串只进入无关比较或调试陷阱,几条开发注释也只被构造、转换后丢弃。真正的成功分支位于 main 的大整数运算、校验和、模幂及置换查表逻辑中。
程序用 gets_s 读取输入,随后把字符逐个转成数值:
每读入一个字符,当前大整数都会执行:
主函数另有一层字符检查,成功输入使用大写十六进制字符即可。解析后的大整数必须占 11 个 32 位 limb,因此输入长度固定为:
程序从最高 limb 向最低 limb 遍历,每个 limb 又按高字节到低字节导出。最终得到的 44 字节正好等于对输入十六进制串做常规大端解码的结果。
44 字节首先经过整体异或:
第二道检查维护一个 16 位状态:
要求最终结果为:
这两项适合在构造出完整输入后用于验证,不需要猜测或枚举。
程序大量使用一种带置换索引的大整数和数组封装。其核心访问逻辑可简化为:
最终比较前,程序对 44 个字节逐一执行:
结果必须等于固定字符串:
从二进制中取出数据表和置换表,对目标字符串逐字节查找逆像,可以唯一还原出进入该查表前的 44 字节:
前 28 字节直接来自序列号。最后 16 字节由序列号末尾 16 字节经过模幂后产生,因此还要逆运算模幂。
模幂函数使用标准平方乘算法:
指数表中只有一个有效 limb:
模数以四个小端 32 位 limb 存储:
合并后得到:
期望的模幂输出是查表逆像的最后 16 字节:
模数只有 128 位,可精确分解为两个素数:
计算欧拉函数和私钥指数:
于是模幂输入为:
验证可得:
冰与火的战歌:Windows内核攻防实战高级班!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。