对cLEMENCy的额外分析
今年的DEF CON CTF采用了一种独特的硬件架构cLEMENCy,并在决赛开始前仅24小时才发布其规范与参考工具。cLEMENCy被刻意设计用于破坏现有工具并增加新工具的开发难度。考虑到比赛时间仅限一个周末,这构成了巨大挑战。
Ryan、Sophia和我在比赛期间编写并使用了Binary Ninja的cLEMENCy处理器模块。这帮助我们的团队通过Binary Ninja的图形视图和数据流分析更快地解析题目,远超主办方提供的有限反汇编器和调试器。今天我们发布这一处理器模块,以帮助那些想自行尝试挑战的人。
cLEMENCy通过削弱高级工具(如Manticore或网络推理系统)的能力,在CTF中创造了更公平的竞争环境。其实现方式包括以下架构特性:
- 9位字节而非8位:这使二进制解析变得困难。系统架构的字节长度与cLEMENCy不匹配,两个系统的字节起始点仅每9个字节对齐一次。
- 中端序(Middle Endian):其他架构以两种方式存储值:从最高有效字节到最低(大端序)或反之(小端序)。而中端序将如0x123456的值存储为34 56 12。
- 变长操作码指令:指令长度从18到54位不等,操作码从4位到18位不等。
这要求在短时间内发挥创造力。仅提前24小时开始,我们需要在四天比赛结束前快速开发出可用的工具。即使面对友好架构这也十分困难。以下是我们如何在CTF期间编写并使用反汇编器的解决方案:
- 将每个9位字节扩展为16位短整型:最初我编写了复杂的位掩码和移位操作,但Ryan随后用bitstream模块写了一个更简单的脚本实现相同功能。这导致所有内存偏移翻倍,但修正起来很简单。
- 大量使用Python切片:反汇编器先将字节转换为比特串,然后重新排列以匹配参考文档中的表示。之后,我们选择实现速度而非代码简洁性,通过比较每个操作码的确切比特数来识别和解析它们。
- 使指令更详细:加载和存储指令从起始点迭代指定数量的寄存器,将每个寄存器复制到或从内存位置。我们不仅显示起始寄存器和计数,还扩展了整个列表,使反汇编中指令的效果一目了然。
通过实现的处理器模块,我们可以查看和交互题目,用自动化分析定义函数,并控制汇编指令的表示方式。
我们还尝试编写LLIL提升器,但这是不可能的。你只能选择一致的寄存器数学或一致的内存地址,无法兼得。奇怪的三字节寄存器宽度和翻倍的内存地址不兼容。但并非全无收获,足够多的指令可被提升以通过数据流分析定位字符串。
如果你想开始使用我们的Binja模块,可以在我们的Github上找到架构和BinaryView插件,以及打包和解包题目的脚本。
LegitBS已开源其cLEMENCy工具。题目将很快可用。我们期待看到其他团队如何处理cLEMENCy!
更新:题目现已可用。PPP、Chris Eagle和Lab RATS发布了他们的cLEMENCy处理器模块。
如果你喜欢这篇文章,请分享:
- GitHub
- Mastodon
- Hacker News