[Re] Elements - mf xp0int Posted on Mar 26 2019 流程比较简单的一道题,main函数一路到底。 首先,第一段将flag中大写全部转为小写 ``` v4 = __ctype_tolower_loc(); v5 = &s[1]; do { *(v5 - 1) = (*v4)[v3]; v3 = *v5++; } while ( v3 ); ``` <br> 然后输入字符串为'flag{'开头,'}'结尾,再将中间的字符串分为三段,每段用'-'分隔,且每段为12byte。 ``` v6 = strlen(s); result = 0LL; if ( v6 >= 44 && (*(_QWORD *)s & 0xFFFFFFFFFFLL) == '{galf' && v27 == '}' ) { v27 = 0; v8 = strtok(&s[5], "-"); v9 = 0LL; ``` <br> 接着,将每段字符转为16进制,例如'aabb' -> 0xaabb,且第一个字符串的十六进制为`0x391BC2164F0ALL` ``` do { v14 = v10; v15 = v12[v10]; if ( (char)v14 <= 102 && v15 & 0x400 ) { v16 = v14 - 87; } else { if ( !(v15 & 0x800) ) goto LABEL_31; v16 = v14 - 48; } v11 = v16 | 16 * v11; if ( v13 > 11 ) break; v10 = v8[v13++]; } while ( v10 ); if ( !v9 && v11 != 0x391BC2164F0ALL ) break; ``` <br> 再然后进行了好几个SSE2,但经过调试,好像并没有什么变化(不知道干啥的),所以略过 ``` v17 = (__m128i)_mm_sub_pd( (__m128d)_mm_unpacklo_epi32((__m128i)(unsigned __int64)v11, (__m128i)xmmword_400BD0), (__m128d)xmmword_400BE0); *(&v23 + v9++) = COERCE_DOUBLE(_mm_shuffle_epi32(v17, 78)) + *(double *)v17.m128i_i64; ``` <br> 最后将三个十六进制的值进行一系列计算,满足结果就会输出`Congratz, input is your flag` ``` if ( v24 <= v23 || v25 <= v24 || v23 + v24 <= v25 ) break; v19 = v24 * v24 + v23 * v23 - v25 * v25; v20 = sqrt(4.0 * v23 * v23 * v24 * v24 - v19 * v19) * 0.25; v21 = (v20 + v20) / (v23 + v24 + v25) + -1.940035480806554e13; if ( v21 < 0.00001 && v21 > -0.00001 ) { v22 = v23 * v24 * v25 / (v20 * 4.0) + -4.777053952827391e13; if ( v22 < 0.00001 && v22 > -0.00001 ) puts("Congratz, input is your flag"); } ``` <br> 这里其实就是两个方程,两个未知数(因为第一部分已经知道了),然后我们可以用matlab来解方程即可 ``` syms b c; a = 62791383142154; vpa(a, 14); v20 = sqrt(4*a^2*b^2-(a^2+b^2-c^2)^2)/2/(a+b+c)-1.940035480806554e13; v21 = a*b*c/sqrt(4*a^2*b^2-(a^2+b^2-c^2)^2)-4.777053952827391e13; [b, c] = solve(v20,v21); double([b(1),c(1)]); vpa(b, 14) vpa(c, 14) ``` <br> 结果如下,我们选取其中的较大的正整数,即为结果 ``` ans = 0.0005643293261528 -62791383142154.0 0.0003451369702816 -62791383142154.0 38666191841930.0 + 51392812865179.0i 38666191841930.0 - 51392812865179.0i 95523798483318.0 70802074077033.0 ans = -62791383142154.0 0.0005643293261528 -62791383142154.0 0.0003451369702816 38666191841930.0 - 51392812865179.0i 38666191841930.0 + 51392812865179.0i 70802074077033.0 95523798483318.0 ``` <br> 将结果转为16进制,且根据大小区别是第二段还是第三段,并全部转为小写,最终flag为 `flag{391bc2164f0a-4064e4798769-56e0de138176}` 打赏还是打残,这是个问题 赏 Wechat Pay Alipay [Crypto] babyrsa - CirQ [Pwn] zerotask - Cpt.shao
没有帐号? 立即注册