XCTF 攻防世界 app3—Moblie新手区

写在前面

  恶心死我了,这题真恶心到我了,要说难吧,也不难,逻辑清晰条理清楚,用了半个小时不到就拿到了密码,但是!说好的Demo.db怎么就变成了Encryto了

正式

  开门见山得说,这个.ab文件是第一次见,不过随便搜一下就懂了:https://blog.csdn.net/qq_33356474/article/details/92188491

  然后就是要把ab文件转换为tar或者rar的压缩格式,命令就是:java -jar abe.jar "******/app3.ab" app3.tar,顺带放上abe下载地址,不用纠结abe和abe-all有啥区别,实测一样:https://github.com/nelenkov/android-backup-extractor/releases

  解压,找到了我们想要的东西

  

  在a目录下有个apk,先跑模拟器

  

  后来测试了一下,不管输入什么都是这个界面,我的第一想法还是估计就是找账号密码然后得到flag。但是!我是万万没想到当我看到java的时候会是这个样子:

  

  好,牛逼,高还是你高,用了Intent传了两个参过来,竟然啥都没干,就是让他弹了个窗

   

  

  行吧,出题人大于一切,那就看看他干啥了吧

   

   乍一看没啥意义,但是这里说了几个挺重要的信息的,翻译一下:

  “Is_Encroty----1”:  加密了

  “Encryto----SqlCipher”:  用的Sqlcioher加得密

  “ver_sion----3_4_0”:  SqlCipher的版本是3.4.0

  

   这里得再说说SqlCipher,做了7个小时的题,半个小时找密匙,五个小时上网课,别的时间都被这东西恶心到了

  说是不可能说的,看别人的博客吧:https://blog.csdn.net/jiyafeng/article/details/89634681

  再注意Sqlcipher的下载地址,如果你用的是windows别下错了:https://github.com/CovenantEyes/sqlcipher-windows/releases

  之后要用到这个东西,就不再多说了,而且这里要用的是3.4.0的版本,这玩意不同版本之间加密还不一样的,注意版本,但是你如果下的是windows版本最高版本也就3.0.1,我实测也是可以解密出来的,但如果你在linux环境的话就要注意用3.4.0版本。

   

  好,回到java层,最后一行调用了a(),那就看a()

  

   ContentValues是一种数据结构,再看看这个Demo.db,那估计就是一个数据库了,name和password是列名,Stranger和123456就是值了,那后面那一片啥意思呢,不明白,看看这个数据库怎么创建的吧

  

  看到这亲切的SQL语句,再看看这亲切的Flag,爱了爱了,这时候我感觉我离胜利只差一步之遥了

     

  那就仔细得看看后面的内容,但是!当我仔细看了两次调用之后,我放弃了

  

   看看这一长串的字符操作,打扰了,反正在主活动里边还要拿出来用,那就插Log呗,我之后再找数据库加密的时候看了不少WP,好像大家都热衷于重写加密函数,但是能插LOG岂不美哉

  

   在substring函数后边插入我们想要的log,注意修改寄存器,如果你用v0,v1,v2,v5都会崩溃,因为后边调用了

    const-string v4, "flag"

    invoke-static {v4, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I

  

  在用AK自带的log查看,你们可以定位Tag的,不过我忘了

  

  呐,这就是我们想要的东西了,但是这玩意看着不像Flag啊,没事,死马当活马医,提交试试——>失败

  

  好的,重新开始,首先排除法,我们这得到的东西没用

  那既然有用那是啥用,然后我目光回到了最开始在create里边的三行东西的核心,即“SqlCipher”

  然后经过了一系列查询,我得到了我之前写的那些结论

  

  然后cmd,开始破解数据库,当然我还经历了尝试Demo.db,毕竟题目里给的是这个,但是我是万万没想到他用的是包目录下的Encryto.db文件

  

   命令:

      sqlcipher-shell64.exe encryto.db

      sqlite> PRAGMA key = ‘ae56f99’;
      sqlite> ATTACH DATABASE ‘app3_1.db’ AS plaintext KEY ‘’;
      sqlite> SELECT sqlcipher_export(‘plaintext’);
      sqlite> DETACH DATABASE plaintext;

  要cd进入到sqlcipher的bin目录,或者直接在那开powershell也是一样的,这应该不用多说,上面命令的encryto.db也只是我举的一个例子,真的自己做也要注意路径,可能我的截图更有参考性一些。

  然后在sqlcipher-shell64.exe路径下就能看到想要的东西啦

  

   然后用SQLite Exper打开就好了,他已经没加密了

  

  你说这个Stranger和123456都和刚刚一样为啥不也就直接把flag放那呢,也省了这么多事不是吗,哦,这还不是最后一步啊,那没事了

  

  最后点开F_l_a_g的内容,一看最后的=号,不BB,base64警告,不知道base64的我之前也写过,也链接在那了,个人觉得还是挺好理解的hhh,网上随便找个在线解密就好了

  

   结束(出题人是腾讯的嘛,看到了一堆Tencet***)

原文地址:https://www.cnblogs.com/CimeLi/p/12482773.html