2025数字中国创新大赛-移动互联网(APP)安全积分争夺赛初赛 Writeup
shenren CTF 454浏览 · 2025-03-30 16:28

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

数据加密

ezenc

通用算法最好识别了,真的是这样吗?

验证逻辑在 so 中:

图片加载失败


加密关键逻辑位于 sub_18C0 函数中,简单分析可知是 DFT 变换,提取实部与虚部的对应数据进行逆 DFT 变换即可:

图片加载失败


magic

magic

关键验证逻辑仍然在 so 中:

图片加载失败


关键加密逻辑在 encrypt 函数中:

图片加载失败


可以看到是一个简单的 AES 加密,但是使用的并不是标准的 S 盒:

图片加载失败


从流量包中提取 key 后使用新的 S 盒即可解密:

babyapk

简单的安卓逆向

关键逻辑还是在 so 中:

图片加载失败


so 中就是简单的异或加密:

图片加载失败


但需要注意在 init_array 中会调用 hide_key 函数对 key 进行修改,解密脚本如下:

逆向工程

GoodLuck

一个简单的算法逆向 flag格式:flag{youget}

com.ctf.goodluck0.MainActivity#check 看到如下代码:

图片加载失败


md5,cmd5 查询:

图片加载失败


flag: flag{r9d3jv4}

偷天换日

一个算法逆向

验证逻辑在 so 中:

图片加载失败


JNI_Onload 会调用 sub_DD38,这个函数中会对 assets/cc.dat 进行 rc4 解密后得到一个 dex:

图片加载失败


图片加载失败


里面是个简单的 base58 编码:

图片加载失败


图片加载失败


