IDA载入一下
发现flag的长度为40,然后将input[i]的值赋值给str[i],str[i]又执行一个异或操作,但是上面又有一些函数,导致这个程序的控制流有点奇怪.....
输入40只,检验是否是flag。
F5直接罢工了,暂时先忽略它的控制流混淆,找一下小函数,它都在main附近。
给它们打断点,观察控制流的走向,然后解密就好了,注意在main函数中还给每只异或了0x401。
S = [3279, 3264, 3324, 3288, 3363, 3345, 3528, 3453, 3498, 3627, 3708, 3675,
3753, 3786, 3930, 3930, 4017, 4173, 4245, 4476, 4989, 4851, 5166, 5148, 4659,
4743, 4596, 5976, 5217, 4650, 6018, 6135, 6417, 6477, 6672, 6891, 7056, 7398,
7650, 7890]
for i in range(0, 20, 2):
tmp = S[11 + i]
S[11 + i] = S[10 + i]
S[10 + i] = tmp
for i in range(40):
assert(S[i] % 3 == 0)
S[i] //= 3
S[i] += i
for i in range(20):
S[10 + i] ^= i * (i + 1)
for i in range(40):
S[i] -= i * i
S[i] ^= 0x401
F = ''.join(chr(s) for s in S)
print(F)
#DASCTF{TWpnemRuSTRkVzVsWVhOMmJqZzNOREoy}