app3
这道题比较综合,不是纯粹的算法题。
拿到题目,看到后缀是ab
,直接修改后缀apk或zip ,尝试打开失败。百度搜索一下怎么打开这个后缀文件。
需要特定的工具打开,在找找相关的资料浅谈安卓系统备份文件ab格式解析,找到关于ab文件的介绍和打开工具。如果不想了解可以直接下载abe。
命令:
java -jar abe.jar unpack 399649a0e89b46309dd5ae78ff96917a.ab 399649a0e89b46309dd5ae78ff96917a.tar
解开后大致浏览一下目录,a目录下是apk文件,db目录下是个数据库文件,还有Encryto.db 那么这里很大可能就是要查看加密的db文件,
使用jadx-gui 反编译源码,查看逻辑。
类 a: 创建一个table,看到第三个字段存在flag字样,那么印证了刚刚的猜想。
类 AnotherActivity : 这个是安装apk后第一个界面,没有什么用。
类 MainActivity : 可以获取加密的数据库类型和版本 ,a() 方法向数据库中插入了一条数据。
百度了下getWritableDatabase
这个方法,这里需要一个DBConstants.DB_PWD,那么目标就明确了,解出传入的值就可以得到解密密码。
在这里插入图片描述
import java.security.MessageDigest;
import java.util.Base64;
public class 攻防世界_mobile_easyapk {
public static void main(String[] args) {
a();
}
public static void a() {
// a2 是用户名Strange 和密码123456 分别前4位 然后做拼接。
String a2 = "Stra1234"; // 这里我解出后直接把结果给a2 了。
System.out.println(a2);
String b2 = (a(a2 + b(a2, "123456")).substring(0, 7));
System.out.println(b2);
}
public static String a(String str) {
str = str + "yaphetshan";
int i = 0;
char[] cArr = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
try {
byte[] bytes = str.getBytes();
MessageDigest instance = MessageDigest.getInstance("SHA-1");
return getString(i, cArr, bytes, instance);
} catch (Exception e) {
return null;
}
}
private static String getString(int i, char[] cArr, byte[] bytes, MessageDigest instance) {
instance.update(bytes);
byte[] digest = instance.digest();
int length = digest.length;
char[] cArr2 = new char[(length * 2)];
int i2 = 0;
while (i < length) {
byte b = digest[i];
int i3 = i2 + 1;
cArr2[i2] = cArr[(b >>> 4) & 15];
i2 = i3 + 1;
cArr2[i3] = cArr[b & 15];
i++;
}
return new String(cArr2);
}
public static String b(String str, String str2) {
int i = 0;
char[] cArr = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
try {
byte[] bytes = str.getBytes();
MessageDigest instance = MessageDigest.getInstance("MD5");
return getString(i, cArr, bytes, instance);
} catch (Exception e) {
return null;
}
}
}
搜索一下打开db文件的工具,我使用的是SQLiteStudio ,
然后找到F_l_a_g 字段,取出来做一次base64解密即可获得flag
想要获取第一资讯,欢迎大家关注我的公众号,一起交流