re学习(37)DASCTF 2023_7 controlflow

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] = 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}

猜你喜欢

转载自blog.csdn.net/m0_66039322/article/details/132890299