猿人学-JS逆向第一届第2题

猿人学-JS逆向第一届第2题

Xxi | 晞晞的小世界 Lv1

猿人学-JS逆向第一届第2题

hello,大家好,这里是Xxi,

今天给大家带来猿人学-JS逆向第一届的第2题

题目内容

目标网站:https://match.yuanrenxue.cn/match/2

题目2:提取全部5页发布日热度的值,计算所有值的加和,并提交答案。

加密分析

我们先来分析一下加密内容

1
cookie: m=0fabf61d4bc80ce1855b9faa426e924e|1749466601000; sessionid=你的sessionid;

sessionid:跟上题一样,指的是你本身的账号id

那这时候就剩下m值了,所以加密部分就是在m值的加密

加密定位

这题的加密位置是在cookie的加密

这道题cookie的加密机制是每隔30秒左右进行cookie的密文更新,

要进行cookie加密的定位要使用一段hook脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
(function (){
'use strict';
var cookieTemp = '';
Object.defineProperty(document, 'cookie', {
set: function (val) {
if (val.indexOf('m') != -1) {
debugger;
}
console.log('Hook捕获到cookie设置->', val);
cookieTemp = val;
return val;
},
get: function () {
return cookieTemp;
},
});
})();

第一步:监听脚本

在cookie刷新后,就会断住

第二步:执行hook脚本

将hook_cookie的代码段执行,然后关闭脚本监听

点击下一步的时候会出现一个无限debugger,跟上一题教的方法一样,直接解开就行

这时候,m值就会在脚本里面显示:

第三步:加密定位

我们先看一下调用的堆栈:

当前是停在set,也就是我们的脚本位置

那我们往下面的堆栈去看,

点开后出现了document,然后这个堆栈用的也是ob混淆的方法,

按照以往的经验来看,原文应该是想表达:document.cookie=xxxxxx

那我们有两个方法可以验证是否是在这里进行了加密:

1.选中代码段,将鼠标悬停,会显示原文内容:

2.将混淆部分在控制台输出:

由此可以判断,就是这个堆栈进行的加密

解ob混淆

和上一题一样,放到猿人学的解混淆工具里面进行解混淆

判断是否解混淆成功的依据是,代码能不能读的通读得懂

逆向过程

将加密的堆栈进行解ob混淆后,我们将解混淆后的代码拿来分析:

1
2
3
4
function _0x3aee97(_0x10bf65, _0x5b59ce) {
document["cookie"] = "m" + _0x5158ae() + "=" + _0x38278c(_0x10bf65) + "|" + _0x10bf65 + "; path=/";
location["reload"]();
}

_0x5158ae:空值

_0x5b59ce:无用

_0x10bf65:时间戳

_0x38278c:时间戳传入进行加密

加密部分改写

1
2
3
4
function _0x3aee97() {
let t = Date["parse"](new Date())
return _0x38278c(t) + "|" + t + "; path=/";
};

将加密部分改写后,进行补环境,具体方法就是:差什么就补什么

补环境是个很费时间的事情,只能是慢慢抠,没什么难点。

因为每个人的混淆后的函数名都不一样,这里就不展示代码了,

有需要的也可以联系我微信获取js代码,微信:weixi040917

解题代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import requests
import execjs

url = "https://match.yuanrenxue.cn/api/match/2"
num = []

with open('第二题.js', 'r', encoding='utf-8') as f:
ctx = execjs.compile(f.read())

for page in range(1, 6):
params = {
"page": page
}
headers = {
"user-agent": "你的UA",
"cookie": f"sessionid=你的sessionid; m={ctx.call("_0x3aee97")}"
}
# 发送请求并解析JSON
response = requests.get(url, headers=headers, params=params)
data = response.json() # 关键修改:将响应解析为字典

print(f"Page {page} Data:", data) # 打印解析后的完整数据结构

# 遍历解析后的数据
for item in data['data']: # data是字典中的键
num.append(item['value'])

# 计算最终平均值
print("Final Average:", sum(num))

运行结果答案为:248974

结语

这是我的第一篇教学文章,感谢各位的支持。

后续会继续更新下去,还请多多支持,有不懂的地方可以直接与我交流和指正!

微信:weixi040917

  • 标题: 猿人学-JS逆向第一届第2题
  • 作者: Xxi | 晞晞的小世界
  • 创建于 : 2025-06-09 18:53:58
  • 更新于 : 2025-06-09 12:42:04
  • 链接: https://xixixi.cc/2025/06/09/猿人学-JS逆向第一届第2题/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论