2025 ISCC练武区域赛、决赛RE+MOBILE 详解 合集
字数 2763 2025-08-29 22:41:10
ISCC 2025 练武区域赛与决赛逆向工程与移动安全题目详解
1. 数独与单词搜索题目
题目分析
- 程序要求输入一个9×9矩阵
- 通过两个检查函数:
checklist1和checklist2
解题步骤
checklist1函数:
- 类似数独验证,返回值需大于8
- 解决方案:输入有效的数独矩阵即可通过
checklist2函数:
- 在矩阵中搜索特定单词(八个方向)
- 需要找到超过4个指定单词
- 指定单词列表:
ilterupaseuapslirtrsptialuepalitresutrsupealiueialsrtplteruispasiulapteraprsetuil - 解决方案:使用z3约束求解器爆破
隐藏提示
- 程序输出假flag后会提示"True decode is in true_decode"
- 包含Motorola S-record格式数据(嵌入式固件常见格式)
处理S-record数据
- 将S-record记录转换为二进制文件
- 使用IDA分析二进制文件
- 发现假flag作为key,真实flag通过decode函数处理
最终flag
ISCC{T%uo4=WJfd0Due#qKmaIPfkiyp4UIX}
2. Rust循环移位题目
加密逻辑
- 对flag进行循环左移
- 每次循环左移的位数会变化
解题方法
- 动态调试观察v29值的变化规律(移位位数)
- 编写逆向脚本还原移位操作
最终flag
ISCC{8IRM6hA0gb}
3. 迷宫小游戏题目
题目特点
- 经典迷宫考点
- 玩家位置(C)随机生成
- 迷宫包含不可通行的区域
分析过程
- 使用IDA分析程序逻辑
- 重命名关键函数和变量
- 重点分析吃到金币后的操作(sub_41D580函数)
关键发现
- 读取txt文件(sub_40165D函数)
- 内存中存在未分析的数据,实际是XXTEA加密算法
- 在内存中可以找到加密密钥
解题方法
- 动态调试跟踪到加密过程
- 由于游戏结束条件未知,采用爆破方法
- 基于flag格式ISCC{}进行爆破
最终flag
ISCC{]aH_~=$a*j<.3hlcgeHE|+[Y}
4. 邦布出击(Blowfish加密)
Java层分析
- 检查flag格式(ISCC{})和长度(>7)
- 使用a类的a方法进行Blowfish加密
- 密钥来自b类的c方法(返回空导致程序闪退)
关键发现
- 数据库被加密(SQLCipher)
- 通过MainActivity2类发现数据库解密逻辑
- 找到base64编码的密钥(需三次解码)
获取密钥步骤
- 对info属性进行三次base64解码
- 获得密钥:
H4iJkLmNoPqRsTuV - 使用SQLCipher解密数据库
FRIDA脚本使用
- Hook encrypt方法(Blowfish加密结果作为DES密文)
- Hook b类的c方法返回正确密钥
- 输入测试数据触发获取flag
最终flag
ISCC{rR6ql9CGn0u/kBPZpMzCEKmQy0ZkdlNB}
5. Detective题目
Java层分析
- 启动页LoginActivity检查四位password(so层验证)
- MainActivity检查flag格式和长度
- a类的a方法进行加密后传给so层
加密流程
- b方法:字符转十六进制(不足三位补0)
- b类的a方法:
- 特定索引值增加字符'3'
- 按索引奇偶打乱顺序
- 特定值后追加"21"并颠倒顺序
- c方法:前面补"00"转回字符形式
so层分析
- validatePassword:计算sha256比较(可hook绕过)
- stringFromJNI:简单异或加密(已知key)
最终flag
ISCC{@@bM0r!y}
6. HolyGrail题目
Java层分析
- FlagValidationActivity检查flag格式
- a类的validateFlag方法:
- Vigenère加密
- so层processWithNative处理
- b类的a方法转换
关键发现
- 使用SharedPreferences存储数据
- 需要按正确顺序选择耶稣和十二门徒
- 顺序在mobile2的libSequence-Clues.so中
解题步骤
- 找到按钮与名字的对应关系(布局文件中)
- so层分析:十六进制转十进制再转十三进制
- 使用Frida hook validateFlag方法
- 建立字符与加密结果的对应关系
维吉尼亚解密
密文:Wvqh~0f5zke3va~
解密后:ISCC{Dome~0f5ecr3ts~}
7. 练武决赛CrackMe
花指令处理
- 识别并清除三种花指令
- 红色部分未定义,黑色部分nop
- 按C转换代码后nop两字节
加密逻辑
- 类似凯撒加密(对偶数位)
- 标准RC4加密(全部位)
- 真实密文在偶数位
解密方法
- 提取偶数位
- 逆向凯撒和RC4加密
最终flag
ISCC{2Q7gVLMK6HKaZg1}
8. uglyCpp题目
分析过程
- 代码结构混乱,需动态调试
- fun1:构建36位flag的完全二叉树
- fun2:中序遍历二叉树
- fun4:生成176字节密钥流("key1key2key3key4")
- fun5:异或加密
解题方法
- 跟踪异或值
- 编写解密脚本
- 恢复原始顺序
最终flag
ISCC{ABMw7Cx8Hq2INXgpQ9JSMIGokDLl3L}
9. GGAD题目
初始修改
- 修改AndroidManifest.xml中的程序入口
- 重新打包(无签名验证)
Java层分析
- so层validateKey检查key
- a类的a方法检查flag
- b方法:十六进制转八位二进制
so层分析
- 获取密钥的sha256值(cmd5可查:ExpectoPatronum)
- JNI2:二进制数据中1变0,0变1
- JNI1:RC4加密
解密步骤
- 使用Frida hook获取中间值
- 解密RC4
- 使用CyberChef工具处理
最终flag
ISCC{Cr3d3nceB@r3b0n3}
10. 叽米是梦的开场白
动态加载dex
- so层加载加密的dex文件(libmobile04.so)
- dump dex文件分析
第一部分flag
- 3DES加密
- 密钥在libSunday.so中
- 解密获取第一部分
第二部分flag
- 从assets加载加密文件
- 使用libMonday.so解密
- 同样是3DES加密,有现成的key和密文
最终flag
ISCC{WiMIit2Hx2hlAJ}
通用解题技巧总结
- 动态分析:对于复杂逻辑,优先考虑动态调试
- Frida使用:hook关键方法获取中间值
- 加密算法识别:熟悉常见加密特征(RC4, XXTEA, Blowfish等)
- 数据格式识别:如Motorola S-record格式处理
- 花指令处理:IDA中识别并清除无效指令
- 多语言分析:C++逆向需注意名称修饰和异常控制流
- Android逆向:关注JNI调用和动态加载机制