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}