这一题的样本不再是前两题的apk文件了,而是ab类型文件,这是什么啊,因为不知道所以去百度一下,原来是 Backup Files
那么如何打开呢,在GitHub上下载abe.jar https://github.com/nelenkov/android-backup-extractor/releases/tag/master-20220409062712-07bb660
然后adb unpack xxxx.ab backup.tar 就会在当前位置生成一个tar文件,继续将其解压
你会发现里面有base.apk和demo.db、Encryto.db三个文件,这个加密的数据库一定就是本题破解的关键,用SQLite软件直接打开db文件也打不开,肯定是需要密钥的。
还是常规操作,先用jadx-gui打开apk
由于这个apk在模拟器或者在真机上都打不开,出现闪退的现象,所以没办法进行动态调试,不然会简单许多,直接frIDA hook 关键参数就能得到flag
所以我们一点一点进行分析
首先看到onCreat函数里面,对一些参数进行了赋值,然后调用了a()函数,再继续看a函数,一二行是在创建Demo.db数据库文件,然后name和password这俩数进行赋值,再创建了一个a类的对象 aVar, 然后对这个对象进行了a方法的调用
通过查看a类里面的代码,这个a方法也就是截断数据前四个并拼接,也就是说a2就是Stra1234
然后通过getWritableDatabase进行加载数据,后面的参数也就是带的密钥
在net.sqlcipher.database.SQLiteOpenHelper类下也能看到对这个方法的一些自定义
现在已经知道了flag是从哪里获取的,就可以自己新建工程文件,进行仿制操作
密钥就是ae56f99
然后通过DB Browser for SQLite软件打开加密的数据库
对其进行base64解密,得到 Tctf{H3ll0_Do_Y0u_Lov3_Tenc3nt!}
哦吼,腾讯出品,必为。。
如果这个apk可以运行,就直接hook getWriteDatabase
[JavaScript] 纯文本查看 复制代码 function hook_getWritableDatabase(){
Java.perform(function(){
Java.use("net.sqlcipher.database.SQLiteOpenHelper").getWritableDatabase.overload('java.lang.String').implementation=function (str){
var result=this.getWritableDatabase(str);
console.log("[+]getWritableDatabase:"+str);
return result;
}
})
}
setlmmediate(hook_getWritableDatabase)
也可以通过打印在smali代码中插入log日志的方式获取密钥
const-string v4, "flag"
invoke-static {v4, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I
方法很多,看懂代码最重要,像这题a类b类a参数b参数各种字母太多了,很容易不理解程序到底哪个对应哪个,还是要加强代码分析能力才行。
这一题太大,就不上传附件了。
|