cLEMENCy架构的额外分析 - 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个字节匹配一次。
- Middle Endian:其他所有架构都以两种方式之一在内存中存储值:从最高有效字节到最低有效字节(大端序),或从最低有效字节到最高有效字节(小端序)。Middle Endian将像0x123456这样的值存储为34 56 12,而不是12 34 56或56 34 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
页面内容 最近文章 我们构建了MCP一直需要的安全层 利用废弃硬件中的零日漏洞 Inside EthCC[8]:成为智能合约审计员 使用Vendetect大规模检测代码复制 构建安全消息传递很难:关于Bitchat安全辩论的细致看法 © 2025 Trail of Bits。 使用Hugo和Mainroad主题生成。