用于反转二进制网络协议的现代工具

逆向工程 协议
2021-07-03 02:11:18

有哪些现代工具或技术可以尝试反转通过 UDP 发送的二进制协议?

我一直在尝试对此进行研究,似乎几乎所有内容都已过时。该站点和其他资源上的先前答案提到了一个名为 Canape 的工具,它似乎不再维护,或者工具 netzob,它已经多年没有更新了。虽然我确实设法让它运行了,但它似乎并不是很有用。

是否有任何更现代的工具可以显示视觉辅助、重复模式和类似的东西来帮助逆转未知的协议?

3个回答

查看开泰结构

基本上你在 YAML 中定义一个二进制格式,它会生成代码来反序列化格式。有一个 github 存储库,其中包含很多现有定义,其中包括一个用于 UDP 的定义。

它还有一个简单的十六进制查看器,非常适合可视化 - 它会在您四处移动时突出显示格式部分/结构/字段。或者您可以使用生成的代码编写自己的程序,用于查看、分析、测试等。

一旦您熟悉了定义语言,它就可以让您更多地专注于弄清楚协议或文件格式,而不是如何解析它。

每个人都想要一个神奇的工具,它可以让逆向未知的二进制协议变得不那么乏味。我希望我们会在接下来的 12 个月中看到一些这样做的事情。

难题

以前的静态推理工具(Discoverer、Netzob)试图跨越文本和二进制协议。基于文本(想想 JSON 有效负载)的协议通常更容易逆转,因为作为人类,您可以检查数据并至少了解片段的类型以及字段之间的边界。二进制协议对于类型和字段边界都是不明确的。这 4 个字节是 IEEE 浮点数还是 2 个无符号短整数或 4 个 ASCII 字符?

此外,如果您有权访问程序/可执行文件,您最终将能够使用 IDA/Ghidra/Whatever 对格式进行逆向工程。这可能很乏味且需要时间,但您或一组工程师可以完成它。

因此,如果您无权访问该程序,而您所拥有的只是一些网络跟踪或流量的 pcap,那么您的可能性就大了。我认为你没有看到现代工具的原因(还)是因为它很难,而且付出更少的努力,你可以获得更多的回报,要么坚持使用 JSON / 任何 ASCII 等文本协议格式,要么通过从事二进制程序检测和分析来从程序本身确定格式。

那么你可以尝试什么?

如果您无权访问二进制文件,那么希望您有多条消息。下面假设您有许多消息并将它们分组为纯格式,这意味着每条消息的字段布局完全相同,只有值不同。

  1. 所有消息的长度是否相同或不同?

    • 如果长度相同,则样本中没有可变长度字段。

    • 如果长度不同,它们总是以 2 还是 4 为单位?或者你有偶数和奇数的长度差异?这可以告诉您消息可变长度部分的单位大小。

  2. 是否存在从消息开始的特定偏移量处的所有消息中采用恒定(相同)值的区域?这些可以帮助您确定具有变化值的字段相对于消息开始的位置。

  3. 是否有与消息长度相对应的字节区域?

    • 如果您在 UDP 中有可变长度的消息,并且您发现了一个长度字段,这可能表明该格式旨在用于除 UDP 之外的其他地方。UDP 有一个长度字段,那么为什么要发送长度两次呢?

    • 如果您在 UDP 的消息正文中没有看到长度代码,这很有趣,因为无论使用此消息的任何内容都必须知道要读取多少字节,无论是从 UDP 长度还是消息中的某个其他值。

  4. 查找具有已知值(例如已知 IP 地址或已知字符串)的区域。

  5. 将消息拆分为发送的流量和接收的流量。有时一种格式用于发送数据,另一种格式用于确认数据。

  6. 所有消息中是否有一些字节只采用两个或三个值?根据该字节的值将您的数据集拆分为多个组。

在工具方面,对于校验和,您可以尝试以下方法:https : //github.com/laurenlabell/checksum_finder

背景:https : //dl.acm.org/doi/10.1145/3411506.3417599

为 Wireshark 编写解剖器可能值得一试。这是一个很好的使用 Lua 的教程