是一个go语言编译的exe文件,运行直接打印flag,但是从第17个字符开始时间越来越长。
用ida pro 7.7打开(7.5不支持GO,打开无法识别函数名),发现主要逻辑都在main_main函数。
主要逻辑为在while循环里逐个打印flag字符串,有没有字符打印间隔越来越长,那我们就来寻找影响间隔时间的代码。我们发现有time_Sleep()调用,但是由于这个是每次循环都会调用,且参数是常量,应该没有影响。
读代码,v1在循环的时候只做+1赋值,那应该就是从0至31依次递增
v2 = v1 + 4 * v2 + 1, v2是一个迅速变大的值
里面的while循环代码,是一个求斐波那锲数列第n个数值并对16求余,n为v2
根据得到的数字作为下标打印‘0123456789abcdef'中的一个字符。
现在逻辑清晰了,时间间隔越来越大的原因也找到了,就是v2变得很大后,在小while循环里运算的时间特别长。
那怎么减少运算时间呢?我们打算这个变异的斐波那锲求值是对16求余的,那就是说这个数列不管多长里面的值就是小于16,那会不会有循环呢?我们用脚本打印一下呢。
打印出的前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='')