我目前正在研究Windows漏洞利用开发,并正在通过Spike查找应用程序中的一些崩溃。我通过我编写的scapy脚本手动定位崩溃,并修改某些数据。我目前的问题是尝试编写一个Spike模板来模糊其他崩溃,但我现在无法使Spike模糊我发送的二进制数据 - 它总是发送相同的东西。利用其他Spike调用,即s_word
,s_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具有已知的缓冲区溢出。我知道有一个漏洞可用 - 请不要只是链接我。我正在尝试学习如何从二进制协议模糊化到完全利用。
我已经捕获了一些初始流量并将其用于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的“文档”已经允许我创建模糊测试模板并发送我的数据,但我现在无法真正“模糊”字节我的目标。我的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
的模板并且服务器响应,但有效负载中的字节永远不会被修改,并且反复发送相同的有效负载。 我做错了什么?
现在,稍后查看文档和大量googles会导致尝试许多其他更具针对性的值,例如s_word
,s_binary_word
s_binary_bigendian_word_variable
和LE。以上所有内容均通过谷歌和An Introduction to SPIKE, the Fuzzer Creation Kit以及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
可能与链接器问题有关,但这有点超出我的知识水平。我很感激能得到的任何帮助。
有什么想法吗?感谢。
答案 0 :(得分:1)
我不知道Spike是否已经被维护了。 Sulley取代了它,但也不是很活跃。 boofuzz更加积极地维护,并且在一些相同的原则上起作用。 Documentation
不确定Spike,但Sulley和boofuzz有一个“模糊”参数,当设置为false时,禁用元素上的模糊测试,因此您可以尝试将其明确设置为true(默认情况下通常为true)。 / p>
编辑:披露:我维持boofuzz。
答案 1 :(得分:0)
好的,所以我实际上做了一些错误(显然)。也许有人在努力解决这个问题,这会有所帮助。
SPIKE不适用于十六进制/二进制模糊测试 - 它在模糊字符串和整数值方面表现优异,但是没有用于模糊二进制字符串的内置方法(我知道)。那些需要手动添加,我读过的很多文章都调用了我无法访问的方法,因此造成了很大的困难。二进制字符串被视为静态字符串,因此它们将始终按原样发送。您可以通过查看spike.h
文件并查看其中的所有结构来获取SPIKE本机支持的所有方法的读数。这就是我在尝试使用它们时得到unknown symbol: XXXX
的原因 - 它们从未被定义过。
其次,你不能通过在命令行上调用它作为起始点来定位'块',而不是块的用途。这实际上并不是我上面问题的一部分,并没有造成任何问题,因为我没有定义其他的模糊点,但为了防止其他人尝试它,它不起作用。