XCTF-app3 writeup
这一题的样本不再是前两题的apk文件了,而是ab类型文件,这是什么啊,因为不知道所以去百度一下,原来是Backup Files那么如何打开呢,在GitHub上下载abe.jarhttps://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
https://raw.githubusercontent.com/dummersoul/Picture/main/img/20220506151803.png
由于这个apk在模拟器或者在真机上都打不开,出现闪退的现象,所以没办法进行动态调试,不然会简单许多,直接frida hook 关键参数就能得到flag
所以我们一点一点进行分析
首先看到onCreat函数里面,对一些参数进行了赋值,然后调用了a()函数,再继续看a函数,一二行是在创建Demo.db数据库文件,然后name和password这俩数进行赋值,再创建了一个a类的对象 aVar, 然后对这个对象进行了a方法的调用
https://raw.githubusercontent.com/dummersoul/Picture/main/img/20220506152559.png
通过查看a类里面的代码,这个a方法也就是截断数据前四个并拼接,也就是说a2就是Stra1234
然后通过getWritableDatabase进行加载数据,后面的参数也就是带的密钥
在net.sqlcipher.database.SQLiteOpenHelper类下也能看到对这个方法的一些自定义
https://raw.githubusercontent.com/dummersoul/Picture/main/img/20220506154903.png
现在已经知道了flag是从哪里获取的,就可以自己新建工程文件,进行仿制操作
https://raw.githubusercontent.com/dummersoul/Picture/main/img/20220506154518.png
密钥就是ae56f99
然后通过DB Browser for SQLite软件打开加密的数据库
https://raw.githubusercontent.com/dummersoul/Picture/main/img/20220506154618.png
对其进行base64解密,得到 Tctf{H3ll0_Do_Y0u_Lov3_Tenc3nt!}
哦吼,腾讯出品,必为。。
如果这个apk可以运行,就直接hook getWriteDatabase
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)
https://raw.githubusercontent.com/dummersoul/Picture/main/img/20220506160706.png
也可以通过打印在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参数各种字母太多了,很容易不理解程序到底哪个对应哪个,还是要加强代码分析能力才行。
这一题太大,就不上传附件了。
学习学习 nb 啊支持楼主加油 支持楼主加油 末学敬仰 {:301_975:}{:301_1003:} 好就没来了,祝论坛越办越好
页:
[1]