代码逻辑:
用户输入string,通过两个检查函数sub_80486CD和sub_8048783,如图
sub_80486CD:
i循环,i[0]=0,i[1]=1,i[2]=3,i[3]=6........i[n]=v5*(v5+1)/2
j循环,a1是用户输入string的首地址,所以循环结果是v3累加string[i]到string[i+j]的值
j最终循环的v3值要等于2^v5
其实这像数据的金字塔,随着i越大j循环的次数越多,每层要加的数据也变多了,从之后的代码可以知道v5的长度为20,也就是说20次累加每层的数据相加都等于2^v5。
i=0: string[0] = 2^0
i=1: string[1] + string[2] = 2^1
i=3: string[3] + string[4] + string[5] =2^2
......
i=190: string[19] + string[20] + string[21]+...+string[39] = 2^19
sub_8048783:
传入用户输入string和a2=v5=20
while循环v4的值等于前v6层(包括v6)首位string之和
if判断,i比v6多1而且if结束v3又加了1所以(4 * (v3 * (v3 + 1) / 2 + i) + a1)指的是下一层首位右边那个string的值
也就是说金字塔斜边的前i层首位和等于i层第二位string
string[0] string[0]=1
string[1] . string[2] string[0]+string[1]=string[2]
string[3] . string[4] . string[5] string[0]+string[1]+string[3]=string[4]
string[6] . string[7] . string[8] . string[9]
......
string[19] . string[20] . string[21]. ... . string[39] string[0]+string[1]+...+string[19]=string[20]
写出解密代码:
后面补充在想....
代码直接想不出来,根据已知等式,算出string[0]=1、string[1]=1、string[2]=1、string[3]=1、、string[4]=2、string[5]=1、string[7]=3
string[0] 1
string[1] . string[2] 1 1
string[3] . string[4] . string[5] 1 2 1
string[6] . string[7] . string[8] . string[9] 3
......
根据结构大胆猜测斜边都是1,这样下一层的第二个数字才不会太大让v3超出2^v5,所以string[6]=1、string[8]=3、string[9]=1,黄色部分不能瞎猜,陷入瓶颈...
百度,是杨辉三角???
百度百科里已有杨辉三角的各种代码,值得注意的是在杨辉三角13条判定定理里逆向代码只给了我们两条,单靠逆向代码是写不出来的,要知道这是杨辉三角才能得到所有数字
附代码:
1 import hashlib 2 3 LL = [[1]] 4 5 for i in range(1,20): 6 7 LL.append([(0 if j== 0 else LL[i-1][j-1])+ (0 if j ==len(LL[i-1]) else LL[i-1][j]) for j in range(i+1)]) 8 9 #上面的是百度百科里有的代码 10 11 s='' 12 13 for i in range(20): 14 15 for j in range(len(LL[i])): 16 17 s=s+str(LL[i][j]) 18 19 print(s+" ") 20 21 out = hashlib.md5(s.encode()).hexdigest() 22 23 print("md5加密后:"+"RCTF{"+out+"}")