flag: flag{j#n$j@m^,*4}

IOSApp

安全审计员审查发现revealFlag函数比较可疑,请分析代码,帮她找到与之相关的flag

ida 逆向 swift,在 strings 中看到两段可疑字符串

跟进 base64 可以看到逻辑是拼接一个 base64

图片加载失败


结果为 ZmxhZ3tvbGRlc3RfdHJpY2tfaW5fdGhlX2Jvb2tzfQ==,解密后为 flag{oldest_trick_in_the_books},假 flag

跟进第二个可以字符串可以进入到 obfuscatedFlag 的初始化函数:

图片加载失败


在 revealflag 函数中看到在 map 中使用闭包函数对 obfuscatedFlag 进行了操作:

图片加载失败


闭包函数取一位 char 并且对其进行-1运算,可以知道是将 obfuscatedFlag 逐字符-1

WASMSAW

flag提交格式:flag{youget}

首先可以看到运行了一段 lua 字节码:

图片加载失败


简单反编译可以看到是在加载一个 dex:

图片加载失败


dex 中将 key 进行了替换:

图片加载失败


关键的验证逻辑在 so 层中:

图片加载失败


so 层可以看出是在加载 wasm 执行,执行的 wasm 文件位于 assets/lib_wasm.wasm,反编译一下可以看到具体逻辑:

图片加载失败


图片加载失败


第一部分简单分析可以知道是 rc4 算法,第二部分是在加载密文,解密即可:

图片加载失败


flag: flag{4e574fa93be5e847453f6871115e2c08}

通信安全

这个木马在干啥

这是个恶意木马样本,前面抓了个数据包,现在发现app服务器无法访问了,请你看看木马在干啥?

关键逻辑位于 so 层中:

图片加载失败


解密逻辑在 sub_1122C 函数中:

图片加载失败


简单进行 AES 解密,key 需要进行一些异或计算后可以得到,然后进行解密即可:

图片加载失败


我的传输安全吗?

小明是个技术宅男,今年大年30还在让测试同学开启测试服务器,完成公司风控sdk功能的测试。看了一会春晚,小明觉得没意思,就去测试了,测试过程中在路由器上抓到了一些报文数据,因为看不懂内容,就先保存成了bin文件,你能帮忙看看嘛?

用时间戳做种子构建随机密钥的 rc4

图片加载失败


图片加载失败


题目描述里说在今年春晚期间,用春晚期间的时间戳进行爆破

安卓下编译运行:

图片加载失败


flag: flag{ik*klme#$0}

malapp

小明给手机中一个未知APP授予了读写文件的权限,过了几天小明所在公司的重要文档泄露了,防火墙检测到小明手机有可疑流量产生,安全部门找到小明并分析该APP。

说明文档:

service文件夹里面的是题目运行的所需的间谍软件服务端 解题者需要运行服务端,App输入以下格式的URL http://服务端IP:9701 点击launch执行间谍功能 注:题目提供的服务端里没有解密函数

首先看 apk,主要逻辑就是运行一个 native 函数:

图片加载失败


反编译 so,首先根据 execJS 可以定位到函数:

图片加载失败


这里做了一个 xor 的操作,结合流量包中的第一段数据可以进行解密:

图片加载失败


可以看到有一个 encryption.my_encryption 函数,大概率就是自己注册到 v8 中的函数,需要找到其实现的逻辑,根据字符串定位可以找到其注册的函数 JsExecutor::SetupEncryption,同时字符串查找 encrypt 等关键字发现存在 RSA 加密函数,通过引用查找成功定位到注册的 Handler:

图片加载失败


逆向 rsa_encrypt 函数逻辑,可以在其中找到加载模数并加密的逻辑:

图片加载失败


提取模数简单分解后取指数为 0x10001 解密即可:

flag: flag{V8_Js_engin3_i5_Awes0m3!}

MedSecureAdmin

一个http服务和加密系统组成,尝试破解该系统就可获取flag。

首先在 Java 层对 username 有校验:

图片加载失败


通过一下代码解密:

username 为 @dm1n234 ,在 so 层存在对 password 的校验:

图片加载失败


sub_ADC 是一个魔改的 DES,对其中 S 盒替换的一些字节做了变换,照着代码逻辑扒下来替换后解密即可(DES 的 key 就是 username):

解密得到 password 为 93b4001b2418fd2398ab73e51fc44968

完成登陆后会开启一个 DashboardActivity,并将 usernamepassword 传给这个 intent,对 DashboardActivity 逆向可以发现,其核心逻辑是开启一个 NanoHTTPD 的服务,并对一个加密字符串进行解密后作为 HTTP 的内容返回。

其解密的逻辑是使用 username||password 的 MD5 哈希前半部分和后半部分分别作为 DES 的密钥与 IV 进行解密。我们这里直接进行解密即可:

图片加载失败


flag: flag{9d0e920a115102a8f33247e125}

隐私合规

Privacy Master(1)

在用户同意隐私政策前APP请求了什么信息,按照请求先后顺序回答,英文逗号分隔,回答内容为 android.permission.xxxx 后面的xxxx 大写回答(以安卓11参考回答,请注意提交次数限制

根据 mainfest 找到主函数,可以看到在同意隐私政策(PRIVACY_POLICY_AGREED)前调用了checkAndRequestPermissions函数:

图片加载失败


进入查看,可以看到依次了 READ_PHONE_STATE,ACCESS_FINE_LOCATION:

图片加载失败


故答案为 READ_PHONE_STATE,ACCESS_FINE_LOCATION

Harmony

鸿蒙开发人员由于开发疏忽,不正确的使用了危险函数,导致用户凭证泄露,找出关键点,按程序提示提交答案

可以看到主逻辑是比较 md5 值:

图片加载失败


com.hmos.exam1/entry/ets/pages.Index#aboutToAppear 中可以看到给 storedHash 的赋值语句,并且通过创建对象从系统资源管理器中获取一个文件:

图片加载失败


在解压的文件包中看到 resources.index 文件,存有一个 secret 字段:

图片加载失败


cmd5 查询:

图片加载失败


flag 为 Flag{md5(goodgood16f85293e920fd49eda6bf0df98bfd33)}Flag{ee51e080d1db85f9927fe87aa92267bb}

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