2025 ISCC练武区域赛、决赛RE+MOBILE 详解 合集
字数 2763 2025-08-29 22:41:10

ISCC 2025 练武区域赛与决赛逆向工程与移动安全题目详解

1. 数独与单词搜索题目

题目分析

  • 程序要求输入一个9×9矩阵
  • 通过两个检查函数:checklist1checklist2

解题步骤

checklist1函数

  • 类似数独验证,返回值需大于8
  • 解决方案:输入有效的数独矩阵即可通过

checklist2函数

  • 在矩阵中搜索特定单词(八个方向)
  • 需要找到超过4个指定单词
  • 指定单词列表:
    ilterupaseuapslirtrsptialuepalitresutrsupealiueialsrtplteruispasiulapteraprsetuil
    
  • 解决方案:使用z3约束求解器爆破

隐藏提示

  • 程序输出假flag后会提示"True decode is in true_decode"
  • 包含Motorola S-record格式数据(嵌入式固件常见格式)

处理S-record数据

  1. 将S-record记录转换为二进制文件
  2. 使用IDA分析二进制文件
  3. 发现假flag作为key,真实flag通过decode函数处理

最终flag

ISCC{T%uo4=WJfd0Due#qKmaIPfkiyp4UIX}

2. Rust循环移位题目

加密逻辑

  • 对flag进行循环左移
  • 每次循环左移的位数会变化

解题方法

  1. 动态调试观察v29值的变化规律(移位位数)
  2. 编写逆向脚本还原移位操作

最终flag

ISCC{8IRM6hA0gb}

3. 迷宫小游戏题目

题目特点

  • 经典迷宫考点
  • 玩家位置(C)随机生成
  • 迷宫包含不可通行的区域

分析过程

  1. 使用IDA分析程序逻辑
  2. 重命名关键函数和变量
  3. 重点分析吃到金币后的操作(sub_41D580函数)

关键发现

  • 读取txt文件(sub_40165D函数)
  • 内存中存在未分析的数据,实际是XXTEA加密算法
  • 在内存中可以找到加密密钥

解题方法

  1. 动态调试跟踪到加密过程
  2. 由于游戏结束条件未知,采用爆破方法
  3. 基于flag格式ISCC{}进行爆破

最终flag

ISCC{]aH_~=$a*j<.3hlcgeHE|+[Y}

4. 邦布出击(Blowfish加密)

Java层分析

  1. 检查flag格式(ISCC{})和长度(>7)
  2. 使用a类的a方法进行Blowfish加密
  3. 密钥来自b类的c方法(返回空导致程序闪退)

关键发现

  1. 数据库被加密(SQLCipher)
  2. 通过MainActivity2类发现数据库解密逻辑
  3. 找到base64编码的密钥(需三次解码)

获取密钥步骤

  1. 对info属性进行三次base64解码
  2. 获得密钥:H4iJkLmNoPqRsTuV
  3. 使用SQLCipher解密数据库

FRIDA脚本使用

  1. Hook encrypt方法(Blowfish加密结果作为DES密文)
  2. Hook b类的c方法返回正确密钥
  3. 输入测试数据触发获取flag

最终flag

ISCC{rR6ql9CGn0u/kBPZpMzCEKmQy0ZkdlNB}

5. Detective题目

Java层分析

  1. 启动页LoginActivity检查四位password(so层验证)
  2. MainActivity检查flag格式和长度
  3. a类的a方法进行加密后传给so层

加密流程

  1. b方法:字符转十六进制(不足三位补0)
  2. b类的a方法:
    • 特定索引值增加字符'3'
    • 按索引奇偶打乱顺序
    • 特定值后追加"21"并颠倒顺序
  3. c方法:前面补"00"转回字符形式

so层分析

  1. validatePassword:计算sha256比较(可hook绕过)
  2. stringFromJNI:简单异或加密(已知key)

最终flag

ISCC{@@bM0r!y}

6. HolyGrail题目

Java层分析

  1. FlagValidationActivity检查flag格式
  2. a类的validateFlag方法:
    • Vigenère加密
    • so层processWithNative处理
    • b类的a方法转换

关键发现

  1. 使用SharedPreferences存储数据
  2. 需要按正确顺序选择耶稣和十二门徒
  3. 顺序在mobile2的libSequence-Clues.so中

解题步骤

  1. 找到按钮与名字的对应关系(布局文件中)
  2. so层分析:十六进制转十进制再转十三进制
  3. 使用Frida hook validateFlag方法
  4. 建立字符与加密结果的对应关系

维吉尼亚解密

密文:Wvqh~0f5zke3va~
解密后:ISCC{Dome~0f5ecr3ts~}

7. 练武决赛CrackMe

花指令处理

  1. 识别并清除三种花指令
  2. 红色部分未定义,黑色部分nop
  3. 按C转换代码后nop两字节

加密逻辑

  1. 类似凯撒加密(对偶数位)
  2. 标准RC4加密(全部位)
  3. 真实密文在偶数位

解密方法

  1. 提取偶数位
  2. 逆向凯撒和RC4加密

最终flag

ISCC{2Q7gVLMK6HKaZg1}

8. uglyCpp题目

分析过程

  1. 代码结构混乱,需动态调试
  2. fun1:构建36位flag的完全二叉树
  3. fun2:中序遍历二叉树
  4. fun4:生成176字节密钥流("key1key2key3key4")
  5. fun5:异或加密

解题方法

  1. 跟踪异或值
  2. 编写解密脚本
  3. 恢复原始顺序

最终flag

ISCC{ABMw7Cx8Hq2INXgpQ9JSMIGokDLl3L}

9. GGAD题目

初始修改

  1. 修改AndroidManifest.xml中的程序入口
  2. 重新打包(无签名验证)

Java层分析

  1. so层validateKey检查key
  2. a类的a方法检查flag
  3. b方法:十六进制转八位二进制

so层分析

  1. 获取密钥的sha256值(cmd5可查:ExpectoPatronum)
  2. JNI2:二进制数据中1变0,0变1
  3. JNI1:RC4加密

解密步骤

  1. 使用Frida hook获取中间值
  2. 解密RC4
  3. 使用CyberChef工具处理

最终flag

ISCC{Cr3d3nceB@r3b0n3}

10. 叽米是梦的开场白

动态加载dex

  1. so层加载加密的dex文件(libmobile04.so)
  2. dump dex文件分析

第一部分flag

  1. 3DES加密
  2. 密钥在libSunday.so中
  3. 解密获取第一部分

第二部分flag

  1. 从assets加载加密文件
  2. 使用libMonday.so解密
  3. 同样是3DES加密,有现成的key和密文

最终flag

ISCC{WiMIit2Hx2hlAJ}

通用解题技巧总结

  1. 动态分析:对于复杂逻辑,优先考虑动态调试
  2. Frida使用:hook关键方法获取中间值
  3. 加密算法识别:熟悉常见加密特征(RC4, XXTEA, Blowfish等)
  4. 数据格式识别:如Motorola S-record格式处理
  5. 花指令处理:IDA中识别并清除无效指令
  6. 多语言分析:C++逆向需注意名称修饰和异常控制流
  7. Android逆向:关注JNI调用和动态加载机制
ISCC 2025 练武区域赛与决赛逆向工程与移动安全题目详解 1. 数独与单词搜索题目 题目分析 程序要求输入一个9×9矩阵 通过两个检查函数: checklist1 和 checklist2 解题步骤 checklist1函数 : 类似数独验证,返回值需大于8 解决方案:输入有效的数独矩阵即可通过 checklist2函数 : 在矩阵中搜索特定单词(八个方向) 需要找到超过4个指定单词 指定单词列表: 解决方案:使用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调用和动态加载机制