-
-
[原创]午时·永数囚笼 WriteUp
-
发表于: 1天前 185
-
主函数链中的重要函数:
该题目最坑点:sub_14000330c 的返回值不决定是否校验成功,其运行 4 个 worker,保存四个 60-byte record 后全部送入 sub_140002940。因此不能将:
看作失败,最终正确链路应当是:
sub_140002880 的 clean 输出通过独立 Unicorn 执行确认是固定值:
.vseal 导出的 integrity clean values:
最终全链机器码验证里,对 OS/debug helper 只模拟已独立验证过的 clean 环境返回,没有 patch compare / worker state / outer result。
26-byte 输入先构造成 8 个 32-bit word:
所以逆 preprocessing 后必有固定 sentinel:
之后是 whitening + 8 轮 ARX,核心操作只有:
全部可逆。实现 mix/unmix 后做了随机 round-trip 验证。
worker 实际消费的 transformed state 记为:
另有 12-bit:
最终解:
sub_140002940 的最终四 word 在 compare 前必须为:
继续逆其 128-bit aggregator,只留下 4 个 32-bit worker digest h_i,Z3 得到唯一解:
这样问题从“找 26-byte 输入”降成“让四个 worker record 分别给出这些 fingerprint”。
worker record 为 15 个 dword:
机器码确认 sub_140002940 的 tail fold 使用真实的 s7..s14。
单 worker digest:
直接构造四个 worker 的 clean-success record:
送入真实 record digest:
与 outer target:
比较后只有:
精确相等。
因此 a3=2 / variant2 是真实 clean-validation core;其它三路只是 fail/error fingerprint。
机器 pre-v211 compare 给出 worker2 clean expected keys:
逆 local tail permutation,并撤销 final-key correction,得到 worker2 的 32-byte raw output target:
VM 实际逻辑结构:
也就是 32 个逻辑轮,每轮 8 条 VM instruction,最后终止。
真正跨轮的数据状态只保留:
建立两套模型:
修正 opcode6 的真实机器语义后,对:
逐组比较:
结果:
随后真实 digest / v211 也分别做了随机机器码对拍。
只有这些 iter 含 opcode22:
其余 20 轮没有 secondary read。
给定当前 v66 与目标 raw byte,可以逆 accumulator ARX,唯一恢复 primary S byte,不需要 256 枚举。
primary / secondary byte 与目标 output 存在可逆 8-bit relation。
搜索始终维护:
若同一 index 被推出两个不同 byte:立即剪枝。
clean path 又要求 32 次 primary index 覆盖 0..31,所以:
重复 primary index 可安全剪枝。
节点统计显示真正 heavy subtree 集中在:
这四次 opcode22 的 secondary index 正好覆盖:
各一次。
定义:
于是复杂度按:
因此按:
分层搜索。这只是完备搜索顺序优化,不改变 verifier。
冰与火的战歌:Windows内核攻防实战高级班!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。