据我所知,典型的基于堆栈的缓冲区溢出攻击有效负载看起来像这样:
(退货地址)(退货地址)...... (退货地址)(退货地址) (退货地址)(退货地址) (NOP)(NOP)(NOP)(NOP)......(NOP) (NOP)(NOP)(NOP)(SHELLCODE)
我也明白shellcode的成功执行取决于以下几点:
我没有得到的是使用这种技术的恶意软件如何能够始终正确地完成这两件事。在我看来,为了制作有效载荷,攻击者必须知道目标缓冲区的大致地址及其与返回地址的近似距离。
这两个通常是非常确定的吗?例如,如果攻击者在其计算机上运行几次试验和错误会话,那么相同的有效负载是否会在具有完全相同二进制文件的所有其他计算机上运行?
答案 0 :(得分:6)
为了制作有效载荷,攻击者必须知道目标缓冲区的大致地址及其与返回地址的近似距离。
你是对的。事实上,您必须使用调试器,以便编写正确的漏洞利用程序。 一旦你编写并测试了,如果二进制文件在不同的机器上是相同的,那么exploit应该可以正常工作。
(工作正常有点乐观。假设应该启动shellcode。攻击的有效性可能取决于其他因素..)
答案 1 :(得分:6)
确定内存布局的准确性完全取决于您正在破坏的功能堆栈帧。有时偏移可以非常准确,甚至不需要舷窗雪橇,但最好还是有一个。如果在调试器中多次触发该问题,您可以了解堆栈的混乱程度。其他因素可能会影响偏移的大小。例如,如果程序的不同版本的偏移量可能会发生变化,例如为windows 2000 and windows xp编写的漏洞利用程序。应用程序的不同语言分布也会影响偏移量的大小。
但是,ASLR会导致此漏洞方法出现严重问题。 Heap Spraying通常被基于浏览器的漏洞利用来绕过ASLR。
答案 2 :(得分:0)
对于cource,地址并不总是相同,具体取决于系统和二进制,一个黑客恶意软件用来提高其机会的是使用不同的返回地址生成多个有效负载(如果有10个NOPS则为+10增量)并尝试这些都是有效的。