我正在尝试学习基于堆栈的溢出,并编写一个简单的代码来利用堆栈。但不知何故,它根本不能工作,只是在我的机器上显示了中止陷阱(mac os leopard)。
我猜Mac os对待溢出的方式不同,它不允许我通过c代码重写内存。例如,
strcpy(buffer, input) // lets say char buffer[6] but input is 7 bytes
在Linux机器上,此代码成功覆盖下一个堆栈,但在mac os上被阻止(中止陷阱)
有人知道如何在mac机器上执行简单的基于堆栈的溢出吗?
为了解释我的问题,我将首先提供一些代码,并解释它的功能:
% 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
当我
据我所知,典型的缓冲区溢出攻击发生在攻击溢出堆栈上的内存缓冲区时,从而允许攻击者注入恶意代码并重写堆栈上的返回地址以指向该代码。
在使用盲目地将数据从一个区域复制到另一个区域的函数(如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,
我正在使用系统Linux x86学习基于程序集的函数堆栈。
我读过一些文章,其中告诉我函数堆栈(callee)将保存调用方调用它的返回地址,这样计算机就可以知道函数返回时应该在哪里继续。
这就是为什么会有一种攻击:堆栈粉碎。堆栈崩溃意味着,如果我们能够溢出一个函数堆栈,特别是溢出指定地址的返回地址,程序就会执行黑客的代码。
然而,今天我尝试使用gdb检查一个简单的c++程序,如下所示,但是在任何函数堆栈中都找不到保存的返回地址。以下是代码:
void func(int x)
{
int a = x;
int b = 0; // set a breakpoint
}
int