猿人学APP-第四题

共 5000字,需浏览 10分钟

 ·

2024-04-11 00:16


9c37ed4217a4b849f259b796bbe3e59e.webp




56d3207d3103feb5f1eb6f23783fb1ae.webp




直接抓包


9d5ffbb99a607786237b4cea23aa7120.webp




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


92980ec7affb23122840071df9ed5439.webp




能正常抓到


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


77b5ea7db067c6d68ad3f9752bd0dd7c.webp


总会去请求 http://180.76.60.244:9901


这样子是抓不到了,直接试试r0capture这个神器看看能不能抓到吧


4475ba5a39bf6b261fad2f3d7f8cdc7a.webp




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


5bddb15efbe0931056ef1aaadffd57be.webp


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


060e66f00490e3c99b60eb77ec197638.webp




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


8227caadd528edfd2b4dd57f7f46a324.webp


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


f344a1161b4f001abff3ed4ea16bcf30.webp


一看就非常的特别


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)


e91d738d5ed80d432e0e952c33cb68aa.webp


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


4f2ea9a600ebfe642406283442e72bf4.webp


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


2d624609bff120f12e2a361475974f31.webp


1beb1ea2e8f26f7a27e807451153d957.webp






944b8147211fa8340d5e72399627e7fa.webp


保存为request_body.bin


然后将这个文件进行解析


4f7b656919a4d40ed99e3e72def13de3.webp


解析出来三个字段的值,但是没有搞出来他们的参数名是啥,根据这个系列的题目,可以试着猜一猜,第一个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)







运行一下


177b229419cb7da9d13d1532491c468b.webp


可以得出结果,那就说明猜想的数据没错




总结一下:



  1. 使用client可以获取到指定页的数据,但是我们的参数需要自己填补,且不能获取sign


  2. 使用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)


d767c2a03d4d459107b4f0afc8617047.webp














浏览 43
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报