日常破解--从XCTF的app3题目简单了解安卓备份文件以及sqliteCipher加密数据库
一、题目来源
题目来源:XCTF app3题目
二、解题过程
1、下载好题目,下载完后发现是.ab后缀名的文件,如下图所示:

2、什么是.ab文件?.ab后缀名的文件是Android系统的备份文件格式,它分为加密和未加密两种类型,.ab文件的前24个字节是类似文件头的东西,如果是加密的,在前24个字节中会有AES-256的标志,如果未加密,则在前24个字节中会有none的标志,如下图所示:

3、怎么获取.ab文件中的数据?在github上有个开源项目Android backup extractor可以将.ab文件转换为.tar文件,然后用解压软件打开即可!!!项目地址:https://github.com/nelenkov/android-backup-extractor

4、使用ade.jar将1.ab文件转为tar文件解压发现有一个apk文件和两个sqlite数据库文件,将apk安装到夜神中,发现没什么有用的东西,去查看数据库,直接使用sqlitebrowser打开,提示需要密码,看来数据库多半被加密了,如下图所示:





5、直接使用AndroidKiller和jeb将该APK反编译,发现了存在asset目录和libs目录,并且这两个目录下存放了和sqlitecipher相关的文件,可以推断数据库被sqlitecipher加密了,再搜索一下在夜神里点击登陆后弹出的信息Wait ....,发现该信息在AnotherActivity.java文件中,转为java后,发现没什么有用的信息。。。


6、于是打开MainActivity.java文件,果然发现了一个函数a(),代码如下:
private void a() {
SQLiteDatabase.loadLibs(((Context)this));
this.b = new a(((Context)this), "Demo.db", null, 1);
ContentValues v0 = new ContentValues();
v0.put("name", "Stranger");
v0.put("password", Integer.valueOf(123456));
com.example.yaphetshan.tencentwelcome.a.a v1 = new com.example.yaphetshan.tencentwelcome.a.a();
String v2 = v1.a(v0.getAsString("name"), v0.getAsString("password"));
this.a = this.b.getWritableDatabase(v1.a(v2 + v1.b(v2, v0.getAsString("password"))).substring(0, 7));
this.a.insert("TencentMicrMsg", null, v0);
}
- 第一行
SQLiteDatabase.loadLibs(((Context)this));将所需要的sqlitecipher库文件加载进来。 - 第二行实例化一个sqlitehelper类。
- 第三、四、五行实例化了一个ContentValues类并将键值对
name:Stranger、password:123456放入其中。 - 第六行实例化了一个
com.example.yaphetshan.tencentwelcome.a.a类。 - 第七行获取了v2变量的值。
- 第八行调用了
getWritableDatabase函数,传进去的字符串参数即是数据库解密的密钥。
7、现在目标已经很明确了,就是获取数据库解密密钥(猜一下flag就藏在加密的sqlite数据库中),而该密钥由com.example.yaphetshan.tencentwelcome.a.a里面的方法生成,而这个类又调用了b.java里面的方法,如图所示:



8、a、b类里面生成密钥的算法涉及到了sha-1、md5等算法,没必要去重新写一编,搞清楚密钥生成逻辑然后把b类里面的两个函数复制出来调用即可生成密钥,简单分析一下密钥生成逻辑:首先得到变量v2,v2调用了a类中的a(String,String)方法获取,该方法返回第一个参数前四个字符加第二个参数的前四个字符,而调用该方法传进去的参数为(Stranger,123456),所以v2 = Stra1234,密钥为v1.a(String).sunstring()(调用v1.a()方法然后将返回值截取前7位作为密钥),关键就在传进去的这个字符串,可以看到这个字符串是v2 + v1.b(v2,'123456'),而v1.b(String,String)这个函数将调用了b类的a(String)函数,传进去的参数是变量v2,获取到返回值后,我们就可以得到这个字符串,然后调用v1.a(String)函数得到密钥,这个函数将传进去的字符串加上yaphetshan字符串作为参数调用b类的b方法,其返回值取前7位即是密钥,写了一个java获取密钥的代码,运行结果如下(ps:代码粘贴在文末中):


9、获取到密钥后,使用sqlitebrowser打开加密数据库,发现了一串Base64的字符串,解码得到了flag

