首页
课程
问答
CTF
社区
招聘
峰会
发现
排行榜
知识库
工具下载
看雪20年
看雪商城
证书查询
登录
注册
首页
社区
课程
招聘
发现
问答
CTF
排行榜
知识库
工具下载
峰会
看雪商城
证书查询
社区
Android安全
发新帖
0
7
[原创] CTF 看雪&阿里《第2届移动安全挑战》第一题 Cobb的记忆
发表于: 2023-7-17 17:17
25115
[原创] CTF 看雪&阿里《第2届移动安全挑战》第一题 Cobb的记忆
行简
2023-7-17 17:17
25115
# 0x01 前言 路漫漫其修远兮,吾将上下而求索。 看雪ctf板块中:  # 0x02 分析 ## 2.1 入手点定位 安装apk,需逆向寻找正确的flag,输入错入flag,提示如下  将AliCrackme2_1.apk使用jadx打开,从提示信息入手,搜索:这是Cobb暗恋班花的记忆,奈何物是人非! 可在资源文件中定位到:  继续搜索resp_invalid可定位到Main->handleMessage()方法中:  ## 2.2 handleMessage()方法刨析 看代码: ``` private Handler handler = new Handler(Looper.myLooper()) { // from class: k2015.a1.Main.1 @Override // android.os.Handler public void handleMessage(Message msg) { Main.this.btn.setEnabled(true); switch (msg.what) { case 0: Main.this.tv.setTextColor(-16776961); try { Main.this.tv.setText(103 / msg.what); return; } catch (Exception e) { Main.this.tv.setText(R.string.resp_success); return; } case 1: case 2: default: return; case 3: Main.this.tv.setTextColor(-65536); Main.this.tv.setText(R.string.resp_invalid); return; } } }; TextView tv; ``` 简单解释下: 这段代码是一个包含了一个匿名内部类的私有成员变量的示例。其中,该成员变量是一个Handler对象,它用来处理消息和更新UI。 覆写了handleMessage()方法,用于处理接收到的消息。在这个方法中,根据接收到的消息的 what 值进行不同的处理逻辑。 case 0:设置文本颜色为蓝色,进行除法运算并在TextView中显示结果。如果出现异常,则在TextView中显示成功响应的文本。 case 1和case 2及default:忽略,不做任何操作。 case 3:设置文本颜色为红色,并在TextView中显示无效响应的文本。 代码中还声明了一个TextView对象tv,用于更新UI显示。 而handleMessage()方法中参数 Message msg 是在onCreate()方法中onClick()方法中的run()方法调用Check.check()方法来的。  ## 2.3 Check 类解析 Check类中有三个方法: ``` private static /* synthetic */ String access$_T11306(Object obj, String str) private static /* synthetic */ String access$_T15566(Object obj, String str) public static boolean check(String str) ``` access$_T11306() 和 access$_T15566() 方法都用于解析字符串,在 check() 方法中被调用。 check() 就是验证方法。 看了下 check() 方法毫无人性可言,1300多行代码:  且涉及大量反射调用计算,想要还原工作量可不是一般的大!  ## 2.4 hook 分析 尝试 hook 一下 check() 及 handleMessage() 方法: ``` var Check = Java.use("k2015.a1.Check"); Check["check"].implementation = function (str) { console.log('check is called' + ', ' + 'str: ' + str); var ret = this.check(str); console.log('check ret value is ' + ret); return ret; }; var AnonymousClass1 = Java.use("k2015.a1.Main$1"); AnonymousClass1["handleMessage"].implementation = function (msg) { console.log('handleMessage is called' + ', ' + 'msg: ' + msg); var ret = this.handleMessage(msg); console.log('handleMessage ret value is ' + ret); return ret; }; ``` 输入123456,hook 结果: > check is called, str: 123456 check ret value is false handleMessage is called, msg: { when=-29ms what=3 target=k2015.a1.Main$1 } handleMessage ret value is undefined 看来hook并不能解决这个问题,换方法。 ## 2.5 调试分析 ### 2.5.1 Android Killer静态分析 调试分析最难的一点就是在于:如何找到正确的调试点。 先看check函数是什么函数:public static boolean check(String str) check()函数是一个公共静态方法,该方法接受一个字符串参数str并返回一个布尔值。 那么关注点就是return所在的位置了,将apk拖入Android Killer中,在Check类中搜索return:  该类中有4处存在return,但仅有最后一处是在check方法中,双击进入:  可知需分析的就是v4的值是怎么来的了,搜索goto_0,可得:  结果蛮多,但仅需关注最后三处,前面四处并在check方法中。 第一处: ``` const-wide/32 v4, 0xf4240 rem-long v4, v8, v4 const-wide/32 v6, 0x1e74e add-long/2addr v4, v6 cmp-long v4, v4, v10 if-nez v4, :cond_3 const/4 v4, 0x1 goto/16 :goto_0 ``` 解析: 比较v4和v10的值,如果v4不等于v10,则将v4的值设置为1,然后跳转到代码末尾。 如果v4等于v10,则继续执行cond_3。 第二处: ``` :cond_3 const/4 v4, 0x0 goto/16 :goto_0 ``` 解析: 就是第一处v4等于v10时的执行代码。 第三处: ``` :try_end_129 .catch Ljava/lang/reflect/InvocationTargetException; {:try_start_129 .. :try_end_129} :catch_18 move-result v4 goto/16 :goto_0 ``` 解析: 应该为异常执行代码? ok,无论第三处是干嘛用的,综合来看我们需要分析的就是第一处的代码了: ``` cmp-long v4, v4, v10 ``` 应该就是在这与正确的flag进行比较,那么就在此处下断调试。 在调试前需注意,这个apk并没有开启debuggable权限,需要在AndroidMinifest.xml文件中添加android:debuggable="true"后进行重编译!  ### 2.5.2 JEB 动态调试 将Android Killer回编译好的apk安装,再用JEB打开该apk找到上面分析的cmp-long v4, v4, v10位置,ctrl+B下断后附加调试:  经过多次测试,v4一直都是一个固定值520676,而v10则会根据我们输入的值不同而产生变化。 不难发现v4应该就是算法的key,而v10是输入,需要输入一个值,这个值经过变化后需和v4相等。 # 0x03 破解  观察其smail代码: 首先,const-wide/32 v4, 1000000 指令用于将常量值1000000加载到寄存器v4中。 接下来,rem-long v4, v8, v4 指令将寄存器v8的值除以寄存器v4的值,然后将余数保存到寄存器v4中。简而言之,这条指令计算 (v8 % 1000000) 并将结果保存到寄存器v4中。 然后,const-wide/32 v6, 124750 指令将常量值124750加载到寄存器v6中。 接下来,add-long/2addr v4, v6 指令将寄存器v4和v6中的值相加,并将结果保存回寄存器v4中。简单来说,这条指令计算 (v4 + 124750) 并将结果存储到寄存器v4中。 接下来, cmp-long v4, v4, v10 指令用于比较寄存器v4的值与寄存器v10的值。此指令将比较结果放在v4寄存器中。如果v4小于v10,则v4变为负数;如果v4等于v10,则v4为0;如果v4大于v10,则v4为正数。 接下来,if-nez v4, :10FC8 是一个条件跳转指令,如果寄存器v4的值不等于0(即不相等),则跳转到标签:10FC8 处执行相关代码。 标签:10E22 是跳转的目标位置,表示在此处开始执行相关代码。 然后,const/4 v4, 1 指令将常量值1加载到寄存器v4中。 最后,goto/16 :58FC 是一个无条件跳转指令,用于跳转到标签:58FC 处执行相关代码。 这里有一个关键点就是v8寄存器的值是不会变的为:31395926。 那么经过rem-long v4, v8, v4 代码后 v4的值就是个固定值395926。 经过add-long/2addr v4, v6 代码后,v4的值变为了520676 那么其简化一下:v4 + v6 == v10 ,求 v10为多少? 是否一下子豁然开朗。 结果:  # 0x04 尾言 这道题解法,我属于是取巧了,理论上正常应该去分析v10这个变量的生成过程,这边也给大家一个思路: 向上分析v10的来源: 第一处:v18_3为输入的值。   第二处:进行计算的位置。  > 第1轮计算:123457(1E241h) 123457 - 123456 = 1 第2轮计算:123462(1E246h) 123462 - 123457 = 5 第3轮计算:123471(1E24Fh) 123471 - 123462 = 9 第4轮计算:123484(1E25Ch) 123484 - 123471 = 13 第5轮计算:123501(1E26Dh) 123501 - 123484 = 17 第6轮计算:123522(1E282h) 123522 - 123501 = 21 第7轮计算:123547(1E29Bh) 123547 - 123522 = 25 观测其规律,不难得出其中差值为4的等差数列,往下分析出算法就不难啦,这里就交给大家了,百看不如一战,多实战才能多积累出属于自己的东西。
登录后可查看完整内容
传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!!
最后于
2023-7-17 17:18 被行简编辑 ,原因:
#逆向分析
#HOOK注入
收藏
・
0
点赞
・
7
打赏
分享
分享到微信
分享到QQ
分享到微博
赞赏记录
参与人
雪币
留言
时间
東陽不列山
为你点赞!
2025-9-29 01:28
jiyuren
非常支持你的观点!
2024-9-5 15:21
PLEBFE
为你点赞~
2023-12-28 03:44
New对象处
为你点赞~
2023-11-23 11:44
method
为你点赞~
2023-10-18 15:08
vay
为你点赞~
2023-7-27 10:27
StardyGod
为你点赞~
2023-7-20 11:41
查看更多
赞赏
×
1 雪花
5 雪花
10 雪花
20 雪花
50 雪花
80 雪花
100 雪花
150 雪花
200 雪花
支付方式:
微信支付
赞赏留言:
快捷留言
感谢分享~
精品文章~
原创内容~
精彩转帖~
助人为乐~
感谢分享~
最新回复
(
4
)
codeoooo
雪 币:
704
活跃值:
(4117)
能力值:
( LV2,RANK:10 )
在线值:
发帖
1
回帖
112
粉丝
6
关注
私信
codeoooo
2
楼
2023-7-26 16:49
0
yoyoer
雪 币:
952
活跃值:
(15)
能力值:
(RANK:0 )
在线值:
发帖
0
回帖
11
粉丝
6
关注
私信
yoyoer
3
楼
2023-7-26 18:17
3
Sinozo
雪 币:
269
能力值:
( LV1,RANK:0 )
在线值:
发帖
1
回帖
8
粉丝
0
关注
私信
Sinozo
4
楼
2025-8-28 18:14
0
goto_const
雪 币:
32
能力值:
( LV1,RANK:0 )
在线值:
发帖
0
回帖
1
粉丝
0
关注
私信
goto_const
5
楼
题目太老了,手机安装都会失败
2026-2-3 11:29
0
游客
登录
|
注册
方可回帖
回帖
表情
雪币赚取及消费
高级回复
返回
行简
29
发帖
57
回帖
130
RANK
关注
私信
他的文章
[原创]Charles+Clash+Shadowrocket iOS VPx 抓包
12145
[原创] Bypass 某 x 书 frida 检测
35887
[原创]某易新闻逆向全过程
28200
[原创] frida 与 frida-tools 对应关系
17953
关于我们
联系我们
企业服务
看雪公众号
专注于PC、移动、智能设备安全研究及逆向工程的开发者社区
看原图
赞赏
×
雪币:
+
留言:
快捷留言
为你点赞!
返回
顶部