0
点赞
收藏
分享

微信扫一扫

猿人学逆向比赛第一题sign参数(第三期)

     大家好,我是TheWeiJun。最近很荣幸和我的好朋友建国一起参加了猿人学的逆向比赛;在这次比赛中,见识了各种大佬秀操作。这篇文章中,我把逆向比赛中的第一题进行了分析,希望大家能够喜欢。文中若有错误内容,欢迎联系我进行改正。在阅读的同时不要忘记点赞+关注哦⛽️


特别声明:本公众号文章只作为学术研究,不用于其它用途。

鼓励一下

赞完再看


 目录

①    参数分析

②    Jadx反编译

③    FridaHook

④    sekiro服务

⑤    算法脱机

⑥    总结分享



趣味模块

      小东是一名后端开发工程师,上次领导让他设计的加固方案,没过多久,就又出现了大量的恶意请求,小东发现sign参数被破解了。于是小东思索了很久,决定用上自己多年的修行:魔改算法。小东加上这套策略后,请求量立马下降了。接下来,让我们去分析一下小东是如何设计的此方案吧!


猿人学逆向比赛第一题sign参数(第三期)_反编译_02

关注我们获得更多精彩内容

一、参数分析


1、使用charles进行app抓包,打开猿人学App。点击第一题,截图如下所示:

猿人学逆向比赛第一题sign参数(第三期)_json_03


经验分享:如果此处抓不到包,需要使用drony设置代理,再进行抓包即可。


2、加密参数初判断

观察上图,我们本次需要还原的加密参数为:sign;参数长度为32位,初步怀疑使用的加密为以下几种:

  • HmacMD5。
  • MD5 32位
  • UUID。

3、我们需要还原sign参数,然后去模拟发送请求,计算1-100页所有数字之和即可过关。



二、jadx反编译


1、使用jadx打开猿人学比赛apk,截图如下:


猿人学逆向比赛第一题sign参数(第三期)_java代码_04


2、等待jadx反编译完毕后,进行指定关键参数搜寻,截图如下:

猿人学逆向比赛第一题sign参数(第三期)_json_05


3、点击指定搜索结果,进入到代码中,截图如下:

猿人学逆向比赛第一题sign参数(第三期)_json_06


说明:代码有一定的混淆,此刻不要慌,我们认真找一下即可。


4、经过分析java代码,找到加密参数的函数,截图如下:

猿人学逆向比赛第一题sign参数(第三期)_反编译_07


结论:通过阅读源码,我们发现和以往的加密不一样,这个地方使用的是魔改的md4算法,那么接下来我们进行hook调试吧。



三、FridaHook


1、通过分析java源码,构建hook代码如下:

猿人学逆向比赛第一题sign参数(第三期)_java代码_08


2、启动frida脚本,分析截图如下:

猿人学逆向比赛第一题sign参数(第三期)_java代码_09


结论:此刻可以看到参数page、t、sign三个参数的值。page、t为入参,而ret sign 为出参。因为sign加密为魔改md4算法,所以我提供了两种方案解决这个加密参数。



四、sekiro服务


说明:因为我比较懒,直接使用sekiro服务进行主动调用获取sign参数。这种方案是应急使用的,不推荐大家使用!


1、打开Android Studio编辑java代码如下,只说部分重要逻辑:


  • java入口函数

猿人学逆向比赛第一题sign参数(第三期)_java代码_10


  • handleRequest主动调用

猿人学逆向比赛第一题sign参数(第三期)_反编译_11


  • AndroidManifest.xml文件

猿人学逆向比赛第一题sign参数(第三期)_java代码_12


2、Run当前项目,安装xposed apk到手机中,截图如下所示:

猿人学逆向比赛第一题sign参数(第三期)_json_13


总结:此刻我们打开手机,发现apk已经成功安装到手机中。


3、接下来进行python算法服务代码编写,截图如下:

猿人学逆向比赛第一题sign参数(第三期)_java代码_14


4、运行代码后,截图如下所示:

