2021 HFCTF
这次比赛没啥人打,随便看了看题,但是看了一题就把心态看崩了,还是一道都被六十多人做出来的题,已经这么菜了么,呜呜呜。
cube
解题前的阿巴阿巴
这哪里是密码题,分明就是数学题。让你给出六对(x,y,z),满足$\frac{x}{y+z}+\frac{y}{x+z}+\frac{z}{x+y} = 6$,(欺负人数学不好吗日,感受到深深恶意)
自己做肯定是不会做的,这里找到这个问题的相关页面了
介绍的做法是这样的。首先这条式子可以转化为$x^3 + y^3 + z^3 - 5 * x^2 * (y + z) - 5 * y^2 * (z + x) - 5 * z^2 * (x + y) - 9 * x * y * z = 0$
可以发现是一条三次曲线,然后通过变量替换(对x,y,z进行线性组合映射为X,Y,Z,也可以看作换坐标系)将这条三次曲线映射为一条椭圆曲线。
上述页面的问题是$\frac{x}{y+z}+\frac{y}{x+z}+\frac{z}{x+y} = 4$,但没事,我们把这个问题搞懂应该就可以举一反三了。
他用的线性变换是这样子的$(X,Y,Z)^T=\begin{bmatrix} -\frac{95}{2} & -\frac{95}{2} & \frac{277}{12} \newline -\frac{91}{2} & \frac{91}{2} & 0 \newline -6 & -6 & 1 \newline\end{bmatrix} (x,y,z)^T$
可以验证$X^3-\frac{11209}{48}X Z^2+\frac{1185157}{864}Z^3-Y^2 Z=8281(x^3 + y^3 + z^3 - 3x^2(y+z) - 3y^2(z+x) - 3z^2(x+y) - 5xyz)$
这样子问题就转变为求$x^3-\frac{11209}{48}x z^2+\frac{1185157}{864}z^3-y^2 z=0$
这里我们再固定$z=1$,式子就简化为$x^3-\frac{11209}{48}x+\frac{1185157}{864}-y^2=0$,就是一条Weierstrass equations了。
这样我们就可以把数对(x,y,z)映射为这条椭圆曲线上的一个点了,然后文章给出了一个结论,如果映射后的有理点落在下图的红色区域,那么这个数对的三个数就都是正数了。
文章说It is easy to verify(有感受到深深的恶意)这个有理点要落在$x\in(\frac{-39 \sqrt{65}-109}{24},\frac{-84 \sqrt{3}-59}{12})\cup(\frac{84 \sqrt{3}-59}{12},\frac{95}{12})$这个区域,我们的数对就都是正整数了。
然后由于在椭圆曲线上有点加法,所以思路就是:
我们可以先获得一个满足方程的初始点,然后通过不断地对这个点进行运算,使其落入到这个区域中,再把区域内的点反映射成数对(x,y,z),那么我们就解决这个问题了。
但是,但是,但是,最重要的是,这篇文章没有给出这个线性变换矩阵的获得方式(让我去推?不如让我去死)
后来啊,coin给俺来了一个描述这个问题的网页,我在评论区找到了这个,运行平台是Magma
1 | // |
注释就不删了,这样我也不用解释了,主要看到这两行
C := Curve(P2,x^3 - 3*x^2*y - 3*x^2*z - 3*x*y^2 - 5*x*y*z - 3*x*z^2 + y^3 - 3*y^2*z - 3*y*z^2 + z^3);
E,f := EllipticCurve(C);
这两行很关键啊,他把三次曲线映射到椭圆曲线后,还返回了f,这个f就是这个映射关系啊,那么这个问题就解决了啊。
解题过程
首先我们生成一个满足要求的初始点,直接爆破就完事
1 | from fractions import Fraction as Frac |
可以得到下面这么多点,但是有用的就俩(-23, -7, 3)、(-8, -7, 5),其他要么不行,要么都是基于这俩的变形,导致结果只是数对里的值换个顺序。
然后我们去Magam跑这个代码
1 | ###Test |
这里最多迭代一百次,能够找到三个答案,因为我们有两个初始点,所以每个找三个,一共就六个了。或者也可以用一个初始点去迭代,就是越到后面的数就越大。
完了最后交互有个坑,就是因为数字太大了,手动交互数据接受的时候可能会被截断,这里得用一手pwntools。
说在最后
这题看着怎么也不像是能有个五六十队伍能做出来的啊。后来雪殇姐姐发来了一个链接,心态崩了,
?????我丢你妈的,原题,就尼玛离谱,合着我看了半天,,,,啥也不是,草。
这个做法估计也差不多,但是用的线好像不一样,所以映射关系也不一样,
应该是找到的这个资料里头评论区描述,这条线:$E’_n \colon y^2 = x \bigl(x^2 + (4n(n+3)-3)x + 32(n+3)\bigr)$
映射关系应该是:
$x = 4(n+3)(a+b+2c)/(c-(n+2)(a+b))$
$y = (8n^2+44n+60)(a-b)/(c-(n+2)(a+b))$
但怎么映射回去就不会了,手撸么?看评论区说这个映射关系 Magma 可以搞出来,估计 Magma也能搞回去,但俺也不会啊,有大佬教教么?不过这个脚本也给出关系了,
$a = \frac{8(N+3)-x+y}{2(N+3)(4-x)}$
$b = \frac{8(N+3)-x-y}{2(N+3)(4-x)}$
$c = \frac{-4(N+3)-(N+2)x}{(N+3)(4-X)}$
比赛完心态崩了,出去跑了两公里降了降血压。
re
这道题比赛的时候已经没心情看了,晚上结束后才看的,好像也不是很难。
主要就是一个查找子串的算法。flag就是给出的一个字符串的子串,先出去了,晚上回来更叭可能。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可联系QQ 643713081,也可以邮件至 643713081@qq.com
文章标题:2021 HFCTF
文章字数:2.5k
本文作者:Van1sh
发布时间:2021-04-04, 11:02:47
最后更新:2022-06-29, 13:05:11
原始链接:http://jayxv.github.io/2021/04/04/2021HFCTF/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。