恶心死我了,这题真恶心到我了,要说难吧,也不难,逻辑清晰条理清楚,用了半个小时不到就拿到了密码,但是!说好的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 解压,找到了我们想要的东西 <ignore_js_op> 在a目录下有个apk,先跑模拟器 <ignore_js_op> 后来测试了一下,不管输入什么都是这个界面,我的第一想法还是估计就是找账号密码然后得到flag。但是!我是万万没想到当我看到java的时候会是这个样子: <ignore_js_op> 好,牛逼,高还是你高,用了Intent传了两个参过来,竟然啥都没干,就是让他弹了个窗
行吧,出题人大于一切,那就看看他干啥了吧 <ignore_js_op> 乍一看没啥意义,但是这里说了几个挺重要的信息的,翻译一下: “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() <ignore_js_op> ContentValues是一种数据结构,再看看这个Demo.db,那估计就是一个数据库了,name和password是列名,Stranger和123456就是值了,那后面那一片啥意思呢,不明白,看看这个数据库怎么创建的吧 <ignore_js_op> 看到这亲切的SQL语句,再看看这亲切的Flag,爱了爱了,这时候我感觉我离胜利只差一步之遥了 那就仔细得看看后面的内容,但是!当我仔细看了两次调用之后,我放弃了 <ignore_js_op> 看看这一长串的字符操作,打扰了,反正在主活动里边还要拿出来用,那就插Log呗,我之后再找数据库加密的时候看了不少WP,好像大家都热衷于重写加密函数,但是能插LOG岂不美哉 <ignore_js_op> 在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啊,没事,死马当活马医,提交试试——>失败 emmmmmmmmmm 好的,让我们重新开始,首先排除法,我们这得到的东西没用 那既然有用那是啥用,然后我目光回到了最开始在create里边的三行东西的核心,即“SqlCipher” 然后经过了一系列查询,我得到了我之前写的那些结论
然后cmd,开始破解数据库,当然我还经历了尝试Demo.db,毕竟题目里给的是这个,但是我是万万没想到他用的是包目录下的Encryto.db文件 <ignore_js_op> 命令: 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路径下就能看到想要的东西啦 <ignore_js_op> 然后用SQLite Exper打开就好了,他已经没加密了 <ignore_js_op> 你说这个Stranger和123456都和刚刚一样为啥不也就直接把flag放那呢,也省了这么多事不是吗,哦,这还不是最后一步啊,那没事了 最后点开F_l_a_g的内容,一看最后的=号,不BB,base64警告,不知道base64的我之前也写过,也链接在那了,个人觉得还是挺好理解的hhh,网上随便找个在线解密就好了 <ignore_js_op> 结束(出题人是腾讯的嘛,看到了一堆Tencet***) emmmmmm第一次在论坛发帖,我也在论坛看到了windy_ll师傅的做法,不过思路不一样倒也不是撞了,而且windy_ll师傅竟然能直接打开SqlCipher加密的数据库,估计是加了些东西或者省略了解密步骤,我的这些应该对于纯小白还是有些借鉴作用的。不太熟悉论坛的发帖,图片可以不太正常,大家凑活看。中间AK日志的图片是我从我的博客直接贴地址过来的,要是还有不懂的地方我再修改吧。。。