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

pep*_*psi 6 c security x86 exploit buffer-overflow

我知道一个典型的基于堆栈的缓冲区溢出攻击有效负载看起来像这样:

(返回地址)(返回地址)...(返回地址)(返回地址)(返回地址)(返回地址)(NOP)(NOP)(NOP)(NOP)...(NOP)(NOP)(NOP) )(NOP)(SHELLCODE)

我也明白shellcode的成功执行取决于以下几点:

  1. 有效载荷的重复返回地址部分必须覆盖该堆栈帧的返回指针
  2. 返回地址必须是NOP幻灯片某些部分的地址(或shellcode的开头)

我没有得到的是使用这种技术的恶意软件如何能够始终正确地完成这两件事.在我看来,为了制作有效载荷,攻击者必须知道目标缓冲区的大致地址及其与返回地址的近似距离.

这两个通常是非常确定的吗?例如,如果攻击者在他的机器上执行了几次试验和错误会话,那么相同的有效负载是否会在具有完全相同二进制文件的所有其他计算机上运行?

Hei*_*bug 6

为了制作有效载荷,攻击者必须知道目标缓冲区的大致地址及其与返回地址的近似距离.

你是对的.事实上,您必须使用调试器,以便编写正确的漏洞利用程序.一旦你编写并测试了,如果二进制文件在不同的机器上是相同的,那么exploit应该可以正常工作.

(做工精细是有点乐观了.比方说,shellcode的应该启动.攻击的有效性可能取决于其他因素.)


roo*_*ook 6

确定内存布局的准确性完全取决于您正在破坏的函数堆栈帧.有时偏移可以非常准确,甚至不需要舷窗雪橇,但最好还是有一个.如果您在调试器中多次触发该问题,则可以了解堆栈的混乱程度.其他因素可能会影响偏移的大小.例如,如果偏移量可以针对程序的不同版本而改变,例如为Windows 2000和windows xp编写的漏洞利用程序.应用程序的不同语言分布也会影响偏移量的大小.

但是,ASLR会对这种开发方法造成严重问题. Heap Spraying通常被基于浏览器的漏洞利用来绕过ASLR.