[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()