本帖最后由 ykq123654789 于 2024-9-13 01:04 编辑
1
1. 查看/load接口,发现了有个参数名为 " challenge "
2
3
4
2. 根据栈跟踪 逐个尝试,看看有没有符合的地方(打算没有符合的地方,再搜索参数名的,既然发现了出处,那就足够了)
3. 发现是 xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx 随机的 -4 固定,/load接口的参数 算是解决了.( captcha_id risk_type lang 这种参数 我就不叙述了 是验证码ID/验证码类型/语言标识,既然多次刷新不变,直接写死)
5
4. 接着看/verify 这个接口 看见了 lot_number , payload , process_token , payload_protocol , pt , w . 这6个参数
6
5. 其中 lot_number , payload , process_token , payload_protocol , pt .这5个参数 均由load接口返回. 核心那就是 w 了
7
6. 开始也是栈跟踪 慢慢查看,发现是混淆的,看不出有用价值,尝试直接搜索 POST表单参数试下,为了缩小搜索范围,根据栈跟踪显示,最大可能性是 gcaptcha4.js 这里,在这个js里面进行搜索
8
7. 搜索 " payload_protocol ",发现了2处地方,直接断下这2个,进行刷新,让他重新GET /verify接口
9
8. 刷新后,断下来了,发现"i"的值格式很像/verify接口的" w "值,加上 "'w': i" ,可以确定了 w=i ,这里就是 w 的出处了.另外的断点可以删掉了.
10
9. 控制台取值
(0, m[$_BIBCQ(20)]) = function i(e, t) ,是一个函数
f[$_BIBDJ(20)][$_BIBCQ(544)](e) = '{"device_id":"","lot_number":"168dceae67e9481bb2561ea03ed6344e","pow_msg":"1|0|md5|2024-09-12T20:19:22.142688+08:00|24f56dc13c40dc4a02fd0318567caef5|168dceae67e9481bb2561ea03ed6344e||1181b3087d56bf15","pow_sign":"5e08e04743e9092b0de1572ffe2b7f44","geetest":"captcha","lang":"zh","ep":"123","biht":"1426265548","jvGu":"dDE5","em":{"ph":0,"cp":0,"ek":"f1","wd":1,"nt":0,"si":0,"sc":0}}'
n = 一个对象
那么 function i(e, t) 大概率就是执行加密的地方了. 老样子重新刷新 在var = i 处下断 跟入进去看看.
11
10. 进入到 function i(e, t) , 输出 "e ,t" 发现对上了,接着往下有点乱 ,但是看得出来是 循环 加上 条件语句,全部条件成立后第一句断点,看看是什么流程.
12
11. 发现了执行流程(如上图), 看见 "_" 很可疑,也是十六进制文本.这个时候就细细的来了.
13
12. 控制台取值
(0, d[$_DAFCn(111)]) () = 生成一串十六进制文本 并且每次都不一样
$_DAFCn(917) = "encrypt"
l[($_DAFDv(20))] = function T()
14
13. 控制台取值
e = '{"device_id":"","lot_number":"688cd123c1bc492ca67317fa43846f3f","pow_msg":"1|0|md5|2024-09-12T20:25:39.132851+08:00|24f56dc13c40dc4a02fd0318567caef5|688cd123c1bc492ca67317fa43846f3f||2b5da8f7c25e07bf","pow_sign":"acb6c2612bb42feab8f571090a03b3b3","geetest":"captcha","lang":"zh","ep":"123","biht":"1426265548","jvGu":"dDE5","em":{"ph":0,"cp":0,"ek":"f1","wd":1,"nt":0,"si":0,"sc":0}}'
n = "73ae4d5e019e5db1"
$_DAFDv(917) = "encrypt"
r[a][$_DAFCn(905)] = 一个对象
最终返回了 (0, d[$_DAFDv(158)]) (u) + _
也就是 "w" 的值
捋一捋代码:
1. 生成一个随机十六进制 "n"
2. 执行函数 传入 "n" 得到 "_" >> _ = r[a][$_DAFCn(956)][ "encrypt" ](n);
3. 执行函数 传入 "e,n" 得到 "u" >> var u = r[a][$_DAFCn(905)][$_DAFDv(917)](e, n)
>>>>>
n=随机生成的
e 是一个字符串
15
16
14. 控制台取值
$_DAFCn(422) = "options"
t = 对象
s = 对象
$_DAFDv(687) ='pt'
a='1'
捋一捋 就得到了:
s = t.options
a= s.pt >> t.options.pt
>>>>>
那么
function i(e, t)
需要的就是 e t.options.pt
17
15. 添加记录 输出到控制台
function i(e, t) 下来第一行 添加记录 >> '加密内容',e,t.options.pt r eturn (0, d[$_DAFDv(158)]) (u) + _; 的位置 添加记录 >> '加密结果', (0, d[$_DAFDv(158)]) (u) + _
刷新网页看看 控制台的输出
18
16. 发现了 加密结果的值 (0, d[$_DAFDv(158)]) (u) + _ 和 w 值一致,接下来分析 e 的值 pow_*** ,栈跟踪既然没有明显的地方,那么还是尝试用搜索
19
17. 发现有3个,直接断下这3个,其他断点先停止,进行刷新,让他重新GET /verify接口
20
18. 发现断下了
'pow_msg': c + h,
'pow_sign': p
控制台取值然后 JS继续执行
21
22
19. 这也断下来了,看e的格式 参数 'device_id' , 'lot_number' , 'pow_msg' , 'pow_sign' 都有了,那就控制台输出,记录一下
发现了
s[$_BIBDJ(422)][$_BIBDJ(570)] = c + h 一致 >> s.options.powMsg
s[$_BIBDJ(422)][$_BIBCQ(526)] = p 一致 >> s.options.powsign
继续运行,这次主要是校验 加密内容是不是和他一致
23
20. 发现了 加密内容中的 e ,对上了, t.options.pt 一直是= '1' 那可能 pt 也是固定的
24
21. 直接在函数头部断点,刷新网页,让他重新GET /verify接口,看看传入了什么参数
25
22. 控制台取值 发现 function n(e, t, s, n, i, r, o) 传入了
e = "60103157f15f4ec2816c0ef4245fc720"
t = "24f56dc13c40dc4a02fd0318567caef5"
s = "md5"
n = "1"
i = 0
r = "2024-09-12T21:23:13.243665+08:00"
o = ""
直接步出,返回上一条,看看这些参数的来源
26
23. 控制台取值
r = 对象 包含了完整的 { pow_msg: "1|0|md5|2024-09-12T21:23:13.243665+08:00|24f56dc13c40dc4a02fd0318567caef5|60103157f15f4ec2816c0ef4245fc720||394ec7915e21d596", pow_sign: "eea4762bbc40c18798c0d7bb7a204558" }
(0, d[$_BGCIy(20)]) = function n(e, t, s, n, i, r, o)
n = "60103157f15f4ec2816c0ef4245fc720"
i = "24f56dc13c40dc4a02fd0318567caef5"
s[$_BGCHW(540)] = "md5"
s[$_BGCIy(529)] = "1"
s[$_BGCIy(588)] = 0
s[$_BGCHW(586)] = "2024-09-12T21:23:13.243665+08:00"
$_BGCHW(53) = ""
捋一捋代码:
function n(e, t, s, n, i, r, o)
e = n >> "60103157f15f4ec2816c0ef4245fc720"
t = i >> "24f56dc13c40dc4a02fd0318567caef5"
s = s[$_BGCHW(540)] >> "md5"
n = s[$_BGCHW(529)] >> "1"
i = s[$_BGCHW(588)] >> 0
r = s[$_BGCHW(586)] >> "2024-09-12T21:23:13.243665+08:00"
o = $_BGCHW(53) >> ""
参数的来源 主要就是 s 了 ,输出 s 看见了 s 的对象不多 刚好都对应上
27
28
24. 往上看,找到了 n,i,s 的来源对应:
s = t[$_BGCIy(502)],
n = t[$_BGCHW(469)],
i = t[$_BGCHW(507)]
控制台输出取值
t = 对象
s = t.powDetail
n = t.lotNumber
i = t.captchaId
查看对象 "t" 发现是一个大类 包含东西太多,但是参考下发现不少来源于/load的接口的返回
i = 验证码ID是可以确定了 这个参数就解决了
其他的我们去/load接口返回去看看 能不能对上
29
25. 根据/load的返回(下面称返回值为类: load)
load.data.lot_number == n == 参数e
pow_detail.hashfunc == s[$_BGCHW(540)] == 参数s
pow_detail.version == s[$_BGCHW(529)] == 参数n
pow_detail.bits == s[$_BGCHW(588)] == 参数i
pow_detail.datetime == s[$_BGCHW(586)] == 参数r
30
31
26. function n(e, t, s, n, i, r, o) 的参数 除了o都有了 o = $_BGCHW(53) 这个参数我就不逆推了,时间不允许
接着,先添加记录 输出验证
'function n(e, t, s, n, i, r, o)参数', n , i , s[$_BGCHW(540)], s[$_BGCIy(529)], s[$_BGCIy(588)], s[$_BGCHW(586)], $_BGCHW(53)
对比/load接口的返回 ,发现参数都对上了,那么 pow_msg 的参数都解决了,接着我们看加密内容 e 的 msg_sign
已知 'pow_sign': p ,来源于 p ,把函数 p = 的全部下断,js继续运行
32
27. 控制台取值
m[($_CAGIT(20))] = 对象
$_CAGHx(781) = "MD5"
$_CAGIT(698) = "hex"
l = "1|0|md5|2024-09-12T21:52:53.844870+08:00|24f56dc13c40dc4a02fd0318567caef5|9ed3c6eba81e4ce9abf90d349acbfd7c||761ef6d134ecd2e9"
l = c + h
'pow_msg': c + h
那么大概率 l = pow_msg 了
33
34
28. 输出p值
去掉3个 p = 的断点 添加记录
'pow_msg',c+h
'pow_sign',p,l
恢复运行
发现加密内容参数 'e' 里面的 pow_msg pow_sign 都对上了 t.options.pt 还是= '1'
29.
function n(e, t, s, n, i, r, o) 传入
/load的返回(下面称返回值为类: load)
load.data.lot_number == 参数e
验证码ID == 参数t
pow_detail.hashfunc == 参数s
pow_detail.version == 参数n
pow_detail.bits == 参数i
pow_detail.datetime == 参数r
o = ""
返回 pow对象
传入 function i(e, t) {
参数e ==
{"device_id":"","lot_number": lot_number":"9ed3c6eba81e4ce9abf90d349acbfd7c""pow_msg":"1|0|md5|2024-09-12T21:52:53.844870+08:00|24f56dc13c40dc4a02fd0318567caef5|9ed3c6eba81e4ce9abf90d349acbfd7c||761ef6d134ecd2e9","pow_sign":"ecbf121f99ceaf7fd230351ad6d57e7f","geetest":"captcha","lang":"zh","ep":"123","biht":"1426265548","jvGu":"dDE5","em":{"ph":0,"cp":0,"ek":"f1","wd":1,"nt":0,"si":0,"sc":0}}
>>>>>
{"device_id":"","lot_number": lot_number":"' + load.data.lot_number + '""pow_msg":"' + pow.pow_msg + '","pow_sign":"' + pow.pow_sign + '","geetest":"captcha","lang":"zh","ep":"123","biht":"1426265548","jvGu":"dDE5","em":{"ph":0,"cp":0,"ek":"f1","wd":1,"nt":0,"si":0,"sc":0}}
参数t == {"options":{"pt":1}}
30. 保存gcaptcha4.js到本地
在t[$_CAGIT(20)] = n; 下面添加一行 window.getPow=n;
在t[$_DAFCn(20)] = i; 下面添加一行 window.getW=i;
下面的是html和e源码演示截图
37
38
教程结束了,由于上帝视角
不排除有忽略的地方
RSCProject支持库自行搜索下载
急眼4.rar
(393.94 KB, 下载次数: 27, 售价: 3 枚 精币)