
作者声明:文章仅供学习交流与参考!严禁用于任何商业与非法用途!否则由此产生的一切后果均与作者无关!如有侵权,请联系作者本人进行删除!
地址:aHR0cHM6Ly93d3cuZ2VldGVzdC5jb20vZGVtby9mdWxscGFnZS5odG1s
第一步
调用接口register-fullpage?t=1730089149865,返回的challenge、gt后续都要用到。
第二步
调用get.php,传参gt、challenge用第一步返回的,其它固定的,w值需要逆向。这里记为w1,后续进行分析。返回结果的内容用不到。
第三步
点击了验证后,会调用一个ajax接口进行验证。
这里参数gt、challenge和之前一样保持一致。w值需要逆向,这里和第一步的w,也就w1是不同的,我们记为w2,后续分析。
第四步
点击提交后,调用validate-fullpage完成验证,geetest_validate是上一步返回的。geetest_challenge和前几步的一样,geetest_seccode是geetest_validate拼接了|jordan。
首先刷新抓下包,找找到.get.php请求,然后跟栈。
下个断点,然后刷新进行调试,向上追踪,分析找出w的生成入口。可以发现在这个位置,找到了生成的入口,也就是用另一种搜"\u0077"的方式也可以直接找到。
然后我们发现w=i+r,而r是由函数t[$_CEEIT(1147)]()生成返回的,i是先拿到o, o = $_BFr()[$_CEEIT(1168)](de[$_CEEIT(411)](t[$_CEEJW(391)]), t[$_CEEJW(1106)]())这里生成,再把o当成入参 i = p[$_CEEIT(1116)](o)这里最后生成的i。
所以我们先看下r的生成逻辑,进到函数里。
这里是对16位的随机字符串进行了加密返回结果就是t,这个字符串后续w2的生成过程也用到了,需要保持一致。
加密方法可以自己扣,这里就完成了r值的生成分析。下面再看下i值的生成。
第一个参数,贴出来如下,只需要把前面拿到的gt、challenge替换,其它参数固定。
o拿到了,后面看下下个方法,怎么生成的i。
进到方法里
扣下代码,完成i的生成,至此w1的生成也就完成。
我们选用跟栈的方式找到加密入口。 首先下个断点在调用堆栈的栈顶方法。
触发下断点,逐步动态分析,看哪里有w值的出现。
第一次看到w值,继续观察,直到看不到w值后,我这里不过多分析贴出来结果,$_CDIm是最后一次看到w,从这里开始分析寻找w的生成。
我们知道w是n这个对象里的属性,先找下n的哪里是给w赋值,可以看到在这。
``
n[_CFCJf(1115)]
这行代码是对w赋值,来源于t对象的$_CEAy,我们向上找下t的来源。
经过测试,t[$_CFCIE(1119)]()这个方法里生成了w。
跟进去方法,这里包含了生成的方法。 这里采用了2次加密,可以扣下代码实现。内层加密,传参是r值和16位随机字符串。外层是对内层加密的结果再次加密。r值的生成需要在这个断点的方法内向上找。如下:
经过测试,发现r值里只有rp需要复现,用到gt、challenge、s是passtime[‘rp’, H(o[‘gt’] + o[‘challenge’] + s)]是通过md5加密的。
rp拿到后,第二个w也就完成了。