吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

搜索
查看: 6794|回复: 68
上一主题 下一主题

[Android CTF] 攻防世界Mobile-黑客精神解题思路分享

  [复制链接]
跳转到指定楼层
楼主
顶风能尿三丈远 发表于 2020-12-31 09:24 回帖奖励

下载附件,使用JEB加载apk,首先看一下Mainfest配置

大致有个初步印象,这个apk有两个Activity,一个是MainActivity 主入口,另一个是 RegActivity,应该是从主入口某个按钮拉起。

我们先分析 MainActivity 入口初始化函数 OnCreate

这里重点在于 会先判断 MyAPP.m 的变量值,是否为0,如果为0 ,就说明没有注册,会进入到注册环节,调用 doRegister, 如果m为1,说明已经注册过了,直接进入work环节。
m的取值就是本题的解题关键了,我们来看一下m在哪里被定义,已经在哪里被调用的。

根据MyApp类的定义,m为静态变量,MyAPP在 onCreate函数里进行初始化动作,可能会影响到变量m的值。

这里调用了native 函数 initSN()。后续我们会在libmyjni.so文件中进行深入分析。

在回到我们刚刚的主入口MainActivity ,我们还需要分析一下 doRegister函数和 work函数的逻辑

先来看 doRegister 函数,其实就是按钮注册点击事件,拉起注册页面。


在注册页面中,有个输入框和一个按钮,给按钮添加点击事件,将用户的输入sn,作为saveSN函数的入参,进行处理。
具体如何处理用户输入的sn,就需要进一步的分析 saveSN函数,这个saveSN函数也属于native层函数,待会也一并分析。

再看MainActivity中的work函数,当m=1时,会进入到work分支,它的逻辑也是在native层。接下来我们就需要分析so文件了


IDA加载 libmyjni.so文件
JNI_Onload 入口可以看到进行了动态函数注册。


我们可以看到 initSN函数实际上就是n1, saveSN函数实际上就是n2, work函数实际上就是n3


为了方便分析,我们将n1,n2,n3 分别换个变量名

n1 -> realinitsn
n2 -> realsavesn
n3 -> realwork



首先分析一下 initsn函数

这个函数非常的简单,就是将/sdcard/reg.dat文件中的内容取出来,和EoPAoY62@ElRD 进行对比。如果相同 v10=1 ,如果不同v10=0 。
注意这里的setValue函数,其实就是对变量m进行赋值操作的


现在再来看native函数 savesn

这个saveSN函数逻辑也很清晰,用户输入的字符sn,会进行字符计算操作,得到了新的字符串,再保存到 /sdcard/reg.dat 文件中。


至此,我们已经非常清晰知道了整个应用的逻辑。
第一次用户打开apk时,会进行注册,用户输入的注册字符,会经过字符计算操作, 然后存入到/sdcard/reg.dat文件中。以后用户再次打开app时,会对m值进行判断,就是通过对比/sdcard/reg.dat文件内容和
EoPAoY62@ElRD 是否相同。

那么我们的任务就根据字符串常量 EoPAoY62@ElRD 来反推出用户的输入字符。


我们依旧使用frida来进行解题。先测试一下我们的输入,输出

从这个输入输出的结果来看,我们总结了一个规律:
1、输入的字符个数和输出字符个数是 一一对应的。
2、将三个输入字符分为一组,对应一个输出字符。

我们可以利用frida快速的爆破出所有的字符,不需要去研究saveSN函数里的字符加密操作。不过此道题saveSN里的字符加密操作比较简单,很容易逆推出来。如果对于很复杂的加密算法,我们的爆破方法会非常简单。

20秒内就可以爆破出第一个三字符元组,  输入201 -> 输出 EoP


第二个元组  输入 608 -> AoY


第三个元组 输入Am! ->62@


第四个元组  输入233 -> ElR


第五个元组 输入3 -> D

最终的flag为 201608Am!2333

注册时输入 201608Am!2333 ,弹出提示框,给出flag的格式提示,也就是work函数的内容,我们不需要深究了。





