• 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+"
    ")
    20 
    21     out = hashlib.md5(s.encode()).hexdigest()
    22 
    23     print("md5加密后:"+"RCTF{"+out+"}")
  • 相关阅读:
    LintCode-174.删除链表中倒数第n个节点
    LintCode-165.合并两个排序链表
    LintCode-371.用递归打印数字
    LintCode-140.快速幂
    LintCode-373.奇偶分割数组
    NOI 2015 品酒大会 (后缀数组+并查集)
    NOI 2016 优秀的拆分 (后缀数组+差分)
    POJ 2774 Long Long Message (后缀数组+二分)
    BZOJ 1717 [USACO06DEC] Milk Patterns (后缀数组+二分)
    POJ 1743 [USACO5.1] Musical Theme (后缀数组+二分)
  • 原文地址:https://www.cnblogs.com/blackicelisa/p/12263669.html
Copyright © 2020-2023  润新知