首页 > 其他分享 >猿人学APP逆向对抗2020赛题

猿人学APP逆向对抗2020赛题

时间:2023-03-19 18:11:41浏览次数:59  
标签:encrypt 函数 APP 赛题 sign sleep 2020 data sum

此app为猿人学2020年的赛题,需要得到0-99所有id值对应的返回结果之和。抓包查看到接口为/api/match/11/query,参数是id值以及sing值,返回数据就是id值对应的data值。

img

反编译apk得到发起请求的函数为query,其调用getSign1以id值为参数生成sign值,onResponse函数会接收到请求的返回

img

主动调用请求函数

如果只是为了解题的话就可以直接通过frida主动调用query请求0-99所有id值对应的data,并hook onResponse函数得到返回结果计算和。对应的frida脚本如下:

function main(){
    Java.perform(function(){
        var ma_instance = 0;
        Java.choose("com.yuanrenxue.onlinejudge2020.MainActivity", {
            onMatch:function(instance){
                ma_instance = instance;
                console.log(ma_instance);
            },onComplete:function(){}
        })

        var sum = 0;
        Java.use("com.yuanrenxue.onlinejudge2020.MainActivity$4").onResponse.overload("okhttp3.Call", "okhttp3.Response").implementation = function(arg1, arg2){
            var response_string = arg2.body().string();
            console.log(response_string);
            var JsonObject = Java.use("org.json.JSONObject").$new(response_string);
            sum = sum + JsonObject.optInt("data");
        }

        for(var i = 0; i < 100; i++){
            var num = Java.use("java.lang.Integer").$new(i);
            ma_instance.query(num);
            Thread.sleep(1);
        }
         
        console.log("sum is :", sum);
    })
}
setImmediate(main)

但是在脚本执行的过程中发现每次请求都要等待很多时间,一开始以为是服务器响应的慢,但是手动点击请求确响应的很快。

img

查看一下getSign1函数做了哪些操作,此函数会调用native函数getSign。查看jni_onload函数得到此函数对应的native为sub_5C8A8

img

分析sub_5C8A8函数发现其会调用myLooper函数,如果返回null就会sleep,因为frida主动调用应该是native线程通过反射调用的,所以调用myLooper会返回null并调用sleep,这也是之前脚本每次请求都需要等待很多时间的原因。

img

修改一下之前的脚本,replace sleep函数并直接返回。

var sleep_addr = Module.findExportByName("libc.so", "sleep");
console.log("sleep_addr is:", sleep_addr);
// 使用Interceptor.replace替换sleep函数的实现
Interceptor.replace(sleep_addr, new NativeCallback(function (seconds) {
    return 1;
}, "int", ["int"]));

再次运行脚本就可以正常获取到sum值为483974

img

分析sign算法

另一种方法就是分析sign生成算法,getSign对应的native为sub_5C8A8。此函数会先调用nextInt(10000)nextInt(1000000)生成两个随机值。

img

然后将两个随机值和id值格式化输出到%d:yuanrenxue2020:%ld:randomClientId%sReplaceWithYourTeamNameIfYouCrackedToHere字符串中,接着在字符串开头再增加一个随机值并对字符串其余元素与0x14进行异或运算。

img

最后调用sub_5E950函数对前面的字符串再次进行编码,此函数是一个魔改的base64(四个一组的字符,第二个和第三个的位置发生交换),码表为9+#FvwxNG78pqrghijCDEWXy4oAd56kQHlmBuOPYz0cstef1IJKLM23ZabnRSTUV

img

frida hook各个函数查看sign生成的整个过程。

img

知道了sign的生成算法就可以直接编写python脚本了

import httpx
import random
from urllib.parse import quote_plus

# 定义base64字符表
BASE64_CHARS = "9+#FvwxNG78pqrghijCDEWXy4oAd56kQHlmBuOPYz0cstef1IJKLM23ZabnRSTUV"
def my_base64_encode(data):
    # 将数据转换为字节串
    data = data.encode()
    # 初始化编码后的字符串
    encoded = ""
    # 对每三个字节进行处理
    for i in range(0, len(data), 3):
        # 获取当前三个字节
        chunk = data[i:i+3]
        # 计算当前三个字节对应的24位二进制数
        bits = 0
        for j in range(len(chunk)):
            bits += chunk[j] << (16 - j * 8)
        # 对每六位二进制数进行编码,得到四个base64字符,并拼接到编码后的字符串中
        for k in range(4):
            if i * 8 + k * 6 < len(data) * 8:
                index = bits >> (18 - k * 6) & 0x3F
                encoded += BASE64_CHARS[index]
            else:
                encoded += "=" # 补齐等号

    # 对每四个字符一组的字符中的第2个与第3个互换
    swapped = ""
    for i in range(0, len(encoded), 4):
        group = encoded[i:i+4]
        if len(group) == 4:
            group = group[0] + group[2] + group[1] + group[3]
        swapped += group

    return swapped


