我了解典型的基于堆栈的缓冲区溢出攻击有效负载如下所示:
(返回地址) (返回地址) ... (返回地址) (返回地址) (返回地址) (返回地址) (NOP) (NOP) (NOP) (NOP) ... (NOP) (NOP) (NOP) ) (NOP) (外壳代码)
我也明白 shellcode 的成功执行取决于几件事:
- 有效载荷的重复返回地址部分必须覆盖该堆栈帧的返回指针
- 该返回地址必须是 NOP 幻灯片某些部分的地址(或 shellcode 的开头)
我不明白的是,使用这种技术的恶意软件总能把这两件事做好。在我看来,为了制作有效的有效载荷,攻击者必须知道目标缓冲区的大致地址及其与返回地址的大致距离。
这两个通常是确定性的吗?例如,如果攻击者在他的机器上运行之前进行了几次反复试验,那么相同的有效负载是否可以在具有完全相同二进制文件的所有其他机器上运行?