首页
社区
课程
招聘
[原创]第五题 申时·忆海倒带 Writeup
发表于: 13小时前 252

[原创]第五题 申时·忆海倒带 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内核攻防全技术栈,打造具备自动化能力的内核开发高手。

最后于 13小时前 被F1ux_Team编辑 ,原因: 题目序号打错了
收藏
免费 0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回