def main():
    sum = 0
    num = 0
    client = httpx.Client(http2=True, verify=False)
    url = "https://match.yuanrenxue.com/api/match/11/query?id="
    while num < 100:
        n1 = random.randint(0, 10000)
        n2 = random.randint(0, 1000000)
        n3 = random.randint(0, 120)
        encrypt_sign = str(n1) + ":yuanrenxue2020:" + str(num) + ":randomClientId" + str(n2) + "ReplaceWithYourTeamNameIfYouCrackedToHere"
        for i in encrypt_sign:
            i = ord(i) ^ 0x14
            encrypt_sign = encrypt_sign + chr(i) 
        encrypt_sign = str(chr(n3)) + encrypt_sign;
        encrypt_sign = my_base64_encode(encrypt_sign)
        response = client.get(url + str(num) + "&sign=" + quote_plus(encrypt_sign))
        sum = sum + response.json()['data']
        num = num + 1
        print(response.text)
    print(sum)

if __name__ == '__main__':
    main()

最后运行的结果也是483974

img

标签:encrypt,函数,APP,赛题,sign,sleep,2020,data,sum
From: https://www.cnblogs.com/revercc/p/17233821.html

相关文章

  • 网络系统管理Linux环境——10.AppSrv之DNS
    题目要求服务器AppSrv上的工作任务3. DNS(BIND)为chinaskills.cn域提供域名解析。为www.chinaskills.cn、download.chinaskills.cn和mail.chinaskills.cn提供解析。启用内外......
  • 网络系统管理Linux环境——11.AppSrv之APACHE2
    题目要求服务器AppSrv上的工作任务4. APACHE2安装apache服务;服务以用户webuser系统用户运行;全站点启用TLS访问,使用本机上的“CSKGlobalRootCA”颁发机构颁发,网站证书信......
  • 网络系统管理Linux环境——12.AppSrv之MAIL(POSTFIX-SMTPS & DOVECOT-IMAPS)
    题目要求服务器AppSrv上的工作任务5. MAIL(POSTFIX-SMTPS&DOVECOT-IMAPS)Postfix​​​sdskill.com​​​​​的邮件发送服务器支持smtps(465)协议连接,使用Rserver颁发......
  • 网络系统管理Linux环境——13.AppSrv之CA
    题目要求服务器AppSrv上的工作任务6. CA(证书颁发机构)CA根证书路径/csk-rootca/csk-ca.pem;签发数字证书,颁发者信息:(仅包含如下信息)   C=CN   ST=China   ......
  • 使用ASP.NET CORE SignalR实现APP扫描登录
    使用signalr实现APP扫码登录1.背景介绍在移动化时代,web开发很多时候都会带着移动端开发,这个时候为了减少重复输入账号密码以及安全性,很多APP端都会提供一个扫码登录功能......
  • 网络系统管理Linux环境——8.AppSrv之SSH
    题目要求服务器AppSrv上的工作任务1. SSH安装SSH,工作端口监听在192101。仅允许InsideCli客户端进行ssh访问,其余所有主机的请求都应该拒绝。在cskadmin用户环境下可以免秘......
  • 2023.3.19 模拟赛题解
    银行取款题意在现代文明社会中,大家在诸如银行办理业务、车站买票等活动时都很文明,没有插队的现象,本着"先来先服务"的规矩。初赛已经结束了,凡凡的爸爸打算上银行去取点......
  • Origin 2020【科学数据分析】中文破解版安装包下载及图文安装教程​
    Origin是由OriginLab公司全新开发的一款科学绘图、数据分析软件,能够为用户提供多样的数据统计、数据处理、数据报告等功能,是全球商业行业、学术界和政府实验室超过50万科......
  • CAXA工艺图表 2020 中文破解版安装包下载及图文安装教程​
    CAXA工艺图表打造了全新的工艺编制软件平台,具有多文档、多环境的特点,使用户在编制工艺文档、或绘制工装图纸时更加流畅、自如,而且依据中国机械设计的国家标准和使用习惯,提供......
  • mapper接口中常见的增删改查
    前言相信大家在使用mybatis写mapper接口的时候,最常用且简单的方法就是增删改查了。我也是刚开始做项目,在本篇文章中,我将根据自己在vhr微人力项目中的mapper接口方法为实......