Articles of 堆栈溢出

为什么堆栈溢出导致分段错误,而不是Linux中的堆栈溢出?

可能重复: 分段错误和堆栈溢出有什么区别? 我只是想知道,为什么堆栈溢出导致分段错误,而不是堆栈溢出。 是否因为堆栈限制的边界交叉而导致SIGSEGV? 为什么我们在Linux中不会遇到堆栈溢出,而是一个分段错误? int foo() { return foo(); } 这个小代码应该会导致堆栈溢出,但在Linux中会导致分段错误。

返回libc – 问题

我遇到了返回到libc漏洞的问题。 问题是什么都没有发生,但没有分段错误(是的,我实际上溢出堆栈)。 这是我的程序: int main(int argc, char **argv) { char array[512]; gets(array); } 我使用获取而不是strcopy,因为我的地址以0x00开头,strcpy认为它是一个string的结尾,所以我不能使用它。 这里是我需要的地址: $ gdb main core (gdb) p system $1 = {<text variable, no debug info>} 0x179680 <system> (gdb) p exit $2 = {<text variable, no debug info>} 0x16f6e0 <exit> (gdb) x/s 0xbffffe3f 0xbffffe3f: "/bin/sh" 当input正确的序列时,会发生这种情况: eleanor@eleanor32:~/testing/root$ perl -e 'print "\x41"x516 . […]

为什么在缓冲区的末尾和保存的帧指针之间有8个字节?

我正在为作业做一个堆叠砸练习,而且我已经完成了作业,但是有一个方面我不明白。 这是目标程序: #include <stdio.h> #include <stdlib.h> #include <string.h> int bar(char *arg, char *out) { strcpy(out, arg); return 0; } void foo(char *argv[]) { char buf[256]; bar(argv[1], buf); } int main(int argc, char *argv[]) { if (argc != 2) { fprintf(stderr, "target1: argc != 2\n"); exit(EXIT_FAILURE); } foo(argv); return 0; } 以下是在运行Ubuntu 12.04的x86虚拟机上禁用ASLR编译命令。 gcc -ggdb -m32 […]

在64位堆栈驻留缓冲区溢出?

我正在研究一些安全相关的事情,现在我正在玩我自己的堆栈。 我所做的应该是非常微不足道的,我甚至不试图执行堆栈,只是为了表明我可以控制64位系统上的指令指针。 我已经closures了所有的保护机制,只是为了能够使用它(NX-bit,ASLR,还用-fno-stack-protector -z execstack编译)。 我在64位汇编方面没有太多的经验,花了一些时间寻找和尝试自己,我想知道是否有人能够解决我遇到的问题。 我有一个程序(源代码如下),它只是将一个string复制到一个堆栈驻留缓冲区,没有边界检查。 但是,当我覆盖了一系列的0x41我期待看到RIP被设置为0x4141414141414141,而我发现我的RBP被设置为这个值。 我确实遇到了分段错误,但即使将RSP设置为合法值,RIP在执行RET指令时也不会更新为此(非法)值。 我甚至在GDB中validation过,在RET指令之前,在RSP上有一系列包含0x41的可读存储器。 我在LEAVE指令的印象之下: MOV(E)SP,(E)BP POP(E)BP 然而,在64位上,“LEAVEQ”指令似乎做了(类似于): MOV RBP,QWORD PTR [RSP] 我认为这只是在执行这条指令之前和之后观察所有寄存器的内容。 LEAVEQ似乎只是RET指令的一个依赖于上下文的名字(GDB的反汇编给出的),因为它仍然只是一个0xC9。 而且RET指令似乎是用RBP寄存器做些事情的,可能会解引用它? 我的印象是RET所做的(类似于): MOV RIP,QWORD PTR [RSP] 但是就像我刚才提到的那样,它似乎取消了RBP的引用,我正在考虑这样做,因为当没有其他寄存器似乎包含非法值时,我得到了分段错误。 程序的源代码: #include <stdio.h> #include <string.h> int vuln_function(int argc,char *argv[]) { char buffer[512]; for(int i = 0; i < 512; i++) { buffer[i] = 0x42; } printf("The buffer is […]

大的二维arrays给出了分段错误

我在Linux中写了一些C ++代码,我已经声明了一些2D数组,如下所示: double x[5000][500], y[5000][500], z[5000][500]; 编译期间没有错误。 当我执行它说“分段错误”。 温我把数组的大小从5000减less到50,程序运行良好。 我怎样才能保护自己免受这个问题?

forrt1:严重(170):程序exception – 堆栈溢出

并提前感谢您的帮助! 我已经编译了一个程序(我没有写),它在Mac上工作得很好,但是当我尝试在Windows上执行程序时,程序开始执行后不久就收到以下错误消息: forrt1:严重(170):程序exception – 堆栈溢出 我不是一个ifort或Fortran用户,而是试图编译一个工作程序。 我做了一个“ifort – 版本”,我正在使用版本12.0.0.104的英特尔Visual Fortran编译器XE。 我已经在这个问题上工作了好几天了,而且我也尝试了一些Makefile中的标志,但没有运气。 如果我能提供任何进一步的信息,我会尽我所能。 再次感谢!

STATUS_STACK_BUFFER_OVERRUN和STATUS_STACK_OVERFLOW有什么区别?

我刚刚发现有一个STATUS_STACK_BUFFER_OVERRUN和一个STATUS_STACK_OVERFLOW。 那两个有什么区别? 我只是发现堆栈溢出(堆栈耗尽)不同于堆栈缓冲区溢出,但要么不解释,要么我不明白。 你能帮我吗? 问候Tobias