本帖最后由 wgf4242 于 2020-5-15 13:03 编辑
原程序用angr直接解的。。逆向代码没写出来。
https://github.com/angr/angr-doc/raw/master/examples/ais3_crackme/ais3_crackme
扔IDA大概是这样
_BOOL8 __fastcall verify(__int64 a1)
{
int i; // [rsp+14h] [rbp-4h]
for ( i = 0; *(i + a1); ++i )
{
if ( encrypted[i] != (((*(i + a1) ^ i) << ((i ^ 9) & 3)) | ((*(i + a1) ^ i) >> (8 - ((i ^ 9) & 3)))) + 8 )
return 0LL;
}
return i == 23;
}
encrypted 是 CA 70 93 C8 06 54 D2 D5 DA 6A D1 59 DE 45 F9 B5 A6 87 19 A5 56 6E 63 00
encrypted = bytearray.fromhex('CA7093C80654D2D5DA6AD159DE45F9B5A68719A5566E6300')
lst = []
for i in range(23):
for x in range(0,300):
n1 = (x ^ i) << ((i ^ 9) & 3)
n2 = (x ^ i) >> (8 - ((i ^ 9) & 3))
if ((n1 | n2) % 256) + 8 == encrypted[i]:
lst.append(chr(x))
break
if x == 299:
print('error', i, encrypted[i])
print(''.join(lst))
# 解出: ais3I_tak3_g00d_n0t3s}
# 应为: ais3{I_tak3_g00d_n0t3s}
16进制为6时解不出{字符,它在最后+8不会=6啊。
???
|