
发现是64位程序,于是用ida64将其打开
代码也是非常的长,一共有15个循环,所以这里就慢慢分析

我一步一步的分析了一下,过程大概是这样的

首先输入一个字符串,进行处理,最后与s2进行比较。这里的这个s2是enc_data

由于这里我们都不知道数据,所以只能动态调试先获取数据,然后进行解密
动态调试先提取s2,也就是这个data值


然后提取key值


这里我的输入为32个1,然后将程序运行到加密之后的位置


然后得到32个结果,由这个结果我们可以发现有点规律,都是8位一循环,说明那个加密函数应该也是这样的逻辑。并且前面我们所得到的密钥也是8位
好像ctf那些事那本书说过,逆向就是有根据的连蒙带猜,这里说实话那个加密函数逻辑实在是复杂,但是我猜它应该就是8输入与密钥进行循环异或的过程

这里我们应该是知道我们的最终结果前4位与最后一位的,所以密钥的这几位就应该也能对得上,然后还有三位密钥,这里我觉得可以爆破得到,因为也就256的三次方。但是仔细观察一下就发现了这个key好像和这五个结果有点联系
如果逆序一下刚好就对上了
最后得到解密脚本:
s2=[29, 54, 115, 22, 73, 45, 26, 29, 41, 6,
66, 44, 118, 7, 16, 14, 126, 57, 85, 50,
117, 3, 27, 29, 25, 95, 82, 35, 1, 3,
29, 63]
key=[66, 79, 98, 48, 109, 48, 111, 78]
key.reverse()
# print(29^ord("S"))
# print(54^ord("Y"))
# print(115^ord("C"))
# print(22^ord("{"))
# print(63^ord("}"))
s=''
for i,j in enumerate(s2):
s+=chr(j^key[i%len(key)])
print(s)

运行结果如上