逆向目标
- 网址:
aHR0cHM6Ly93d3cuYXBwbGUuY29tLw==
- 目标:逆向登录
抓包分析
点击右上角购物袋,选择登录。
首先输入手机号或邮箱,点击箭头,会发起一个init
请求,其中a
参数需要逆向分析。
该请求的响应在后续请求参数的生成会用到。
然后输入密码进行登录,会发起一个complete
请求,其中的m1和m2
参数需要逆向。
闲话不多说,直接开整。
逆向分析
a
的跟栈就不多说了,直接从启动器往前看就可以看到
生成逻辑很清晰,跟着逻辑把代码都扣下来即可。
这里有一个很坑的地方:f = r.publicValue
其实是会走publicValue
的getter
函数的,如果你F10是看不到具体生成逻辑的,必须得F9才可以。
然后publicValue
属性也是一个对象,其中的bi、buffer、hex
属性也是这种玩法,一定要细心,不要被坑了。
参数a
细心耐心点就能搞出来。
还是从启动器进去,下断,发包,跟栈。一直往前跟,就会发现m1和m2
是经过异步生成的。
下面就开始讲解这种特征异步的处理方式。
首先我们在异步之前找个地方下断,最好是能断住我们想要的一次请求。我就在下图这个地方下断了,重新请求。
然后就会进到本篇文章所描述的特征点相关的代码,一般是switch (r.prev = r.next)
,我们直接下断,然后F8,然后单步跟。
这里r.next = 4
表明下一次控制流会进入case 4
,同时e._getSRPValues
的结果就是下一次控制流的r.sent
,这个原理我也不太懂,有大佬路过的话可以指点指点,然后我们直接在下一次控制流下断,F8。
可以发现m1和m2
已经生成了,那就是我们错过了以下异步逻辑,重新跟。
这一次我们直接跟进去e._getSRPValues
,还是一样的特征,该下断的地方都下,然后之后就按照这个逻辑跟了。
由于异步特别容易跟丢,所以我就直接揭开谜底,函数该跟的地方直接说了,下一个需要跟的就是Et
。
还是一样的特征,下一次有点特别,直接在ze.postMessage
下断。
跳到ze.postMessage
断点,发现是Worker
,这里是postMessage
,那我们就找onmessage
下断。
可以看到m1和m2
已经生成了。
我们网上看一个栈,可以确定就是在这生成的。
按照之前的逻辑m1和m2
从b1
中来,而b1
其实就是r.getEvidenceMessage(m)
的结果,我们直接清空所有断点,在r.getEvidenceMessage(m)
下断,重新发包。
可以看到,参数还没生成,而且h
也很熟悉,就是第一个请求的响应。
接下来就是多层Promise
了,直接硬刚。
小技巧:我们怎么看哪些函数需要重点跟呢,就是你点进去发现是下面这种形式的,然后基本都会进入一个Promise
,跟Promise
记得F9,同时,记得在下一次控制流提前下断。
第一次,从r.getEvidenceMessage(m)
进
第二次,从this.getEvidenceData(r)
进
第三次,从I
函数进
第四次,从e.getHash()
进
这个promise会进入很多次,后面就不赘述了。
第五次,从与I
同层级的A
函数进
第六次,从与I
同层级的T
函数进
第七次,从与I
同层级的O
函数进
最后,就是在这里生成的m1和m2
扣代码的话就不带着扣了,因为实在是太多了,按照前文所讲的逻辑一步一步跟着扣就可以。
注意点:记住xxx.sent
就是上一次控制流的结果,还有就是之前碰到的有bi、buffer、hash
属性的对象,要重点关注各自的getter
函数
最后直接附上模拟请求结果
成功!!!
账号网址:aHR0cHM6Ly9hcHBzdG9yZS5wYW5iYWlkLmNvbS9zaGFyZS9NVQ==
,K哥提供