frida hook 代码
[JavaScript] 纯文本查看 复制代码
var flag = false;
    	
    	
    	imports = Module.enumerateImportsSync("libmyjni.so");
      	 for(var i=0;i<imports.length;i++){
      		 
      		console.log(imports[i].name);
      		 if(imports[i].name =="fputs")
      		 {
      			console.log(imports[i].name);
      			console.log(imports[i].address);
      			targetfunc = imports[i].address;
      			break;
      		 }
      	  

      	 }
      	 
      	 
      	if(targetfunc != undefined)
	   	 {
	   	 Interceptor.attach(targetfunc,{
	   		onEnter: function(args){
	   			//console.log("strlen enter!");
	   			

	   				var data = Memory.readCString(args[0]);
	   				//console.log(data);
	   				if(data == "D")
	   					{
	   					flag = true;
	   					console.log("[+]Found: "+Memory.readUtf8String(args[0]));
	   					
	   					}
	   		
		   			
		   	}
		   		 
		   });
	   	 }
      	 
      	 
      	 
    	
    	
    	console.log("[*] hook android.os.Process");
        var Process = Java.use("android.os.Process");
        Process.killProcess.implementation = function () {
        	console.log("[*]get in android.os.Process killProcess");
        	
          
            
        };
        
        
        
        var dict = "abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()";
        
        var result = "EoPAoY62@ElRD";
        
        
        var plaint = "";
        
        
        console.log("[*] hook com.gdufs.xman.MyApp")
        
        var MyApp = Java.use("com.gdufs.xman.MyApp");
        var myapp = MyApp.$new()
        
        
        /*
        console.log("input: 11");
        myapp.saveSN("11");
        
        console.log("input: 111");
        myapp.saveSN("111");
        
        console.log("input: 1111");
        myapp.saveSN("1111");
        
        console.log("input: 11111");
        myapp.saveSN("11111");
        
        console.log("input: 111111");
        myapp.saveSN("111111");
        
        console.log("input: 111111111");
        myapp.saveSN("111111111");
        */
        
        
        /*
        for(var k =0; k <dict.length; k++)
					{
						
						myapp.saveSN(dict[k]);
						if(flag)
						{
						console.log("[+]Found dict : "+dict[k]);
						return;
						}
						
    
					}
					*/
        
        
        
        for(var j =0; j <dict.length; j++)
		{
		for(var i =0; i <dict.length; i++)
			{
				for(var k =0; k <dict.length; k++)
					{
						
						myapp.saveSN(dict[j]+dict[i]+dict[k]);
						if(flag)
						{
						console.log("[+]Found dict : "+dict[j]+dict[i]+dict[k]);
						return;
						}
						
    
					}
					
			}
		}
        





免费评分

参与人数 50吾爱币 +44 热心值 +48 收起 理由
tocabd + 1 + 1 谢谢@Thanks!
18077484116 + 1 + 1 用心讨论,共获提升!
onething + 1 热心回复!
520131415926lfc + 1 + 1 热心回复!
man2924981 + 1 + 1 我很赞同!
绝地飞鸿 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
0-n-3 + 1 + 1 谢谢@Thanks!
L.7_129 + 1 + 1 热心回复!
LJJ001 + 1 + 1 热心回复!
qhfwebjnds + 1 + 1 我很赞同!
sym945 + 1 + 1 热心回复!
净网行动 + 1 + 1 我很赞同!
Kael_A + 1 + 1 我很赞同!
漠漠 + 1 + 1 我很赞同!
Bluesky10 + 1 + 1 我很赞同!
Gikl2 + 1 + 1 我很赞同!
s785093878 + 1 + 1 我很赞同!
Daihui + 1 + 1 热心回复!
听风没有雨 + 1 我很赞同!
5ud0 + 1 + 1 我很赞同!
心语科技 + 1 + 1 用心讨论,共获提升!
wawyw + 1 谢谢@Thanks!
黑默丁格 + 1 + 1 用心讨论,共获提升!
大喵 + 1 + 1 热心回复!
huqi0010 + 1 + 1 我很赞同!
微草 + 1 + 1 热心回复!
我不讲武德 + 1 + 1 我很赞同!
hxtlcc + 1 我很赞同!
xiayilm + 1 + 1 我很赞同!
azcolf + 1 + 1 用心讨论,共获提升!
xiong_online + 1 + 1 用心讨论,共获提升!
kelvar + 1 + 1 谢谢@Thanks!
siuhoapdou + 1 + 1 谢谢@Thanks!
potatomato + 1 + 1 热心回复!
shou0823 + 1 + 1 谢谢@Thanks!
gaosld + 1 + 1 用心讨论,共获提升!
叶隽 + 1 热心回复!
Bizhi-1024 + 1 用心讨论,共获提升!
virs520 + 1 热心回复!
dota3 + 1 + 1 谢谢@Thanks!
AhBiao + 1 + 1 热心回复!
lzawww + 1 + 1 我很赞同!
uer + 1 + 1 我很赞同!
wwww7788549 + 1 热心回复!
egbert_tao + 1 + 1 热心回复!
WAlitudealiy + 1 谢谢@Thanks!
fengbolee + 1 + 1 用心讨论,共获提升!
testAPP + 1 + 1 谢谢@Thanks!
芽衣 + 2 + 1 破解流程很好
小朋友呢 + 2 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

推荐
 楼主| 顶风能尿三丈远 发表于 2021-1-4 09:36 |楼主
love514415 发表于 2021-1-4 09:32
不知道要多久能学会

应该要不了多久,我是2018年接触Android的,中间断断续续的,没有花太多时间,还是比较容易上手的
推荐
 楼主| 顶风能尿三丈远 发表于 2021-1-6 09:35 |楼主
Roy_li 发表于 2021-1-6 09:31
领悟了一个新思路,感谢楼主

不客气,能够对大家有所帮助,这是我发帖的目的所在
沙发
pjchangew 发表于 2020-12-31 11:39
3#
lifz888 发表于 2020-12-31 11:53
不错的分析,支持分享
4#
keny 发表于 2020-12-31 11:57
不错的分析,支持分享
5#
你心动什么 发表于 2020-12-31 11:59
很好的解题思路啊
6#
小羽0101 发表于 2020-12-31 13:12
分析得不错。
7#
qixiyun 发表于 2020-12-31 13:48
精彩!!!!
8#
BZF187577 发表于 2020-12-31 13:51
嗯,很厉害很精彩,请问这么厉害,我可以学会吗
9#
isroot 发表于 2020-12-31 14:10
学学一波,感谢分享
10#
QRQ 发表于 2020-12-31 15:06
感谢分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2021-1-20 18:19

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表