猿人学逆向比赛第一题sign参数(第三期)_java代码_15


总结:到此sekiro版还原算法流程就结束了,接下来我们来介绍另一种算法还原。



五、Python调用java源码


说明:推荐大家使用java还原算法,也符合比赛规则!


1、复制整个加密文件到IntelliJ IDEA开发环境中,截图如下:

猿人学逆向比赛第一题sign参数(第三期)_反编译_16


说明:以我java编程的经验,发现String.format进行格式化的参数OooO00o.OooO00o方法返回值应该是固定的,于是我决定hook一下此方法,看是否是固定值!


2、frida hook OooO00o.OooO00o方法,hook代码如下:

猿人学逆向比赛第一题sign参数(第三期)_json_17


3、执行刚刚写好的代码,启动frida,截图如下:

猿人学逆向比赛第一题sign参数(第三期)_反编译_18


说明:成功提取到了OooO00o.OooO00o方法的返回值,经过多次hook,发现此值是固定不变的!


4、编辑java代码,截图如下所示:

猿人学逆向比赛第一题sign参数(第三期)_反编译_19


5、代码运行后,对比frida hook的值和算法脱机还原的值,截图如下:

猿人学逆向比赛第一题sign参数(第三期)_反编译_20


经验分享:在本次java代码脱机中,我发现mac电脑芯片不一样(我的是M1),会存在jadx反编译的代码数据类型转换不一样的问题存在。造成了计算的结果不一致的情况发生,如果大家电脑是这个芯片,需要注意一下!


6、把java代码打包成jar,Python调用java代码实现如下:

# -*- coding: utf-8 -*-
import time


import jpype
import requests
from jsonpath import jsonpath


class JavaSpider:


def __init__(self):
jvm_path = jpype.getDefaultJVMPath()
jpype.startJVM(jvm_path, "-ea", f"-Djava.class.path=./sign.jar", "-Dfile.encoding=utf-8",
convertStrings=True)
self.instance = jpype.JClass('yuanrenxue.match.Sign')()
self.headers = {
'Host': 'appmatch.yuanrenxue.com',
'accept-language': 'zh-CN,zh;q=0.8',
'user-agent': 'Mozilla/5.0 (Linux; U; Android 10; zh-cn; Pixel 2 Build/QP1A.190711.020) AppleWebKit/533.1 (KHTML, like Gecko) Version/5.0 Mobile Safari/533.1',
'content-type': 'application/x-www-form-urlencoded',
'cache-control': 'no-cache',
}
self.url = 'https://appmatch.yuanrenxue.com/app1'
self.count = 0


def start_requests(self, page):
time_str = int(time.time())
ori_str = f"page={page}{time_str}".encode()
sign = self.instance.sign(ori_str)
data = f'page={page}&sign={sign}&t={time_str}'
response = requests.post(self.url, headers=self.headers, data=data).json()
value_data = jsonpath(response, "$..value")
self.count += (lambda x: sum([int(index.strip()) for index in x] if x else 0))(value_data)
print(f"page: {page}\n"
f"result: {self.count}")


def run_spider(self):
for page in range(1, 101):
self.start_requests(page)




if __name__ == '__main__':
js = JavaSpider()
js.run_spider()


7、代码运行后,截图如下:

猿人学逆向比赛第一题sign参数(第三期)_java代码_21


总结:到此整个流程分析就结束了,填写result结果到答题板,顺利通过。



六、总结分享


本篇分享到这里就结束了,欢迎大家关注下一期,我们不见不散!!!☀️


    我是TheWeiJun,有着执着的追求,信奉终身成长,不定义自己,热爱技术但不拘泥于技术,爱好分享,喜欢读书和乐于结交朋友,欢迎加我微信与我交朋友。

    分享日常学习中关于爬虫、逆向和分析的一些思路,文中若有错误的地方,欢迎大家多多交流指正☀️


猿人学逆向比赛第一题sign参数(第三期)_java代码_23

点分享

点收藏

点点赞


举报

相关推荐

0 条评论