在基于堆栈的缓冲区溢出攻击中,修改后的返回地址是如何近似计算的?

6
我了解典型的基于堆栈的缓冲区溢出攻击载荷看起来像这样:
(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 的开头)的地址。
我不理解使用此技术的恶意软件如何总能正确地获得这两个属性。在我的看来,为了构造一个有效的载荷,攻击者必须知道目标缓冲区的大致地址及其与返回地址的大致距离。
这两个属性通常是确定性的吗?例如,如果攻击者进行几次试错会话,直到它在他的计算机上正常工作, 那么同样的载荷是否将在所有其他具有相同二进制文件的机器上工作?
3个回答

6
为了构建一个有效的攻击载荷,攻击者必须知道目标缓冲区的大致地址以及与返回地址的大致距离。
你说得对。实际上,为了编写正确的漏洞利用程序,您需要使用调试器进行一些操作。一旦编写并测试完毕,如果二进制文件在不同的机器上相同,则漏洞利用应该可以正常工作。
(“正常工作”有点乐观。让我们说,shellcode 应该能够启动。攻击的有效性可能取决于其他因素...)

6
确定内存布局的准确性完全取决于您正在破坏的函数的堆栈帧。有时偏移量可以非常准确,甚至不需要 nop sled,但最好还是有一个。如果在调试器中多次触发问题,您可以了解堆栈的混乱程度。其他因素也会影响偏移量的大小。例如,如果偏移量可能因程序的不同版本而改变,比如针对 Windows 2000 和 Windows XP 的漏洞利用。应用程序的不同语言分发也会影响偏移量的大小。
然而,ASLR 对此利用方法造成严重问题。堆喷射 常用于基于浏览器的漏洞利用以绕过 ASLR。

1
当然,根据系统和二进制文件,地址不会总是相同的。一些恶意软件使用的黑客技巧是生成多个有效载荷,使用不同的返回地址(例如,如果有10个NOPS,则+10增量),并尝试所有这些地址,直到成功为止。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接