在本任务中,我们稍微提高攻击难度,将不显示一些关键信息。我们的目标服务器为 10.9.0.6。端口号仍为 9090,且易受攻击的程序仍是 32 位程序。我们首先向此服务器发送一个正常消息。以下是由目标容器打印出的消息。
// 在虚拟机(即攻击者机器)上
$ echo hello | nc 10.9.0.6 9090
Ctrl+C
// 容器中打印出来的消息
server-2-10.9.0.6 | Got a connection from 10.9.0.1
server-2-10.9.0.6 | Starting stack
server-2-10.9.0.6 | Input size: 6
server-2-10.9.0.6 | Buffer's address inside bof(): 0xffffda3c
server-2-10.9.0.6 | ==== Returned Properly ====
我们看到,服务器仅提供了一个线索,缓冲区的地址,而没有提供帧指针的值。这意味着缓冲区的大小是未知的,这使得利用该漏洞做攻击比第一级更加困难。虽然实际的缓冲区大小可以在 Makefile 中找到,但在攻击中你不被允许使用这些信息,因为在现实世界中你大概率是看不到这个文件的。为简化任务,我们假设缓冲区大小的范围是已知的。另一个对你可能有用的事实是,由于内存对齐的原因,在32位程序中帧指针的值总是4的倍数,在64位程序中则是8的倍数。
缓冲区大小范围(以字节为单位): [100, 200]
你的任务是构造一个 payload 来利用服务器上的缓冲区溢出漏洞,并通过反向 shell 技术在目标服务器上获取 root shell。请注意,你只能构造一个payload,它必须能应付该范围内的任何缓冲区大小。如果使用暴力破解方法(即每次尝试一个缓冲区大小),将无法获得全部分数。尝试次数越多,越容易被目标检测击败,因此减少尝试次数对于攻击来说至关重要。在实验报告中,需要描述你的方法,并提供证据。