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