2021 ByteCTF 初赛部分题目官方Writeup
安卓漏洞利用是一个系列题,线下赛还有,到时候一起出writeup
Bytal 系列题目着重考查 GPU 上的逆向分析与问题解决能力:题目运行在 iOS 平台上,而为了解题需要逆向分析的逻辑,是通过 Metal 图形编程接口,使用 Metal Shading Language 开发实现,并进一步编译成 GPU 层面的字节码,最终在目标设备的 GPU 上运行的。 本题为该系列的第一题,展示了如果使用 debug 模式编译 Metal shader,并直接发布产品,则可能会造成的 shader 源代码泄漏问题。
App 启动后的界面和 Hint 均提示读取源代码获取 flag,而且该提示还在不断闪烁。不难逆向分析出该闪烁效果正是通过 Metal 实现的,因此此题需要设法读取实现该效果的 shader 源代码。
注意到,在本题中,编译生成的 Metal 二进制动态库 .metallib 文件没有以 release 模式编译,而是以 debug 模式编译。在 debug 模式中,为了便于图形相关功能的开发与调试,shader 源代码会附带到 Metal 二进制动态库中,但这也为第三方获取源代码提供了可能性。
要从以 debug 模式编译得到的 Metal 二进制动态库中读取源代码,至少有两种方法。第一种是依赖 Xcode 集成开发环境强大的图形调试功能。具体而言,使用 MonkeyDev 等框架,对题中 app 进行重签名并安装后,可使用 Xcode 进行图形调试,抓取 GPU 帧数据并分析: 从中可窥见完整的渲染链流程,并且可以知道闪烁效果是在如下的 Metal shader 核函数中实现的:
通过选取该核函数,Xcode 将会展示其源代码供调试: