X-CTF(REVERSE高级) notsequence

代码逻辑:

用户输入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+"\n")
20 
21     out = hashlib.md5(s.encode()).hexdigest()
22 
23     print("md5加密后:"+"RCTF{"+out+"}")

 

posted @ 2020-02-05 14:27  黑冰Lisa  阅读(229)  评论(0编辑  收藏  举报