安卓利用
利用 apktool 解包
apktool d xxx.apk
利用 d2j-dex2jar 反编译
d2j-dex2jar classes.dex
利用 jd-gui.jar 查看伪代码
java -jar jd-gui-1.6.6.jar
利用 jadx-gui 查看伪代码
https://github.com/skylot/jadx
可以在直接加载 apk 文件
1 | git clone https://github.com/skylot/jadx.git |
ab包解压 jar 包下载地址
java -jar abe-all.jar unpack app3.ab app3.rar
https://github.com/nelenkov/android-backup-extractor/releases
app2
页面展示
利用 jd-gui.jar 查看伪代码
查看 MainActivity
读取我们的输入。
分别保存到
并传入 secondActivity 中。
跟进 secondActivity
传入的字符串相加 然后利用函数 Encryto.doRawData
计算后 与字符串 VEIzd/V2UPYNdn/bxH3Xig==
进行比较。
然后发现 Encryto.doRawData
函数是native 层的
所有我们 要去 利用 ida 反编译 lib 文件夹下的 so文件进行分析。
找到 doRaData 函数
发现是 AES 128 ECB PKCS5Padding 加密
查看函数,发现
加密后 进行了 base64 加密然后返回值。
这个时候我们已经得到了 秘钥 thisisatestkey==
然后得到了 比较字符串 VEIzd/V2UPYNdn/bxH3Xig==
1 | #coding:utf-8 |
解密得到的值为 aimagetencent
发现答案不对
在 反编译的 代码中另一个类找到 可能的字符串
9YuQ2dk8CSaCe7DTAmaqAA==
利用这个解密
1 | #coding:utf-8 |
结果
Cas3_0f_A_CAK3
app3
题目给了一个 ab 文件
我们需要利用 abe.jar 进行解包
java -jar abe-all.jar unpack app3.ab app3.rar
解包后得到
然后看看这个 base.apk 是干什么的
修改后缀为 zip 解压
然后利用
d2j-dex2jar classes.dex
反编译 利用 jd-gui
查看代码
查看 MainActivity.class
onCreate 会调用 a 函数。
a 函数是一个 数据库连接的
连接的 是 Demo.db 数据库
然后里面会实例化 a 类
跟进 发现里面在创建的时候 调用了 create table TencentMicrMsg(name text,password integer,F_l_a_g text)
接着回到 MainActivity.class
发现 有实例化了一个 a 对象 跟进
会创建一个新的类b
这个类 jd-gui 不能很好的反编译
所以我们换用 jadx 进行反编译
反编译得到的 伪代码就会清楚很多
Class a
Class b
主要更具 MainActivity 的方法来了解加密算法。
1 | contentValues.put("name", "Stranger"); |
String a2 = aVar.a(contentValues.getAsString("name"), contentValues.getAsString("password"));
发现首先 传入 "Stranger"
字符串 "123456"
密码进行拼接 成为 "Stra1234"
this.b.getWritableDatabase(aVar.a(a2 + aVar.b(a2, contentValues.getAsString("password"))).substring(0, 7));
然后 a.b 实际调用 b.a("Stra1234")
这样的方法
1 | public String b(String str, String str2) { |
然后创建调用 b类的 a方法
调用 MD5 然后进行位移操作 应该是一个 base16 的变形
1 | public static final String a(String str) { |
接着 a.a 方法 实际调用 b.b(("Stra1234"+a("Stra1234"))+"yaphetshan")
1 | private String a = "yaphetshan"; |
b.b 的方法为
进行 SHA-1 方法加密 然后也是进行了 base16 操作
1 | public static final String b(String str) { |
然后只取 0-7
因为是Java 代码我们可以直接复制调用得到密码。
exp
1 | package com.company; |
解密后 ae56f99
然后连接 Encryto.db 数据库 密码学 ae56f99
返现 F_l_a_g
VGN0ZntIM2xsMF9Eb19ZMHVfTG92M19UZW5jM250IX0=
常识base64 解密
Tctf{H3ll0_Do_Y0u_Lov3_Tenc3nt!}
easy-apk
改为zip 解压
反编译 dex 文件
Jd-gui 查看反编译
MainActivity.class
发现我们的输入。进行 base64 操作等于一个值
然后查看 base64 加密
发现是一个 变表的 Base64 加密
exp
1 | # -*- coding: UTF-8 -*- |
解密
所以 flag = flag{05397c42f9b6da593a3644162d36eb01}
easyjava
这道题利用 jadx-gui 反编译 apk\
MainActivity.class
看看程序运行逻辑 需要输入 flag 所以传入的值 就是我们的 输入
会调用 MainActivity 的 b方法进行操作
1 | public static Boolean b(String str) { |
判断开始是不是 flag{ 结束是不是 }
取括号里面的值
创建 b 实例和 a实例 这个实例我们可以发复制代码直接实现
b(2)
1 | package com.a.easyjava; |
a(3)
1 | package com.a.easyjava; |
- 接着调用
a(substring.charAt(i2) + "", bVar, aVar)
1 | private static char a(String str, b bVar, a aVar) { |
调用过程函数依次为
1 | bvar.a |