【问题标题】:Comprehensive and clear NOP sled technique explanation needed需要全面清晰的NOP雪橇技术解释
【发布时间】: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


    【解决方案1】:

    首先我们假设没有地址空间随机化并且堆栈是可执行的。

    我们总是知道保存的“返回”距离溢出缓冲区有多远,不是吗? :/

    不,我们不知道。在局部变量与保存的 EBP 和返回地址之间存在未指定数量的填充字节。这个字节数可能取决于编译器版本。

    那么,如果我们在 shellcode 之前有大量 NOP 数组,我们很有可能将 NOP(即 0x90)值写入 'return' 的位置,从而覆盖原始值

    这个想法是在返回地址之后有所有的 NOP 值。这样我们就可以用堆栈中 shellcode 的“近似”地址覆盖返回地址。确切的 shellcode 地址可能取决于操作系统版本,但也取决于程序参数以及环境变量的大小和数量,因为它们位于堆栈地址空间中。

    【讨论】:

    • 那么,当 0x90 加载到 EIP 中会发生什么? CPU 将跳转到地址 0x90 并在那里寻找下一条指令,这将导致一些错误,因为那不是用户空间。我对吗? EIP 不包含指令本身,它包含要执行的下一条指令的地址。
    • 我不明白 CPU 是如何“向下滑动”的,它会跳过所有 NOP,直到它到达 shellcode。
    • @mangusta NOP 并不意味着覆盖返回地址。如果 EIP 为 0x90909090,您将收到分段错误。返回地址必须用 shellcode 的确切起始地址覆盖,但是这个起始地址在不同的系统上可能会改变,所以在 shellcode 之前添加 NOP 会给你带来误差。
    • 哦,现在我明白了。然后,我想有3种可能的情况需要考虑,我在这张照片上画了它们(假设addr_1是我们对shellcode地址的估计):s018.radikal.ru/i522/1308/37/5c00a8356fb3.png我想知道为什么我到目前为止看到的所有安全书籍,只提到第一情况,从不考虑其他两个?
    • 如果 size(NOPs + shellcode) 大于 min(addr. of saved 'return' - &buffer[0]),第一种情况是不可行的,因为 shellcode 或 NOPs 可能会覆盖保存的 'return' 值.对于这种情况,第二种情况是一个合理的选择。然而,在这两种情况下 addr_1 都不应包含空值。第三种情况是没有意义的,我猜:)
    猜你喜欢
    • 1970-01-01
    • 2013-07-27
    • 1970-01-01
    • 1970-01-01
    • 2016-08-14
    • 1970-01-01
    • 2014-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多