CyCTF25资格赛—Vault Raider移动挑战题解
快速总结
该应用被解包并进行分析。成功恢复三个秘密片段,将其组合、哈希处理,最后通过最终例程生成挑战flag。
秘密的发现过程
秘密1:IMEI回退值
当应用尝试读取设备IMEI时,在典型的测试/CTF环境中使用了回退值。该回退值为15个零组成的字符串。该字符串经过SHA-256哈希处理,成为第一个秘密。该发现在MainActivity中完成。
回退IMEI值:“000000000000000”
第一个秘密(该值的SHA-256):14bdcd6fd64180af5e7791df91b6af8e9a3e7bc844997eb8c29252706df97ca5
秘密2:编码名称
应用的资源包含一个短名称,实际上是编码数据。该值从Base64解码后,使用小密钥进行XOR操作以显示明文。经过这两个步骤后,获得第二个秘密。
编码资源值:MEclOVYt
用于XOR的密钥:ctfkey
第二个秘密(Base64解码+XOR后):S3CR3T
秘密3:占位符
一个本地例程看起来可能产生第三个片段,但附近的字符串表明使用了标准的CTF占位符,而不是复杂的运行时计算。该占位符被作为第三个秘密。
第三个秘密假设:deadbeef
构建主密钥
三个秘密按特定顺序连接:第一个秘密,然后是第二个秘密,最后是第三个秘密。该连接字符串的SHA-256哈希产生一个单一"主"值,供最终例程使用。
连接顺序:第一个 + 第二个 + 第三个
生成的主密钥(SHA-256):8fc2b0c53e485523edfbddef965bece3c5da451e58a2aed8d5281e8c43abe5e7
最终flag格式化
应用中存在硬编码前缀。取主密钥的前八个字符,反转,然后与该前缀和固定后缀连接形成flag主体。最后,该主体被包装在挑战的cyctf{…}格式中。
硬编码前缀(内部字节数组的十六进制形式):3465fb449e7e4ad1636a6511a0c23900be2d3dd4ac2e6a0ad594a1e23bb7ce8a9c
主密钥前8个字符:8fc2b0c5 → 反转后 → 5c0b2cf8
最终flag(组装后):cyctf{3465fb449e7e4ad1636a6511a0c23900be2d3dd4ac2e6a0ad594a1e23bb7ce8a9c_5c0b2cf8_solved}
简要概述
- APK被解包,应用被反编译
- 检查主活动和资源文件以寻找秘密材料
- 定位IMEI回退值(000000000000000)并进行哈希(SHA-256)生成部分A
- 编码资源字符串(MEclOVYt)经过Base64解码,然后使用密钥ctfkey进行XOR解码生成部分C
- 检查本地函数并采用常见占位符(deadbeef)作为部分B
- 三个部分按顺序连接:部分A + 部分C + 部分B
- 连接字符串使用SHA-256哈希生成主密钥
- 主密钥的前8个字符被反转
- 硬编码前缀(来自应用)与反转片段和固定后缀连接形成flag主体
- flag主体被包装在cyctf{…}格式中以产生最终flag