三、总结
刚下载下来题目发现一看后缀名就慌了,重来没见过的文件了,百度了n久,终于弄懂了android备份文件和ssqlitecipher这两个东西。
给大家分享一下有关这两个东西的知识点我觉得写的比较好的博客!!!
- Android备份文件:https://blog.csdn.net/qq_33356474/article/details/92188491
- SqliteCipher:https://www.cnblogs.com/android100/p/Android-SQLCipher.html
四、附件
题目以及所用到的工具:百度网盘链接https://pan.baidu.com/s/1Wam_Hjg8rNlpqywVqqASpQ,密码0y89
获取密钥java代码如下:
import java.security.MessageDigest;
import java.util.*;
public class b {
public b() {
super();
}
public static void main(String[] args)
{
String varV2 = "Stra1234";
String varV1B = a(varV2);
String varKey = varV2 + varV1B + "yaphetshan";
System.out.print("KEY = ");
System.out.print(b(varKey).substring(0,7));
}
public static final String a(String arg9) {
String v0_2;
int v0 = 0;
char[] v2 = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
try {
byte[] v1 = arg9.getBytes();
MessageDigest v3 = MessageDigest.getInstance("MD5");
v3.update(v1);
byte[] v3_1 = v3.digest();
int v4 = v3_1.length;
char[] v5 = new char[v4 * 2];
int v1_1 = 0;
while(v0 < v4) {
int v6 = v3_1[v0];
int v7 = v1_1 + 1;
v5[v1_1] = v2[v6 >>> 4 & 15];
v1_1 = v7 + 1;
v5[v7] = v2[v6 & 15];
++v0;
}
v0_2 = new String(v5);
}
catch(Exception v0_1) {
v0_2 = null;
}
return v0_2;
}
public static final String b(String arg9) {
String v0_2;
int v0 = 0;
char[] v2 = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
try {
byte[] v1 = arg9.getBytes();
MessageDigest v3 = MessageDigest.getInstance("SHA-1");
v3.update(v1);
byte[] v3_1 = v3.digest();
int v4 = v3_1.length;
char[] v5 = new char[v4 * 2];
int v1_1 = 0;
while(v0 < v4) {
int v6 = v3_1[v0];
int v7 = v1_1 + 1;
v5[v1_1] = v2[v6 >>> 4 & 15];
v1_1 = v7 + 1;
v5[v7] = v2[v6 & 15];
++v0;
}
v0_2 = new String(v5);
}
catch(Exception v0_1) {
v0_2 = null;
}
return v0_2;
}
}
日常破解--从XCTF的app3题目简单了解安卓备份文件以及sqliteCipher加密数据库的更多相关文章
- 日常破解---XCTF_APP1获取flag记录
日常破解---XCTF_APP1获取flag记录 一.题目来源 来源:XCTF社区安卓题目app1 二.解题记录 1.首先安装到模拟器中运行一下,如下图所示,点击一下按钮,弹出提示年轻人不 ...
- 超简单使用批处理(batch)操作数据库
超简单使用批处理(batch)操作数据库 批处理(batch)是什么 批处理的执行就好比快递员的工作: 未使用批处理的时候,快递员一次从分发点将一件快递发给客户: 使用批处理,则是快递员将所有要派送的 ...
- 简单的PL/SQl链接远程ORACLE数据库方法
简单的PL/SQl链接远程ORACLE数据库方法 PLSQL Developer新手使用教程 pasting
- 日常破解--XCTF easy_apk
一.题目来源 来源:XCTF社区安卓题目easy_apk 二.破解思路 1.首先运行一下给的apk,发现就一个输入框和一个按钮,随便点击一下,发现弹出Toast验证失败.如下图所示: ...
- 分享几个日常调试方法让js调试更简单
下面分享几个日常调试代码的时候在Console命令行显示你的操作,让你的js调试更简单. console显示信息的命令 在浏览器按f12在console上显示你的文本. <!DOCTYPE ht ...
- xctf的一道题目(77777)
这次比赛我没有参加,这是结束之后才做的题目 题目链接http://47.97.168.223:23333 根据题目信息,我们要update那个points值,那就是有很大可能这道题目是一个sql注入的 ...
- 第一天的题目 简单A+B 植树问题 多项式的值
#include<stdio.h> int main() { int a=0;b=0; scanf("%d%d",&a,&b); printf(&quo ...
- cdoj 题目简单分类
如有错误请联系我,下面题的题解,除了傻逼题均可以在我blog中查找 1 傻逼题 3 傻逼题 4 傻逼题 15 dfs 24 傻逼题 25傻逼题 26 傻逼题 30 flyod 31 01背包 42 k ...
- 超简单,安卓模拟器手动root
本文转载自:http://quantoubao.blog.163.com/blog/static/2083211702013870501987/ 安装Android SDK安卓模拟器的方法很简单,网上 ...
随机推荐
- 2)PHP代码运行过程
https://zhidao.baidu.com/question/544575728.html
- [Python] 使用Python 3 下载麦子学院视频
本文基于Python 3,下载麦子学院的视频课程. 本项目只是针对某个具体课程的链接,去寻找该课程所有课时的视频链接并进行下载. 整个项目是非常简单的. 主要涉及的Python: 网络相关:reque ...
- HDU1166 敌兵布阵 [线段树模板]
题意:在序列中修改单点和查询区间和 #include<iostream> #include<cstdio> #include<cstring> #define ls ...
- python去除列表中重复元素的方法
列表中元素位置的索引用的是L.index 本文实例讲述了Python去除列表中重复元素的方法.分享给大家供大家参考.具体如下: 比较容易记忆的是用内置的set 1 2 3 l1 = ['b','c', ...
- [LC] 215. Kth Largest Element in an Array
Find the kth largest element in an unsorted array. Note that it is the kth largest element in the so ...
- 推送至远程仓库使用git push -u的原因
第一次把本地仓库推送至远端时,为了以后方便一定要使用 git push -u origin master [此处是把本地的master分支推送至远程的master分支]
- 吴裕雄--天生自然Android开发学习:魅蓝3开启USB调试
打开手机点击:设置 选择:关于手机 在详情里面找到:版本号,然后不断地点击那个版本号. 然后返回一步 再选择设置里面的:辅助功能 再选择辅助功能里面的:开发者选项 进入开发者选项后,选择打开两项:一是 ...
- JS调用免费接口根据ip查询位置
免费接口如下: 新浪的IP地址查询接口:http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js 新浪多地域测试方法:http://in ...
- .net和JAVA面向对象,继承有趣的细节
原型是同事间讨论的一道面试题.估计这题秒杀了不少人,LZ也被秒了. 但这个题里隐藏了一个很有趣的细节,这个细节不说清楚,不少人会其实死的冤枉. 这是C#的代码. class Program { sta ...
- unittest(8)- 学习ddt
import unittest from ddt import ddt, data, unpack """ 1.正常情况下,测试函数(即测试用例)中不可以传参,如果要使用 ...