猿人学2022安卓逆向对抗比赛第二题分析

发布于:2023-05-22 ⋅ 阅读:(376) ⋅ 点赞:(0)

第一步 准备工具

1.charles 抓包工具
2.pixelxl 真机
3.jadx
4.本机安装 python 和 frida

抓包分析

首先,在第一题的时候,已经分析出app是没有壳的,并且知道了,app请求的路由的包的路径,我们再一次进行Charles抓包 可以获取到 第二题的post请求

在这里插入图片描述
可以看到 post 请求的 form表单也是三个参数

page 还是页数
ts 大差不差 就是时间戳
sign 就是加密的参数

jadx 直接搜索 /app2

第一题的时候 直接搜索 /app1 找到唯一匹配点,第二题 的 post 提交的 path 路径 也大差不差

在这里插入图片描述
可以看到 搜索到唯一的匹配点,双击进入 可以看到依旧是原来的 路由表
在这里插入图片描述
右键 跳转到 用例,可以看到三个匹配选择
在这里插入图片描述
第一个和 第二个 一样,随便选择一个双击进入
在这里插入图片描述
可以明显的看到一个sign 方法 ,按住 Ctrl 点击 sign 方法 跳转进入

在这里插入图片描述
可以看到 是一个 native 的sign 函数 ,和 题目说的 so 加密相对应 说明应该是没有错的。

直接开始hook

我本来是想要,找到 so的 库 ,然后通过IDA 进行分析里面的加密方法,这个时候,又进入了一个死循环。。。这个思维是错的。。。

抽了一根烟,想了一下,题目的需求,他只是需要我们计算1~100页的数字之和
那么我直接通过frida rpc 进行调用就行,干嘛 自己自找没趣的去分析自己看不懂的汇编代码和伪C代码
直接 hook 一下 sign 方法,了解一下 传入的值是怎么样的,然后直接主动调用一下 生成的数据 进行rpc ,然后python不就可以写爬虫了嘛

所以直接开始 书写 frida hook

代码如下

function main(){
    console.log("hooking.......")
    Java.perform(function(){
        var sign = Java.use("com.yuanrenxue.match2022.fragment.challenge.ChallengeTwoFragment");
        sign.sign.implementation = function(args){
            console.log("args=>",args);
            var result = this.sign(args);
            console.log(result);
            return result;
        }
    });
}

setImmediate(main);

在这里插入图片描述
可以看到 args 传入的值 是

page 的值 + :+ts 的值

那就好办了 ,还是按照第一题的思路 进行 主动调用

代码如下

function main(){
    console.log("hooking.......")
    Java.perform(function(){
        var sign = Java.use("com.yuanrenxue.match2022.fragment.challenge.ChallengeTwoFragment");
        sign.sign.implementation = function(args){
            console.log("args=>",args);
            var result = this.sign(args);
            console.log(result);
            return result;
        }
    });
}

// setImmediate(main);

function invokesign(data){
    var result = null;
    Java.perform(function(){
        Java.choose("com.yuanrenxue.match2022.fragment.challenge.ChallengeTwoFragment",{
            onMatch:function(ins){
                console.log('ins=>',ins);
                result = ins.sign(data);
                console.log("result=>",result);
                
            },onComplete(){}
        })
    });
    return result;
}

rpc.exports = {
    invokesign:invokesign,
}

python代码如下

import time
import frida
import requests

from requests.packages import urllib3
 
urllib3.disable_warnings()

def my_message_handler(message, payload):
    print("message=>",message)
    print("payloa=>d",payload)


# connect wifiadb
device = frida.get_device_manager().add_remote_device("192.168.0.102:8888")
print('设备=>',device)

session = device.attach("com.yuanrenxue.match2022")
print('session=>',session)

# load script
with open("app2.js") as f:
    script = session.create_script(f.read())

script.on("message", my_message_handler)
script.load()

# script.exports.invokesign("6:1645678987")

def get_url():
    num = 0
    for i in range(1,101):
        url = 'https://appmatch.yuanrenxue.com/app2'
        headers = {
            'accept-language': 'zh-CN,zh;q=0.8',
            'user-agent': 'Mozilla/5.0 (Linux; U; Android 8.1.0; zh-cn; Pixel XL Build/OPM1.171019.011) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30',
            'content-type': 'application/x-www-form-urlencoded',
            'accept-encoding': 'gzip',
            'cache-control': 'no-cache'
        }
        data = {
            'page':str(i),
            'ts': str(int(time.time()))
        }
        data['sign'] = script.exports.invokesign(data['page']+':'+data['ts'])
        print('data->',data)
        response = requests.post(url,headers=headers,data=data,verify=False)
        print(response.text)
        value_data = response.json()
        for value in value_data['data']:
            num += int(value['value'])
        print(num)

        time.sleep(1)
    # print(num)
if __name__ == '__main__':
    get_url()

    

在这里插入图片描述

在这里插入图片描述

总结

和第一题没有什么区别
关键是需求一样,如果是需要分析算法的话,估计我也不会弄
还是一句,看不懂的直接hook 主动调用一下就行
简单快捷!

本文含有隐藏内容,请 开通VIP 后查看