zoukankan      html  css  js  c++  java
  • [WP]XCTF-notsequence

    1、基本信息:32 位 ELF 文件

    2、载入 IDA 后进入 main 函数

    将输入的字符串经过 check1,check2 检查后,如果都通过而且 check1 返回值为 20 时正确输出

    题目中提示 flag 为我们输入的值的 md5 值

    3、进入两个函数

     

     将 check1, check2 函数重写

    check1 检测是否每行之和是否为 2^(n-1) (n 为行数),之后将 i 赋值为 v5 * (v5 + 1) / 2 

    check2 检测最后一行,如果想得到正确结果,那么第一次返回为 20,实际上检测的也就是最后一行的每个元素是否是前一列的元素之和

    def check1(a1):
        i = 0                                   #两层循环,可以看做一个二维数组
        v5 = 0
        while True:
            v3 = 0
            j = 0
            while True:
                v3 += a1[i+j]                   #v3 = 每行数字之和
                if j > v5: break
                j += 1
            if v3 != (1 << v5): return -1       #v3 == 2^n
            v5 += 1
            i += v5 * (v5 + 1) // 2             #i = 0, 1, 3, 6, 10, 15 ...
            if i > 1024 or i > len(a1): break
        return v5
    
    def check2(a1, a2): 
        v6 = 0
        for i in range(a2):
            v4 = 0
            v3 = i - 1
            if i > len(a1): return 0
            index = 0
            while True:
                index = v3 * (v3 + 1) // 2      #index = 第 i 行之前的元素总数
                v4 += a1[index + v6]            #下标index+v6,保存每列的和
                v3 += 1
                if v3 >= a2 - 1: break
            if a1[index + i] != v4: return 0    #第 20 行的下标为 i 的元素
            v6 += 1
        return 1

     4、而同时满足两个条件的是一个 20 行的杨辉三角

    杨辉三角满足每个元素的值为两个顶角的值的和

     也就有了每个元素为此行之前的前一列元素之和

    有关杨辉三角的性质:数学之美:杨辉三角(帕斯卡三角)的奇特性质

    5、编写 EXP 生成杨辉三角,去除空字符和换行符,最后得到 md5 值

     1 def main():
     2     a = []
     3     for i in range(21):         #check1 返回值为 20,因此需要生成 20 行的杨辉三角
     4         value = 0
     5 
     6         for j in range(i):
     7             index = (i-1) * (i-2) // 2          #j 从 0 开始计数,index 为每行之前的元素总数
     8             if j == 0 or j == i-1: value = 1
     9             else: 
    10                 value = a[index+j-1] + a[index+j]
    11             a.append(value)
    12             print(value, end=' ')
    13         print()
    14     print(a)
    15     flag = ''
    16     for i in a:
    17         flag += str(i)
    18     print(flag)
    19     md = hashlib.md5(flag.encode())
    20     print(md.hexdigest())
    21     
    22 main()

  • 相关阅读:
    解决前端跨域请求的几种方式
    使用excel 展现数据库内容
    win7 安装windows 服务 报错 System.Security.SecurityException 解决方法 An exception occurred during the Install phase. System.Security.SecurityException: The so
    java 查看线程死锁
    linux 配置 java 环境变量
    数据库性能优化
    C#中静态与非静态方法比较
    apache日志切割工具cronolog安装配置
    虚拟机克隆后网卡有问题解决方法
    vs2015工具箱突然没有了
  • 原文地址:https://www.cnblogs.com/Tsuiyields/p/13773068.html
Copyright © 2011-2022 走看看