IDA载入一下
发现flag的长度为40,然后将input[i]的值赋值给str[i],str[i]又执行一个异或操作,但是上面又有一些函数,导致这个程序的控制流有点奇怪.....
输入40只,检验是否是flag。
F5直接罢工了,暂时先忽略它的控制流混淆,找一下小函数,它都在main附近。
- 0x1560 10~29每只异或i(i+1)
- 0x15AF 每只减去i
- 0x1290 和固定值比较
- 0x1240 每只加上i^2
- 0x11B4 每只乘2
- 0x11E4 每只乘3
- 0x1100 10~29每只奇偶互换
给它们打断点,观察控制流的走向,然后解密就好了,注意在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] = tmpfor i in range(40):assert(S[i] % 3 == 0)S[i] //= 3S[i] += ifor i in range(20):S[10 + i] ^= i * (i + 1)for i in range(40):S[i] -= i * iS[i] ^= 0x401F = ''.join(chr(s) for s in S)
print(F)
#DASCTF{TWpnemRuSTRkVzVsWVhOMmJqZzNOREoy}