我正在尝试学习基于堆栈的溢出,并编写一个简单的代码来利用堆栈。但不知何故,它根本不能工作,只是在我的机器上显示了中止陷阱(mac os leopard)。
我猜Mac os对待溢出的方式不同,它不允许我通过c代码重写内存。例如,
strcpy(buffer, input) // lets say char buffer[6] but input is 7 bytes
在Linux机器上,此代码成功覆盖下一个堆栈,但在mac os上被阻止(中止陷阱)
有人知道如何在mac机器上执行简单的基于堆栈的溢出吗?
我正在使用系统Linux x86学习基于程序集的函数堆栈。
我读过一些文章,其中告诉我函数堆栈(callee)将保存调用方调用它的返回地址,这样计算机就可以知道函数返回时应该在哪里继续。
这就是为什么会有一种攻击:堆栈粉碎。堆栈崩溃意味着,如果我们能够溢出一个函数堆栈,特别是溢出指定地址的返回地址,程序就会执行黑客的代码。
然而,今天我尝试使用gdb检查一个简单的c++程序,如下所示,但是在任何函数堆栈中都找不到保存的返回地址。以下是代码:
void func(int x)
{
int a = x;
int b = 0; // set a breakpoint
}
int
为了解释我的问题,我将首先提供一些代码,并解释它的功能:
% 1 1 65532{}for % cut off on mac with font set
% 1 1 99996{}for % cut off on mac without font set
% 1 1 300048{}for % cut off on linux with font set
% 1 1 300368{}for % cut off on linux without font set
% /Times-Roman findfont 10 scalefont setfont
showpage
当我
我试图在Eclipse中构建一个C++程序,它使用库xerces-3.1.1-x86_64-linux 3.4(二进制)。我看到下面的错误..。
relocation truncated to fit: R_X86_64_PC32 against undefined symbol xercesc_3_1::AbstractDOMParser::adoptDocument()
undefined reference to xercesc_3_1::AbstractDOMParser::adoptDocument()
查看了堆栈溢出()的链接,了解了这是什么类型的错误,但没有得
给定具有无限递归的C程序:
int main() {
main();
return 0;
}
为什么这会导致堆栈溢出。我知道这会导致C++中的未定义行为来自下面的线程 (并且作为边节点,不能在C++中调用main() )。然而,val差尔告诉我,这会导致堆栈溢出:
Stack overflow in thread 1: can't grow stack to 0x7fe801ff8
最后,由于分段错误,程序结束:
==2907== Process terminating with default action of signal 11 (SIGSEGV)
==290
据我所知,典型的缓冲区溢出攻击发生在攻击溢出堆栈上的内存缓冲区时,从而允许攻击者注入恶意代码并重写堆栈上的返回地址以指向该代码。
在使用盲目地将数据从一个区域复制到另一个区域的函数(如sscanf)时,这是一个常见的问题,检查一个区域的终止字节:
char str[8]; /* holds up to 8 bytes of data */
char *buf = "lots and lots of foobars"; /* way more than 8 bytes of data */
sscanf(buf,