两人:SPIKE 模糊器:"undefined symbol: s_word"

Two-Parter: SPIKE fuzzer: "undefined symbol: s_word"

我目前正在研究 Windows 漏洞利用开发,并致力于通过 Spike 定位应用程序中的一些崩溃。我通过我编写的 scapy 脚本手动定位了崩溃,并修改了某些数据。我当前的问题是尝试编写一个 Spike 模板来对其他崩溃进行模糊测试,但我目前无法让 Spike 对我发送的二进制数据进行模糊测试——它总是发送相同的东西。利用其他 Spike 调用,即 s_words_binary_bigendian_word 都会导致:

generic_send_tcp: undefined symbol: s_word

generic_send_tcp: undefined symbol: s_binary_bigendian_word

有问题的应用程序是 'Disk Saavy 10.4.18',它通过 SEH 发生已知的缓冲区溢出。我知道有一个可用的漏洞——请不要只是 link 我那样做。我正在尝试学习如何从对二进制协议进行模糊测试到完全利用。

我已经捕获了一些初始流量并将其工作到 3WHS 的 scapy 脚本中,然后是 PSH,确认我的数据。下面是示例数据包的原始数据:

0000   75 19 ba ab 03 00 00 00 00 00 00 00 1a 00 00 00  u...............
0010   20 00 00 00 00 00 00 00 53 45 52 56 45 52 5f 47   .......SERVER_G
0020   45 54 5f 49 4e 46 4f 02 32 01 44 41 54 41 01 30  ET_INFO.2.DATA.0
0030   01 00 00 00 60 c0 f1 02                          ....`.......`...                   

前 12 个字节必须保持原样(似乎——不是我的问题的一部分),否则应用程序无法正确解析它。然而,紧随其后的四个字节被插入到 ECX 中。将这四个更改为类似于 1A CC CC CC 的内容会导致 ECX 运行良好,成为 CC CC CC 1A 并且应用程序崩溃。这一切都很好。 Scapy 很棒,但我更愿意使用像 SPIKE 这样的模糊测试框架。

第一个(和第二个)问题:虽然回顾 Spike 的 "documentation" 允许我创建一个模糊测试模板并发送我的数据,但我目前无法实际上 'fuzz' 我的目标字节。我的 Spike 脚本(可能不好)如下:

s_binary("\x75\x19\xBA\xAB\x03\x00\x00\x00\x00\x00\x00\x00");
s_block_start("ecx");
s_binary("0x1A000000");
s_block_end("ecx");
s_binary("\x20\x00\x00\x00\x00\x00\x00\x00");
s_string("SERVER_GET_INFO");
s_binary("\x02");
s_string("2");
s_binary("\x01");
s_string("DATA");
s_binary("\x01");
s_string("0");
s_binary("\x01\x00\x00\x00");
s_string("`");
s_binary("\xC0\xF1\x02");

Side note-- if there's a better way to write this script, let me know.
(minus the block, that's just for learning)

运行 带有 generic_send_tcp 192.168.138.134 9124 diskSaavy.spk ecx 0 的模板可以工作并且服务器响应,但是有效载荷中的字节永远不会被修改,并且一遍又一遍地发送相同的有效载荷。 我做错了什么?

现在,后来查看文档和大量谷歌搜索,结果尝试了许多其他更有针对性的值,例如分别为 s_words_binary_word s_binary_bigendian_word_variable 和 LE。以上所有内容均通过谷歌和 An Introduction to SPIKE, the Fuzzer Creation Kit, and Fuzzing Frameworks

等文章找到

所以我将 s_binary("0x1A000000"); 更改为 s_binary_variable("0x1A000000");s_word("0x1A000000"); 等,每次我得到:

# generic_send_tcp 192.168.138.134 9124 diskSaavy.spk ecx 0
Total Number of Strings is 681
Fuzzing
Fuzzing Variable 0:0
generic_send_tcp: undefined symbol: s_word <--- my call

快把我逼疯了。到目前为止,我已经尝试了各种不同的调用,例如上面的示例,并按照对 SO 上相关问题的回答所建议的安装 binutils,但没有解决方案。我读到 undefined symbol 可能与 linker 问题有关,但这有点超出我的知识水平。如果能得到任何帮助,我将不胜感激。

有什么想法吗?谢谢。

不知道Spike还有没有维护。 Sulley had superseded it, but is also not very active. boofuzz is more actively maintained still and functions on some of the samem principles. Documentation.

不确定 Spike,但 Sulley 和 boofuzz 有一个 "fuzzable" 参数,当设置为 false 时,禁用元素上的模糊测试,因此您可以尝试将其显式设置为 true(默认情况下通常为 true虽然)。

编辑:披露:我维护 boofuzz。

好的,所以我实际上在这方面做错了几件事(很明显)。也许遇到这个问题的人会看到我的问题,这可能会有所帮助。

SPIKE 不适用于十六进制/二进制模糊测试——它擅长模糊测试字符串和整数值,但没有用于模糊测试二进制字符串的内置方法(据我所知)。这些需要手动添加,而且我读过的许多文章都调用了我无法访问的方法,因此造成了很大的困难。二进制字符串被认为是静态字符串,因此它们将始终按原样发送。通过查看 spike.h 文件并查看其中的所有结构,您可以读取 SPIKE 原生支持的所有方法。这就是为什么我在尝试使用它们时得到 unknown symbol: XXXX——它们从未被定义。

其次,您不能通过在命令行上调用它作为起点来定位 'block',这不是块的目的。这实际上不是我上述问题的一部分,也没有造成任何问题,因为我没有定义其他模糊测试点,但以防万一其他人尝试它,它不起作用。