start函数调用了_CorExeMain,可以确定是.NET程序,但常规工具都识别不出来,文件头也没有CLR Header的信息。 (看到是方案二+存在.enigma1和.enigma2段+出题人之前发的文章,一度以为程序加了很重的壳) 但不管怎么样,调用_CorExeMain之前肯定会恢复CLR Header。程序有一个TLS callback,动态调试过掉这部分后发现头部0x178位置的CLRDirectory从0变为了有意义的值:00 20 00 00 48 00 00 00,将其patch回二进制文件,然后dnSpy就能正常打开和反编译文件了。 全部逻辑基本只有这些,看看AI的分析: 至第三段,分析结果已经非常清晰了:输入的name被简单转换为一个整数作为分子,输入的serial被解码后转换为一个大数,然后做高精度除法,小数位2025位为一组,相邻四组需要满足d == 5*a + 8*b + 9*c的递推,然后需要前2036个四组满足要求。 serial的编码方式是游程编码:先是一位十进制数字,然后直到字符'l'的剩下的十进制数字表示前面的十进制数字的重复次数,依次类推完成解码。例如公开的serial 51l41l92022l51l01l41l92022l52l92023l71l21l51,展开后即:1个5、1个4、2022个9、...依次拼接起来。 公开的用户名FCCE23A5A04E0EA5按照name的规则转换为整数是55,KCTF转换后是27。考虑到题目的校验只是name的整数除以serial的整数,当分子从55变为27后,只需要让公开serial的分子等比例的除以55乘以27,再编码回去,即可得到KCTF的序列号。 估计一血就是这么出的,而且这么做也不需要太多分析,花费的时间也差不多;但是,自己的serial编码函数写错了没注意到……算出来的结果验证不过的时候开始疯狂的怀疑(然而最简单的assert encode(decode(serial)) == serial验证却一直没做;以后一定不再偷懒) 从题目的小数结构联想到了去年GeekGame的一道题codegolf,其题解提到了一篇文章 1cdK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6T1L8r3!0Y4i4K6u0W2M7r3q4#2L8r3S2S2L8X3E0A6L8W2)9J5k6h3&6W2N6q4)9J5c8X3k6A6j5X3!0F1j5h3y4U0K9g2)9J5c8R3`.`. ,题目里对小数的线性递推检验完全符合生成函数的特征。 让AI给出题目递推式的推导: =++.a_{n+3} \;=\; 5\,a_n \;+\; 8\,a_{n+1} \;+\; 9\,a_{n+2}\,.an+3=5an+8an+1+9an+2.A(x)=∑n=∞xn.A(x) \;=\; \sum_{n=0}^{\infty} a_n x^n .A(x)=∑n=0∞anxn.从递推=++(n≥)a_{n+3} = 5a_n + 8a_{n+1} + 9a_{n+2}\quad(n\ge0)an+3=5an+8an+1+9an+2(n≥0)出发,有\begin{aligned}
A(x)
&= a_0 + a_1 x + a_2 x^2 + 5x^3 A(x) + 8x^2\big(A(x)-a_0\big) + 9x\big
(A(x)-a_0-a_1 x\big).
\end{aligned}A(x)=a0+a1x+a2x2+n=3∑∞anxn=a0+a1x+a2x2+n=3∑∞(5an−3+8an−2+9an−1)xn=a0+a1x+a2x2+5x3A(x)+8x2(A(x)−a0)+9x(A(x)−a0−a1x).整理得A(x)(−x−x−x)=(−x−x)+x(−x)+x.A(x)\,(1 - 9x - 8x^2 - 5x^3)
= a_0 (1 - 9x - 8x^2) + a_1 x (1 - 9x) + a_2 x^2 .A(x)(1−9x−8x2−5x3)=a0(1−9x−8x2)+a1x(1−9x)+a2x2.生成函数闭式:\boxed{ \displaystyle
9x - 8x^2 - 5x^3\,}
}A(x)=1−9x−8x2−5x3a0(1−9x−8x2)+a1x(1−9x)+a2x2为方便记号,常写分子为N(x)=(−x−x)+x(−x)+x.N(x) \;=\; a_0 (1 - 9x - 8x^2) + a_1 x (1 - 9x) + a_2 x^2 .N(x)=a0(1−9x−8x2)+a1x(1−9x)+a2x2.若希望“分子是常数(例如 27)”,则需选取 ,,,xa_0,a_1,a_2,xa0,a1,a2,x 使得 N(x)≡>N(x)\equiv > 27N(x)≡>27(见下文“分子常数化”)。分母对应特征多项式−r−r−r=1 - 9r - 8r^2 - 5r^3 = 0 .1−9r−8r2−5r3=0.设其三根为 ,,r_1,r_2,r_3r1,r2,r3(可为实根或复根),则序列通解为=rn+rn+rn,a_n = \alpha_1 r_1^n + \alpha_2 r_2^n + \alpha_3 r_3^n ,an=α1r1n+α2r2n+α3r3n,其中系数 ,,\alpha_1,\alpha_2,\alpha_3α1,α2,α3 由初值 ,,a_0,a_1,a_2a0,a1,a2 决定。若要求A(x)=,A(x) \;=\; \frac{27}{1 - 9x - 8x^2 - 5x^3},A(x)=1−9x−8x2−5x327,则需令N(x)=(−x−x)+x(−x)+x≡N(x) \;=\; a_0 (1 - 9x - 8x^2) + a_1 x (1 - 9x) + a_2 x^2 \;\equiv\;
27 .N(x)=a0(1−9x−8x2)+a1x(1−9x)+a2x2≡27.N()=−−+=,N(1) = -16\,a_0 - 8\,a_1 + a_2 = 27,N(1)=−16a0−8a1+a2=27,这给出一条线性约束;任选两个初值即可解出第三个。例如
(,,)=(,,)(a_0,a_1,a_2)=(1,1,51)(a0,a1,a2)=(1,1,51)、(,,)(0,0,27)(0,0,27)、(,,)(2,1,67)(2,1,67) 等都满足该等式。一般 x≠x\neq1x=1 时,若要 N(x)N(x)N(x) 为常数而非随 xxx 变化的多项式,需要在给> 定的 xxx 下解线性条件(−x−x)+x(−x)+x=,a_0 (1 - 9x - 8x^2) + a_1 x (1 - 9x) + a_2 x^2 = 27,a0(1−9x−8x2)+a1x(1−9x)+a2x2=27,它在固定 xxx 时同样是一条关于 (,,)(a
...(已截断)
---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-288338.htm
[原创] 看雪 2025 KCTF 第九题 智斗邪首
487 浏览
0 回复
暂无回复,快来抢沙发吧!