recaptcha逆向分析
目标网站: https://www.google.com/recaptcha/api2/demo
目标接口: https://www.google.com/recaptcha/api2/reload
逆向目标: 接口请求体参数
1、流程分析

查看目标接口的启动器,点击查看发包位置
打上断点点击验证
我们需要知道这个Uint8Array是如何生成的,往上跟栈查看生成位置
2、调试技巧
目标recaptcha__zh_cn.js文件会变化,我们直接替换recaptcha__zh_cn.js文件来方便后续的调试
3、逆向分析

我们往上跟栈可以看到目标的ArrayBuffer参数是在一个对象的属性中,而这个对象是通过new N_生成的,我们直接搜索new N_
通过搜索new N_可以搜索四处地方,全部打上断点然后重新刷新页面就可以找到对应的生成位置了
接下来最主要的就是找到H参数的26位数组是如何生成的
这里的H参数可以看到是通过new lh生成的,所以我们继续搜索new lh
继续往上跟栈看看这个26位数组是怎么来的

到这里我们还是老办法,继续搜索new $N,可以搜到两处地方,都打上断点,然后刷新页面继续找
这里段了很多次才看到26位数组,继续用搜索大法搜索new x9
这里的r就是26位数组,r就是上方生成的
将这个逗号表达式简化一下发现P[C[1]](13, T[C[1]](26, m, 29, b, X, v))生成了26位数组,我们继续分析
这里重点关注一下b参数的4为数组是如何生成的
这个b参数是传进来的Z参数,继续向上跟栈
跟到这里发现是在这个m属性里面,再往前跟就是异步,这里尝试搜索了new tx和.m = 的方式都没有正确的找到,那就只能往异步前看几栈了
往异步前跟栈发现这里有一个地方给m赋值,直接下断点
断住之后在这里一直往下执行,观察这个u.m的值,一单出现想要的值就停住,往上跟栈
这里是调用了u方法,直接步入进去就可以看到生成的逻辑,这里重点讲一下!开头的那个参数
它是在这里生成的,我们看一下X.Z.i.execute这个方法
这里通过this.Y.then回调生成m对象,然后m.invoke()生成了最终的值,那么我们要看一下X.Z.i这个对象的Y值是如何生成的
这里可以看到X.Z.i这个对象是通过new cG生成的,我们再次搜索new cG,可以搜到三处位置,我们打上断点刷新页面
定位到这里后我们步入到H.load中
发现这里有两处对this.Y赋值的地方,都上断点然后继续向下执行
这里发现通过new window.botguard.bg(u,function() {})即可得到我们需要的目标对象