猿人学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_pb2
import test4_pb2_grpc
import 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 = 1
data.t = 1708329132362
data.sign = "c455476cfea43c6c"
print("data==>",data)
response = stub.SayHello(data)
print(response)
运行一下
可以得出结果,那就说明猜想的数据没错
总结一下:
-
使用client可以获取到指定页的数据,但是我们的参数需要自己填补,且不能获取sign
-
使用hook可以获取指定时间戳,指定页数和sign
这样,我就可以考虑怎么把这两个结合到一起了,使用hook来获取sign,再使用client来获取数据。
所以,我应该就可以使用rpc来调用hook脚本来获取sign的值,然后把sign的值带入到Client中来获取结果了吧
import json
import time
import requests
import test4_pb2
import test4_pb2_grpc
import grpc
if __name__ == "__main__":
with grpc.insecure_channel("180.76.60.244:9901") as channel:
sum = 0
for 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 = p
data.t = t
data.sign = sign
response = stub.SayHello(data).data
for i in response:
print(int(i.value))
sum += int(i.value)
print(sum)