我了解典型的基于堆栈的缓冲区溢出攻击载荷看起来像这样:
(return address) (return address) ... (return address) (return address) (return address) (return address) (NOP) (NOP) (NOP) (NOP) ... (NOP) (NOP) (NOP) (NOP) (SHELLCODE)
我还知道成功执行 shellcode 取决于以下几点:
1. 载荷中重复的返回地址部分必须覆盖该堆栈帧的返回指针。 2. 该返回地址必须是 NOP 滑动窗口的某个部分(或 shellcode 的开头)的地址。
我不理解使用此技术的恶意软件如何总能正确地获得这两个属性。在我的看来,为了构造一个有效的载荷,攻击者必须知道目标缓冲区的大致地址及其与返回地址的大致距离。
这两个属性通常是确定性的吗?例如,如果攻击者进行几次试错会话,直到它在他的计算机上正常工作, 那么同样的载荷是否将在所有其他具有相同二进制文件的机器上工作?
(return address) (return address) ... (return address) (return address) (return address) (return address) (NOP) (NOP) (NOP) (NOP) ... (NOP) (NOP) (NOP) (NOP) (SHELLCODE)
我还知道成功执行 shellcode 取决于以下几点:
1. 载荷中重复的返回地址部分必须覆盖该堆栈帧的返回指针。 2. 该返回地址必须是 NOP 滑动窗口的某个部分(或 shellcode 的开头)的地址。
我不理解使用此技术的恶意软件如何总能正确地获得这两个属性。在我的看来,为了构造一个有效的载荷,攻击者必须知道目标缓冲区的大致地址及其与返回地址的大致距离。
这两个属性通常是确定性的吗?例如,如果攻击者进行几次试错会话,直到它在他的计算机上正常工作, 那么同样的载荷是否将在所有其他具有相同二进制文件的机器上工作?