【发布时间】:2013-08-05 07:17:03
【问题描述】:
我浏览了很多互联网,但仍然无法理解它的工作方式
此链接也没有成功: How does a NOP sled work?
好的,假设我们在函数foo() 中有一个缓冲区char a[8];
foo() 的堆栈帧如下所示(32 位):
现在,我们要做的是覆盖'return'值,在调用foo()时保存在堆栈中
他们说问题是,我们无法预测保存的“返回”值的位置
但是为什么呢?例如,如果函数foo() 在所有其他局部变量之前定义了缓冲区,如上图所示,那么我们总是知道我们需要填充分配给缓冲区的 8 个字节,然后是保存的 EBP 的 4 个字节,然后我们得到'返回'
或者,如果在缓冲区之前定义了其他局部变量,比如 2 个整数,那么我们考虑为缓冲区分配 8 个字节,然后是这 2 个本地整数的 8 个字节,然后是保存的 EBP 的 4 个字节,然后我们得到'return'
我们总是知道保存的“返回”距离溢出缓冲区有多远,不是吗? :/
如果我们不这样做,请解释一下。这是我的问题 1。
我的问题 2 是,好吧,假设我们不知道 'return' 的值保存在哪里。然后,如果我们在 shellcode 之前有大量 NOP,我们很有可能将 NOP(即 0x90)值写入“return”的位置,从而覆盖原始值
现在,当函数foo() 返回时,0x90 的值被加载到 EIP(指令指针)中,而不是恢复其正常流程,程序将从地址 0x90 执行,不是吗?
我想我在这里误解了一些东西
请不要结束我的问题,即使我在一开始就提供了链接的类似问题, 我想这个问题会更加全面和清晰
【问题讨论】:
标签: c arrays security stack buffer-overflow