
1.目标逆向分析“腾讯企业邮箱”密码加密 方式并在Pycharm进行复现2.加密位置分析先输入账号密码打开F12再发送登录请求通过载荷信息可见账号是我们输入的账号下面的密码“123456a”被进行了加密。载荷中密码的key是p如果我们全局搜索p会看见大量资源杂乱不堪从中找加密位置无异于大海捞针所以我们尝试搜索encrypt该单词译为“加密“是加密位置高频出现的单词对比发现我们需要查找的目标数量大幅减少。接下来依次分析每一处符合要求的资源判断其是否有赋值操作是可疑加密位置在可疑位置全部打上断点共找到三处可疑位置。3.逆向过程1.锁定加密位置加密逻辑分析用户访问网站 -- 服务器返回登陆界面盐值密钥-- 用户输入密码 -- 浏览器用密钥加密密码 -- 浏览器带着加密后的密文密码向服务器发请求 -- 服务器用相同密钥解密接下来重新输入密码123456a点击登录按钮发送请求发现代码在此处断住可以确定此处是加密位置删除其他断点。2.调试过程先对当前加密位置代码进行分析发现这个加密参数传入了两个参数一个是我们之前输入的密码另一个十位纯数字应该是时间戳。为了印证这一猜想我们看能否用时间戳转换工具对时间进行还原结果还原成功时间基本吻合一般十位纯数字是秒级时间戳十三位纯数字是毫秒级时间戳在密码中加入时间戳就像加入动态生成的盐值把他们进行混合加密可以防止重放攻击增加安全性。经过加密后的数据会走进下面的if判断由它把这个十六进制的加密数据转换成ASCII文本使用64个可打印字符来表示数据。3.复现过程清楚了加密的基本逻辑现在开始抠代码补环境从最终被加密的密码处可知刚才的if判断对我们的加密结果做了Base64编码末尾的等号就是Base64编码最明显的特征所以我们抠代码时不必复制if判断直接对Res这个加密结果进行Base64编码转换即可。将加密位置的代码块复制到Node.js环境中并写进函数封装方便调用并简化一些不必要的操作。将公钥和RSA对象的定义方法复制过来并调用函数传入密码和时间戳。由于时间戳我们可以用python动态生成并将其当参数传入这里就不再复制时间戳的定义方法。此时我们需要验证这个公钥是静态还是动态会不会随机生成。刷新页面再次查看公钥可以看出两次公钥完全相同无需动态获取公钥。接下来往下溯源encrypt方法和hex2b64这是一种常见的命名习惯2是to的谐音hex是十六进制的英文的前三个字母表示16进制转Base64编码方法发现它们都被定义在一处文件且和其依赖方法均在同一文件因此猜测加密方法被单独定义在了一个文件没有相互导入可以直接复制整个文件。注从第三张图也可看出此网站采用了PKCS#1 v1.5标准进行padding随机填充中间会插入随机数跟随我们的参数一起进行加密这也是为什么我们传入相同参数每次运行结果却都不相同的原因。复制整个文件后运行加密并转换成功且每次运行结果不同。