如果还没有看过这题,建议先自己看一下这题。
以下只是个人的一些拙见,肯定有更优秀的思路,还请大佬们在评论区教教小弟:handshake
只有思路,没有具体代码, 不废话了。
题目地址:https://match2025.yuanrenxue.cn/match2025/topic/1
验证码获取接口:https://match2025.yuanrenxue.cn/match2025/topic/1_captcha_jpg
post请求,需要获取的参数名 a
先用xhr断点断住这个接口 /topic/1_captcha_jpg

Snipaste_2025-06-08_20-41-15.png (11.12 KB, 下载次数: 0)
下载附件
2025-6-8 23:06 上传
刷新页面,所有的加密都在标签的代码里,且对比后面的第二题第三题没有做变量名的处理,所以不用替换文件,直接观察这个混淆文件,经过我几个小时的观察调试,理解都放在下面的图里了,注意观察代码的形式

Snipaste_2025-06-08_20-41-15.png (27.43 KB, 下载次数: 0)
下载附件
2025-6-8 23:35 上传
由于代码混淆的比较严重,这里直接用正则找到所有的带有 return xx = 这种形式的代码打上断点,这里的形式并不是最完整的形式,还是有类似于 xx[yy] = 这种形式的代码,这里给上不完整的正则
return\s+[a-zA-Z]{1,2}\s*=

Snipaste_2025-06-08_20-41-15.png (5.14 KB, 下载次数: 0)
下载附件
2025-6-8 23:05 上传
搜索一下,有89个这种形式的代码,我的做法是把这89个地方都打上了断点。
刷新一下页面

Snipaste_2025-06-08_20-41-15.png (19.72 KB, 下载次数: 0)
下载附件
2025-6-8 23:09 上传
观察一下这两个地方的字符串长度都是16,极有可能是加密的key 和 iv
继续往下走

Snipaste_2025-06-08_20-41-15.png (13.69 KB, 下载次数: 0)
下载附件
2025-6-8 23:05 上传
这里就是待加密的明文的生成地方了
[JavaScript] 纯文本查看 复制代码"7suiimqdbxc00000咦~,可带劲~。"+str(int(time.time() * 1000))+"俺不中嘞~"
需要改变的地方就是时间戳
再往下走到 so 函数,执行这个函数得到加密后的结果,所以这里就是加密函数的入口了,进入这个函数后发现还有一个 So 函数,这个函数的结果在base64编码后得到的结果就是请求参数 a.

Snipaste_2025-06-08_20-41-15.png (1.43 KB, 下载次数: 0)
下载附件
2025-6-8 23:03 上传
重点分析 So 函数。
断点继续往下,进入 po 函数

Snipaste_2025-06-08_20-41-15.png (22.72 KB, 下载次数: 0)
下载附件
2025-6-8 23:02 上传
其实前面调试的时候看scope里的变量,是能发现s盒的,但是没关系,到这里就能确定具体是什么算法了,这里有13个 16位数组的函数,且第一个数组是key,那剩下的12个数组在放进AES的密钥拓展函数后(改成12轮),得到的结果和这里的一致。

Snipaste_2025-06-08_20-41-15.png (50.76 KB, 下载次数: 0)
下载附件
2025-6-8 23:02 上传
剩下的其实就很简单了,找一份标准的AES-CBC算法,对比着上面的断点,每走一步看一看和标准的算法有什么区别,如果结果一致就不用看了
这里提供一下加密部分每一步对应的是什么函数。

Snipaste_2025-06-08_20-41-15.png (33.45 KB, 下载次数: 0)
下载附件
2025-6-8 23:01 上传
加密的部分就是上述部分,解密的函数和上述的分析过程是一样的。接下来的部分建议自己做一下,做出来还是挺有成就感的。

Snipaste_2025-06-08_20-41-15.png (15.51 KB, 下载次数: 0)
下载附件
2025-6-8 23:01 上传