猿人学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







浏览 20
点赞
评论
收藏
分享

手机扫一扫分享

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

手机扫一扫分享

分享
举报