本文主要是介绍2021强网杯 ezmath,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
2021强网杯 reverse ezmath
奇怪的思路,但也算是出了flag。
bdl_4020是一个double数组,内容是19个小数。
sub_13F3函数如图:
v3的初值是0.2021,但是在运行过程中修改成了0.000483
v3是一个递推的关系,递推公式是 a n + 1 = e − n × a n a_{n+1}=e-n\times a_n an+1=e−n×an
用python简单的打一个表,可以发现v3初值无论为多少,经过80次左右的循环后,都会在正负无穷之间跳跃。
>>> v3 = [0.000483]
>>> for i in range(0x2021,0x2021+100):v3.append(math.e-i*v3[-1])>>> v3[-20:]
[-inf, inf, -inf, inf, -inf, inf, -inf, inf, -inf, inf, -inf, inf, -inf, inf, -inf, inf, -inf, inf, -inf, inf]
v3是不收敛的,更不用说令v3等于double数组中的小数值。
多种尝试无果,于是尝试让 a n a_n an强行收敛试试,也就是令
lim n → + ∞ a n + 1 = a n \lim\limits_{n\to+\infty}a_{n+1}=a_n n→+∞liman+1=an。
即
a n + 1 = a n = e − n ∗ a n a_{n+1}=a_n=e-n*a_n an+1=an=e−n∗an
化简得:
lim n → + ∞ a n + 1 = a n = e n + 1 = e n \lim\limits_{n\to+\infty}a_{n+1}=a_n=\frac{e}{n+1}=\frac{e}{n} n→+∞liman+1=an=n+1e=ne
很奇怪但大家懂这意思就行
观察double数组中的值, e i \frac{e}{i} ie的值都接近整数
>>> [math.e/i for i in dbl]
[27751.99996396786, 26466.999962218535,29564.999966177365,
24930.99995989091,24430.999959070075, 26981.999962939633,
24430.999959070075, 25960.999961482154, 24426.999959063374,
25965.99996148958, 24426.999959063374, 24939.999959905384,
24430.999959070075, 24932.99995989413, 24418.999959049965,
26996.999962960217, 24431.999959071745, 24941.999959908593,
32098.999968847354]
可以初步判断是正确的
于是把 e i \frac{e}{i} ie 的值作为flag内容
代码如下
from math import *
a = [0.00009794904266317233, 0.00010270456917442, 0.00009194256152777895,\0.0001090322021913372, 0.0001112636336217534, 0.0001007442677411854,\0.0001112636336217534, 0.0001047063607908828, 0.0001112818534005219,\0.0001046861985862495, 0.0001112818534005219, 0.000108992856167966,\0.0001112636336217534, 0.0001090234561758122, 0.0001113183108652088,\0.0001006882924839248, 0.0001112590796092291, 0.0001089841164633298,\0.00008468431512187874]
aa = [round(e/i) for i in a]def f(n):b = bin(n)[2:].zfill(16)return chr(int(b[8:],2))+chr(int(b[:8],2))#是后半段+前半段,要反过来
print(''.join(f(i) for i in aa))#===============输出========================
#hlcg}scao_fio_iek_nek_lao_eac_uip_nac}
很明显有flag的形式了,但是需要调整。
前缀“ flag{ ”与输出“ hlcg} ”,观察得到,是每两个字符的前一个字符,对应ASCII码+2即可。
于是修改函数的返回值
def f(n):b = bin(n)[2:].zfill(16)return chr(int(b[8:],2)-2)+chr(int(b[:8],2))#这里减2
得到输出
flag{saam_dim_gei_lei_jam_caa_sin_laa}
这篇关于2021强网杯 ezmath的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!