2022年川渝网络与信息安全职业技能竞赛-团队初赛 re LongTime WP

是一个go语言编译的exe文件,运行直接打印flag,但是从第17个字符开始时间越来越长。

用ida pro 7.7打开(7.5不支持GO,打开无法识别函数名),发现主要逻辑都在main_main函数。

2022年川渝网络与信息安全职业技能竞赛-团队初赛 re LongTime WP_第1张图片

 2022年川渝网络与信息安全职业技能竞赛-团队初赛 re LongTime WP_第2张图片

 主要逻辑为在while循环里逐个打印flag字符串,有没有字符打印间隔越来越长,那我们就来寻找影响间隔时间的代码。我们发现有time_Sleep()调用,但是由于这个是每次循环都会调用,且参数是常量,应该没有影响。

读代码,v1在循环的时候只做+1赋值,那应该就是从0至31依次递增

              v2 = v1 + 4 * v2 + 1, v2是一个迅速变大的值

             里面的while循环代码,是一个求斐波那锲数列第n个数值并对16求余,n为v2

             根据得到的数字作为下标打印‘0123456789abcdef'中的一个字符。

现在逻辑清晰了,时间间隔越来越大的原因也找到了,就是v2变得很大后,在小while循环里运算的时间特别长。

那怎么减少运算时间呢?我们打算这个变异的斐波那锲求值是对16求余的,那就是说这个数列不管多长里面的值就是小于16,那会不会有循环呢?我们用脚本打印一下呢。

2022年川渝网络与信息安全职业技能竞赛-团队初赛 re LongTime WP_第3张图片

 打印出的前100个,发现以0 1 1 2 3 5 8 13 5 2 7 9 0 9 9 2 11 13 8 5 13 2 15 1的方式循环。

这就好办了,v2直接对24求余就可以了。

脚本:

s = '0123456789abcdef'
v1=0
v2=1
d = []
while(v1<32):
    d.append(v2)
    v1=v1+1
    v2=v1+4*v2

nbnq = [0,1,1,2,3,5,8,13,5,2,7,9,0,9,9,2,11,13,8,5,13,2,15,1]

for i in range(len(d)):
    d[i] = d[i]%24
    
for i in range(len(d)):
    n = nbnq[d[i]]
    print(s[n],end='')
    

 

你可能感兴趣的:(CTF,逆向,python)