首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

被魔改md5加密坑了?某网站魔改md5加密逆向还原(多种语言还原)

大家好,我是TheWeiJun;最近由于工作太忙好久没有更新了。静下心来,突然很想念各位读者朋友,所以晚上抽空更新一篇。今天分享一篇关于魔改md5实现的加密算法逆向分析,本文将用多种语言还原加密算法,解决不同语言还原加密算法的难题。希望各位朋友能够多多提出宝贵意见,在阅读的同时记得给我一个star!

特别声明:本公众号文章只作为学术研究,不作为其它不法用途;如有侵权请联系作者删除。

目录

一、前言介绍

二、参数分析

三、堆栈调试

四、算法分析

五、思路总结

趣味模块

小军是一名工程师,最近小军遇到了一个棘手的问题:小军想要还原一个加密算法,他不想和往常一样通过Python调用JS的方式去实现算法还原;而是选择通过Python、Go、Java语言去实现算法还原。这篇文章中,我们将解决小军遇到的困境,让我们一起去看小军遇到的难题并通过多种语言去实现算法还原吧!

一、前言介绍

1、什么是md5加密?

MD5消息摘要算法(MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5加密是一种不可逆的加密算法,不可逆加密算法的特征是加密过程中不需要使用密钥,输入明文后由系统直接经过加密算法处理成密文,这种加密后的数据是无法被解密的,只有重新输入明文,并再次经过同样不可逆的加密算法处理,得到相同的加密密文并被系统重新识别后,才能真正解密。

2、md5是如何加密的?

MD5算法的原理可简要的叙述为:MD5码以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。

总体流程如下图所示,每次的运算都由前一轮的128位结果值和当前的512bit值进行运算 。

了解了md5加密后,接下来我们去实战中分析md5是如何实现魔改并进行加密运算的。

二、参数分析

1、首先打开我们今天要模拟的网站,刷新当前页面,使用fn+F12打开开发者界面,直接定位我们要获取的接口,截图如下所示:

2、我们确定好获取的接口后,点击payload查看该请求参数,截图如下所示:

3、标红的参数就是我们本次要还原的加密参数,接下来,我们对该接口各个参数进行初判断及整理分析:

Data参数分析:

formDataSign     初步怀疑是md5加密,长度32位

formDataStr       搜索的关键字

jsVer                   JS

发版时间

timestamp          当前时间戳,长度10位

Headers参数分析:

说明:由于headers参数没有重要参数影响,故不作说明。

ormData

三、断点调试

1、使用最简单的方式,查询指定关键字、加密方法,定位加密参数具体坐标文件,截图如下:

说明:经过查询,我们可以肯定的是代码中没有用到这个变量名,然后我们去搜索加密方法,发现能搜到结果,但是和我们的加密参数关联不大,截图如下:

2、接下来,我们还是使用XHR打断点,回溯堆栈的方式查找吧,截图如下:

3、然后刷新当前页面,进行堆栈查找,截图如下:

总结:很明显此刻加密参数已经生成,我们需要定位参数生成的位置,就需要学会查看堆栈信息,接下里进行堆栈回溯。

4、通过Call Stack进行堆栈回溯,截图如下所示:

5、由于堆栈回溯流程环节较多,我们直接快进定位到加密参数位置,截图如下:

说明:此刻我们可以看到t参数为timetamp参数拼接salt参数,然后进行下面参数运行即可得到第一次加密的密文,截图如下所示:

总结:此刻我们验证下前面的猜想:是否是md5加密,将明文信息粘贴到md5在线生成工具中验证,结果和js生成的值不匹配,截图如下:

6、继续执行断点,我们可以看到第二次加密运行截图如下图所示:

总结:此刻我们可以看到第二次加密运行的入参为:formDataStr拼接刚刚加密运行得到密文的32位字符串。继续执行断点,截图如下图所示:

7、将JS断点调试生成的最终加密值,与xhr请求时发送的formDataSign加密值对比,截图如下:

总结:我们可以看到formDataSign的值是经过两轮js自定义魔改算法而生成的,接下来我们通过还原js加密算法去验证该网站是否使用的魔改md5。

四、算法还原

1、先将本次分析的js代码抠出来使用Nodejs运行,去掉一些无用代码后,完整代码如下:

1.1 代码运行后截图如下:

总结:通过还原js代码,我们已经能够解决小军提到的问题。大家肯定很好奇,为啥我知道该网站使用的算法是魔改md5加密算法,很简单的一步操作就是先看常量(a、b、c、d),再看码表K。很明显这个地方的a、b、c、d四个常量转为16进制后,是经过了特殊的魔改而来。接下来让我们用其他语言来实现该算法吧!

2、经过上面的深度分析后,我通过修改md5源码实现了一版Python魔改的md5算法,完整代码如下:

2.1 代码运行后截图如下:

3、为了满足小军的需求,我们又实现了一版Go语言版本的魔改md5算法,完整代码如下:

3.1 main函数完整代码如下:

3.2 代码运行后,截图如下所示:

总结:观察Goland生成的加密值,我们可以确定和前面计算的结果一致,接下来我们再研究下java版本魔改md5如何实现。

4、作者通过Java语言实现的魔改md5完整代码如下:

4.1 代码实现后,我们将运行后的代码截图如下所示:

总结:本篇文章到这里,我们已经能够通过Js、Python、Go、Java语言去实现魔改md5算法还原了,小军遇到的难题我们已经迎刃而解,整篇文章字数有点多,感谢大家耐心观看!

五、思路总结

回顾整个分析流程,本次难点主要概括为以下几点:

如何快速确定位加密参数的位置

堆栈回源如何过滤无用代码

Js、Python还原加密算法实现

Go、Java还原加密算法实现

熟练掌握Md5算法及加密运算过程

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20230302A04V0O00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券