长颈鹿喜欢吃彩虹

发现是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)

运行结果如上

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值