我正在尝试理解缓冲区溢出的基本原理。 在无数个小时的阅读中,我注意到的一件事是:
大多数情况下,漏洞利用字符串结构如下所示,其中nops和shellcode位于缓冲区溢出之前的第一部分:
[NOPS-SHELLCODE-NEWEIPADDRESS]
现在我喜欢在盒子外面思考并尝试这个,其中shellcode位于堆栈中新的eipaddress之后:
[NOPS-NEWEIPADDRESS-SHELLCODE]
我成功地以这种方式利用了我的测试漏洞,但真的很奇怪为什么没有人写或使用这种示例?这是不好的做法还是我忽略了什么?
答案 0 :(得分:1)
我认为你用来实现缓冲区溢出的第二种方式比第一种方式更差。
让我为你解释一下。
通常,操作系统具有名为ASLR的安全功能。
简而言之,每次执行时,堆栈地址(缓冲区地址)都会不同。
所以你必须猜测缓冲区地址,这就是为什么NOP雪橇的原因。
如果你的NEWEIPADRESS登陆NOP雪橇或shellcode的第一个字节,你的攻击成功。
但是,如果你使用第二种方式,只有当你的NEWEIPADRESS是shellcode的第一个字节时才能成功。
如果您使用NOP底座,则NEWEIPADRESS将被解释为要执行的汇编语言。
在大多数情况下,你的NEWEIPADRESS会使你的漏洞利用失败,期望NEWEIPADRESS都是NOP。