顶风能尿三丈远 发表于 2020-12-31 09:24

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


下载附件,使用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 代码
var flag = false;
           
           
            imports = Module.enumerateImportsSync("libmyjni.so");
             for(var i=0;i<imports.length;i++){
                     
                      console.log(imports.name);
                     if(imports.name =="fputs")
                     {
                              console.log(imports.name);
                              console.log(imports.address);
                              targetfunc = imports.address;
                              break;
                     }
                

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

                                           var data = Memory.readCString(args);
                                           //console.log(data);
                                           if(data == "D")
                                                   {
                                                   flag = true;
                                                   console.log("[+]Found: "+Memory.readUtf8String(args));
                                                  
                                                   }
                          
                                          
                           }
                                  
                   });
                  }
             
             
             
           
           
            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);
                                                if(flag)
                                                {
                                                console.log("[+]Found dict : "+dict);
                                                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+dict+dict);
                                                if(flag)
                                                {
                                                console.log("[+]Found dict : "+dict+dict+dict);
                                                return;
                                                }
                                               
   
                                        }
                                       
                        }
                }
      




changfuwu123 发表于 2022-10-16 15:23

大神,9月6号下午我在京东拍拍被骗了钱(华中师范大一一年所有费用(生活费,学费,杂费,学分费,其它费)(22990元)父母要我自己还学费。呜呜呜呜呜呜呜呜。
我已经报警了,但是别人刑警都帮查到6级了,大同刑警四队6号说帮我立案了,骗我立了,删了我的报警记录,不笔录,半个小时内钱在了,让冻结一直不冻。我被骗后1,2分钟就打电话了。连续打了1个小时,电话也不接,1个刑警在打游戏,另1个在玩抖音。
然后15号我就去了,一开始装不认识我,说我没来过大同刑警四队,因为我记得人长什么样子才承认来过。宁和我聊3个小时,拖到9月23号后,又和我说,还得10来天。我向110催促了,也不能算是举报。免强给个授案回执单。反正也不查案。拖到现在。
骗子平台虚拟银行账号我有(他把钱转给别人的卡了)
买上的QQ号,微信号,就买上2或3天最多10天就还给号主了。
①骗子QQ号:1953691864
②京东号jd_KyLzAo9hJuEq
③中国建设银行高飞柱 6217 0029 2015 1401 636
(好像这3个号的使用者是同一个人身份。下面这个人他就是收集卡,给犯罪团伙卖的。他不加陌生人。
卖卡号人Vx号:zhenxuan1315。
一开始的时候就查了这个QQ(注册地云南,[流泪][流泪][流泪]“登陆地是缅北”存在争议[流泪][流泪][流泪]
这个人的真实ip地址,他用的服务器没有查清。(国内外),登陆地并不一定是在缅北。现在已经还给原来的主人。怎么查代{过}{滤}理器,真实ip。[流泪][流泪][流泪][流泪][流泪]
怎么通过卖卡人,找到6号登陆这个QQ号真实的骗子下的那些受害人们(就是骗我的这个骗子同时骗的受害人们)。我好全国联名投诉。[流泪][流泪][流泪][流泪][流泪][流泪][流泪][流泪][流泪][流泪]


HNHuangJingYU 发表于 2021-9-18 22:22

顶风能尿三丈远 发表于 2021-1-4 09:36
应该要不了多久,我是2018年接触Android的,中间断断续续的,没有花太多时间,还是比较容易上手的

我学几个月了,中间也是断断续续,现在勉强能做些ctf题,高级逆向题看都看不懂

pjchangew 发表于 2020-12-31 11:39

看看, 谢谢分享!

lifz888 发表于 2020-12-31 11:53

不错的分析,支持分享

keny 发表于 2020-12-31 11:57

不错的分析,支持分享

你心动什么 发表于 2020-12-31 11:59

很好的解题思路啊

小羽0101 发表于 2020-12-31 13:12

分析得不错。

qixiyun 发表于 2020-12-31 13:48

精彩!!!!

BZF187577 发表于 2020-12-31 13:51

嗯,很厉害很精彩,请问这么厉害,我可以学会吗

isroot 发表于 2020-12-31 14:10

学学一波,感谢分享

QRQ 发表于 2020-12-31 15:06

感谢分享
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 攻防世界Mobile-黑客精神解题思路分享