Isnt Segmentation故障与粉碎堆栈相同吗?

时间:2012-12-15 16:16:32

标签: segmentation-fault exploit

由于编程错误,我们会出现分段错误。但作为一个必要的工具,我们尝试相同的东西,但内核将其检测为粉碎堆栈。内核究竟如何看待差异?

2 个答案:

答案 0 :(得分:3)

简单地说,没有。分段错误是指内核能够检测到无效的内存访问,然后终止进程。内核无法检测到一些无效的内存访问,并且堆栈溢出建立在这些上。但是,堆栈溢出可以由编译器检测到,并且是最新版本的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

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

答案 1 :(得分:0)

  

Isnt Segmentation故障与粉碎堆栈相同?

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

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

  

由于编程错误,我们会出现分段错误。

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

  

但作为一种必要的工具,我们尝试相同的东西,但内核会将其检测为粉碎堆栈。

我不知道你刚刚说了什么,但是内核没有检测到“粉碎堆栈”。

  

内核究竟如何看待差异?

什么区别?