猿人学APP-第四题


直接抓包

很明显,之前的是抓到过appmatch.yuanrenxue.cn这个域名的数据的,但是一进入题目就发生报错,有可能是这个题目的特性,为了确定这个猜想,去第二题看一下数据包

能正常抓到
并且在反复的进入第四题发现数据包有一些特点

总会去请求 http://180.76.60.244:9901
这样子是抓不到了,直接试试r0capture这个神器看看能不能抓到吧

看到了返回包,很明显,正常抓到了,往上翻一下,看看请求包

可以看到,请求路径为/challenge.Challenge/SayHello 后面乱七八糟的应该是header头的一些内容或者包体啥的,很明显,能在里面看到grpc的痕迹,既然已经找到路径,就看看去jadx里看看吧

这样找到的定位,翻不到有用信息,换一个

进去后,翻看一下他的函数

一看就非常的特别
hook一下他,看看传入的参数和返回值
function main2() {Java.perform(function () {let ChallengeFourFragment = Java.use("com.yuanrenxue.match2022.fragment.challenge.ChallengeFourFragment");ChallengeFourFragment["sign"].implementation = function (str, j) {console.log(`ChallengeFourFragment.sign is called: str=${str}, j=${j}`);let result = this["sign"](str, j);console.log(`ChallengeFourFragment.sign result=${result}`);return result;};})}setImmediate(main2)

这个时候回头看一下抓的数据包,发现其中一点居然是hook的返回值

刚才已经发现数据包中包含“grpc”这个特殊的单词,那就使用HttpCanary把他的数据包保存下来,看一下能不能看到他的包内容



保存为request_body.bin
然后将这个文件进行解析

解析出来三个字段的值,但是没有搞出来他们的参数名是啥,根据这个系列的题目,可以试着猜一猜,第一个1,很明显是一个页数,那应该就是page,第二个是时间戳,那应该是t,第三个是加密后的内容吧,应该是sign
根据对这几个的猜想,去编写proto文件(此处的技术栈,后续进行补充,建议大佬们自行查询资料)
test4.proto
syntax = "proto3";
package challenge;
service Challenge{rpc SayHello(Request) returns(Response){}}
message Request{int32 page = 1;int64 t = 2;string sign = 3;}
message Response{repeated Item data = 1;}
message Item{optional string value = 1;}
然后编写客户端
testClient.py
import test4_pb2import test4_pb2_grpcimport grpc
if __name__ == "__main__":with grpc.insecure_channel("180.76.60.244:9901") as channel:stub = test4_pb2_grpc.ChallengeStub(channel)data = test4_pb2.Request()data.page = 1data.t = 1708329132362data.sign = "c455476cfea43c6c"print("data==>",data)response = stub.SayHello(data)print(response)
运行一下

可以得出结果,那就说明猜想的数据没错
总结一下:
-
使用client可以获取到指定页的数据,但是我们的参数需要自己填补,且不能获取sign
-
使用hook可以获取指定时间戳,指定页数和sign
这样,我就可以考虑怎么把这两个结合到一起了,使用hook来获取sign,再使用client来获取数据。
所以,我应该就可以使用rpc来调用hook脚本来获取sign的值,然后把sign的值带入到Client中来获取结果了吧
import jsonimport timeimport requestsimport test4_pb2import test4_pb2_grpcimport grpc
if __name__ == "__main__":with grpc.insecure_channel("180.76.60.244:9901") as channel:sum = 0for p in range(1, 101):t = int(time.time())page = f"{p}:{t}"‘’‘此处rpc的内容先省略,系统整理之后再表,大佬们可以先自行查阅资料’‘’
stub = test4_pb2_grpc.ChallengeStub(channel)data = test4_pb2.Request()data.page = pdata.t = tdata.sign = sign
response = stub.SayHello(data).datafor i in response:print(int(i.value))sum += int(i.value)print(sum)

