maze
静态链接,先恢复符号
readelf -p .comment Maze
GCC: (Debian 10.2.1-6) 10.2.1 20210110

首先程序用 freopen 将文件重定向到 STDIN
然后所有的 scanf 就是从文件读取内容而不是终端了
走迷宫的代码,迷宫大小是 201x201

要求是必须经过 (96, 163) 并最终到达 (193, 131)
将迷宫分成两个部分去解,尝试了一下递归会爆栈需要采用迭代
| |
easyobf
混淆过的 .NET 程序,32 位

搜索 Cmile_96 可以找到这样一个混淆项目 ConfuserEx-Plus
网上的 ConfuserEx 解包软件对这个魔改版本都不太有效,只能硬着头皮先分析
该混淆难在控制流平坦化和针对 dnSpy 的局部变量保护
调试时无法取得被混淆函数局部变量的值
但是找到检验函数还是不难的

因为笔者的实验环境为 VMware,需要先绕过混淆器的 VM 保护
| |
根据混淆器源码在 System.Diagnostics.Process.Kill 下断点

弹出的 cmd 为生成的子进程可以直接关闭
设置第 2565 行成为下一条语句就可以轻松跳过 VM 保护

简单测试一下发现结果由 MessageBox 回弹,于是在 System.Windows.Forms.MessageBox 启用类断点
断点触发后查看调用堆栈,就可以找到程序逻辑 Cmile_96_BAB8C43947

状态 0 和 2 的基本块形式类似都是弹出 MessageBox
经过检查 Cmile_96_4885DF3A94 比较可疑应该是检验函数

在每个基本块上下断点即可得到执行顺序
这时注意到状态 1 中有一个 CodeDomProvider,这是用来即时编译源码的类
检查第 141 行的调用链,最终停在了 CompileAssemblyFromSource
在这里下断点,由于它不属于主模块 dnSpy 可以解析局部变量的值
右键保存 sources[0] 就得到了本题混淆前的源码
| |
可以看到就是异或 0x40
prng
在 $Z_5$ 上解矩阵方程 $R \cdot x=s$,其中 $R$ 和 $s$ 都已知
db
这题的 $\log{d} \approx 299/1024=0.2919921875$,已经比较逼近上限 $0.292$,需要做一些微调
回顾一下 BD 攻击的切入点
$$ \begin{aligned} ed&=x'\phi(N)+1 \newline &=x'(N+1-p-q)+1 \newline &=2x'(\frac{N+1}{2}-\frac{p+q}{2})+1 \newline &=x(A+y)+1 \newline \end{aligned} $$一般取 $y=\frac{p+q}{2}$ 的上限为 $N^{0.5}$,但这题中 $p$ 和 $q$ 的高 70 位泄漏
如果把泄漏的部分 $\bar{p}$ 和 $\bar{q}$ 算进 $A$ 中,就可以把 $\log{y}$ 的上限缩小到 $(512-70)/1024=0.431640625$
所以在攻击模板中取 $Y=N^{0.44},A=\frac{N+1-\bar{p}-\bar{q}}{2}$ 即可