2025数字中国创新大赛-移动互联网(APP)安全积分争夺赛决赛 Writeup
shenren CTF 242浏览 · 2025-04-21 15:41

2025数字中国创新大赛-移动互联网(APP)安全积分争夺赛决赛

crackme

定位到关键函数 verify_system_password

图片加载失败


可以看到这里使用了 CCCrypt 函数,该函数原型为:

其中一些相关的枚举量为:

可以看到这里就是在使用 AES 对数据进行加密,所以我们简单解密即可:

ezapk

开局一个流量包,里面可以提取出一个 APK,jadx 看看:

图片加载失败


验证逻辑在 so 中,看看 so 中的逻辑:

图片加载失败


比较容易看出这里是 RC4 的加密逻辑,同时初始化逻辑在上面:

图片加载失败


这里魔改的地方是初始化 S 数组是从 1 到 255 再到 0,所以根据魔改后的 RC4 可以解密:

但是发现这里长度与 apk 中要求的 31 并不符合,通过动调可以发现输入会进行处理,对连续的相同字符进行一个类似长度编码的操作,所以正确的 flag 应为 flag{aa_bbb_cccc_dddd_hahahaha}

Task_get_vip

首先通过入口点找到一段释放 dex 的逻辑:

图片加载失败


运行后可以在 /data/user/0/com.example.wyy/files/yongye.dex 找到释放的 dex,jadx 看看:

图片加载失败


com.example.wyy.ui.play.PlayFragment 找到验证的逻辑,使用 mp3 文件的 md5 的前 6 位作为密钥进行 rc4 解密即可:

taskDB

给了一个 apk 同时给了一个加密的 sqlite 数据库文件,需要逆向 apk 的内容来解密 sqlite 数据库文件。

简单观察可以发现使用的是 android-database-sqlcipher 这个组件对数据库进行加密,在 com.example.managepatients.utils.SecureDatabaseHelper 类中可以看到密码生成的逻辑:

图片加载失败


其实就是 APK 签名的 MD5 值:

图片加载失败


通过密码即可打开 SQLite 数据库文件:

图片加载失败


这里需要将用户的密码修改为其电话号码,所以还需要看看密码存储时的处理逻辑:

图片加载失败


直接抄代码配合数据库里面的数据进行计算即可:

taskdecode

运行后是一个查看天气的软件,定位到一个存在恶意行为的 service com.example.weather.util.SsService

图片加载失败


其中 dVar2.o(encrypt) 即在对外发送加密数据,加密中 encrypt 是在 native 层实现的,其他的过程都是在 Java 层实现的,先看看 native 层:

图片加载失败


容易看出来是经典的 RC4,但是其初始化过程有一些不一样:

图片加载失败


可以看到这个初始化 S 数组的过程进行了两次,并且 j 在计算时也加上了 S[j],这是 Native 层魔改的部分。

Java 层的加密实际上是魔改的 Chacha20,但是这个以及一些混淆的手段比较好解决,直接 Copy 代码运行即可,最后进行解密的脚本如下:

解密后得到的是一个 png:

图片加载失败


SignalScope

MainActivity 启动了一个 HttpServer:

图片加载失败


其处理逻辑如下:

图片加载失败


调用 Native 的 aaa 方法对 post 数据进行加密后对比,主要逻辑在 Native 层中,Native 层用了一堆 openssl 的接口,整的很复杂,通过动调和一些常量的识别大致还原了过程。

首先会在 Native 层调用 com.google.signalscope.SignalRadara 方法:

图片加载失败


在 Java 层看其实就是获取 APK 的签名:

图片加载失败


然后会对签名值分别进行两次 sha256 和 sha1 操作,并将其作为参数传入到 bn_prime.c 的接口中循环累加并判断是否为素数:

图片加载失败


其实上面看到素数相关的东西并且有两个数很容易想到 RSA,后面确实在做相关涉及到 bn_exp 的操作:

图片加载失败


所以前半部分是在做 RSA 的加密操作,p,q 是通过 APK 签名来 sha1 以及 sha256 得到的,后半部分如下:

图片加载失败


sub_139540 函数中比较明显是在获取结构体,看其中的函数指针很容易看出来是 AES 加密,传入的 key 和 iv 是对 p,q 进行 md5 得到的。

根据上述过程可以写出解密脚本:


0 条评论
某人
表情
可输入 255

没有评论