刷160个crackme感觉意义不大,刷了66个,程序都太老了,逻辑也很简单,后面就用ctf题来练习吧,看看能坚持多久hhh
逆向每日一练,题目地址:攻防世界 (xctf.org.cn)
- 来源:RCTF
- 描述:道可道非常道,名可名非常名
- 难度:2
逆向分析
首先查壳,无壳,32位elf程序,gcc编译的
直接拖IDA打开进入main函数
首先是scanf接收一个int类型的数组,然后进行两个check,
check1
F5结果如下:
这里有两个循环,里面的小循环里面的语句计算了一个新的索引去访问数组里的值,这个计算方式是:4*(i+index) + buffer
,小循环这里的index是不变的,只有i会发生变化,意味着这里是从index开始遍历v5个数值,很可能输入的数组被当成二维数组使用,这里每一行的数的数量不同,这里每次累加一行的值
最后判断累加值是否为2的行数次方
check1的返回值是行数,则最后的结果需要输入20行的内容
check2
F5结果如下:
这里对之前满足每行累加值为固定值的数组,进行按列校验累加值
构造输入为:
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+"}")