selph
selph
发布于 2022-11-11 / 283 阅读
0
0

逆向每日一题0x01:notsequence

刷160个crackme感觉意义不大,刷了66个,程序都太老了,逻辑也很简单,后面就用ctf题来练习吧,看看能坚持多久hhh

逆向每日一练,题目地址:攻防世界 (xctf.org.cn)

  • 来源:RCTF
  • 描述:道可道非常道,名可名非常名
  • 难度:2

逆向分析

首先查壳,无壳,32位elf程序,gcc编译的

image

直接拖IDA打开进入main函数

image

首先是scanf接收一个int类型的数组,然后进行两个check,

check1

F5结果如下:

image

这里有两个循环,里面的小循环里面的语句计算了一个新的索引去访问数组里的值,这个计算方式是:4*(i+index) + buffer​,小循环这里的index是不变的,只有i会发生变化,意味着这里是从index开始遍历v5个数值,很可能输入的数组被当成二维数组使用,这里每一行的数的数量不同,这里每次累加一行的值

最后判断累加值是否为2的行数次方

check1的返回值是行数,则最后的结果需要输入20行的内容

check2

F5结果如下:

image

这里对之前满足每行累加值为固定值的数组,进行按列校验累加值

构造输入为:

1
1 1
1 2 1

则可以顺利通过check1,check2的校验

按照这个规律去生成20行即可:(杨辉三角)

  • 每一行的第一个数和最后一个数的值是1
  • 中间的数字为上一行同列和上一列的和

生成flag

#!/bin/python3
import hashlib


# 打印的行数
n = 20

# 计算杨辉三角
triangle = [[1],
            [1,1]]
for i in range(2,n):
    pre = triangle[i-1]
    cul = [1]
    for j in range(i-1):
        cul.append(pre[j]+pre[j+1])
    cul.append(1);
    triangle.append(cul)
  
res = ""

for i in range(n):
    for j in triangle[i]:
        res += str(j)

#print(res)

md5hash = hashlib.md5(res.encode('utf-8')).hexdigest()

print("RCTF{"+md5hash+"}")


评论