【问题标题】:Isnt Segmentation fault the same as the smashing the stack?Segmentation fault 和砸栈不一样吗?
【发布时间】:2012-12-03 08:27:27
【问题描述】:

由于编程错误,我们会遇到分段错误。但是作为一个必要的工具,我们尝试了同样的事情,但是内核检测到它破坏了堆栈。内核究竟是如何看到差异的?

【问题讨论】:

    标签: segmentation-fault exploit


    【解决方案1】:

    简而言之,不。分段错误是指内核能够检测到无效的内存访问,然后终止进程。内核无法检测到一些无效的内存访问,堆栈溢出就是建立在这些之上的。但是,编译器可以检测到堆栈溢出,并且在最新版本的 gcc (4.1+) 中具有针对堆栈粉碎攻击的内置保护。基本上,“金丝雀”值被放置在堆栈帧之间的堆栈上。检查以确保金丝雀仍然具有正确的值;如果没有(因为它被覆盖并且覆盖者无法猜出正确的值),则执行堆栈粉碎保护例程。有关更多信息,请参阅: http://en.wikipedia.org/wiki/Buffer_overflow_protection#GCC_Stack-Smashing_Protector_.28ProPolice.29http://wiki.osdev.org/GCC_Stack_Smashing_Protector

    您可以使用“-fno-stack-protector”禁用 gcc 保护,有关更多信息,请参阅:Stack smashing code not working on Linux kernel 2.6.38.7... Please help

    相反,分段错误只是发生在程序任何地方的无效内存访问,这意味着内核检测到对不在程序允许的内存区域中的内存的访问。 AFAIK 这是使用 x86 段和虚拟内存的组合来检查的。内核/操作系统没有真正的方法可以知道访问是在原始程序代码中还是代码被某种方式利用;无论哪种方式,程序都试图访问它无法访问的内存,因此它被强制终止。

    【讨论】:

    • 不降低堆栈边界就不能成功粉碎堆栈吗?
    • 不,你怎么可能? “堆栈粉碎”的整个想法是您粉碎(即覆盖)本应用于此变量的内存边缘。作为第一个近似值,我们可以假设只能连续进行。此外,您必须覆盖当前帧,以便您可以更改前一帧,以便当程序试图返回前一帧时,它会执行您的 shellcode。
    • en.wikipedia.org/wiki/Stack_buffer_overflow 是对这个主题的一个很好的概述;你应该学习它。
    • wanttomasterpython,如果您找到我的答案或 melpomene 的答案,您应该将其标记为答案。如果您不标记问题的答案,人们最终会停止回答。
    • Linux 内核确实具有防止内核本身发生的堆栈溢出的保护。我想这些是 gcc 保护,因为 Linux 内核是用 gcc 编译的。
    【解决方案2】:

    Segmentation fault 和砸栈不一样吗?

    不,分段错误是指操作系统检测到无效的内存访问并终止您的进程。粉碎堆栈是指覆盖(返回)堆栈上的地址的行为,通常是通过溢出本地声明的数组。

    当您破坏堆栈时(作为攻击者),您的目标是让进程执行您选择的代码。您希望避免分段错误,因为它们会终止您尝试接管的进程。

    由于编程错误,我们会遇到分段错误。

    嗯,有些错误会导致分段错误,是的。其他错误什么都不做或只是导致错误结果(例如当攻击者成功利用缓冲区溢出并使程序运行完全不同的代码时)。

    但作为必要的工具,我们尝试了同样的事情,但内核检测到它破坏了堆栈。

    我不知道你刚才说了什么,但是内核没有检测到“smashing the stack”。

    内核究竟是如何看到差异的?

    有什么区别?

    【讨论】:

    • 分段错误和堆栈粉碎的区别。为保护堆栈而保留的金丝雀值不会改变吗?
    • 金丝雀值是那些在返回地址附近的内存中使用的值,因此对返回地址造成的干扰也会改变金丝雀值,并且检测到金丝雀值的变化并且程序已中止。
    • 你认为为什么会有金丝雀价值?
    • wanttomasterpython,对用户应用程序的栈粉碎保护不是Linux内核提供的,它是由gcc编译器提供的。看我的回答。
    • 是的,知道,写错了。一直以来,金丝雀的价值观让我感到困惑。每次更改变量大小时,都会有不同的偏移量(从堆栈中的第一个变量和返回地址的偏移量)。从来没想过它是隐藏在那里的金丝雀价值:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多