- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
请解释在运行程序后堆栈粉碎的以下结果,其中我提供的输入远远超过字符数组的容量。
*** stack smashing detected ***: ./a.out terminated
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6(__fortify_fail+0x48)[0xb7f856d8]
/lib/tls/i686/cmov/libc.so.6(__fortify_fail+0x0)[0xb7f85690]
./a.out[0x804845f]
[0x666a6473]
======= Memory map: ========
08048000-08049000 r-xp 00000000 08:07 91312 /home/mawia/a.out
08049000-0804a000 r--p 00000000 08:07 91312 /home/mawia/a.out
0804a000-0804b000 rw-p 00001000 08:07 91312 /home/mawia/a.out
084cd000-084ee000 rw-p 084cd000 00:00 0 [heap]
b7e6d000-b7e7a000 r-xp 00000000 08:07 221205 /lib/libgcc_s.so.1
b7e7a000-b7e7b000 r--p 0000c000 08:07 221205 /lib/libgcc_s.so.1
b7e7b000-b7e7c000 rw-p 0000d000 08:07 221205 /lib/libgcc_s.so.1
b7e8a000-b7e8b000 rw-p b7e8a000 00:00 0
b7e8b000-b7fe3000 r-xp 00000000 08:07 238955 /lib/tls/i686/cmov/libc-2.8.90.so
b7fe3000-b7fe5000 r--p 00158000 08:07 238955 /lib/tls/i686/cmov/libc-2.8.90.so
b7fe5000-b7fe6000 rw-p 0015a000 08:07 238955 /lib/tls/i686/cmov/libc-2.8.90.so
b7fe6000-b7fe9000 rw-p b7fe6000 00:00 0
b7ff6000-b7ff9000 rw-p b7ff6000 00:00 0
b7ff9000-b8013000 r-xp 00000000 08:07 221196 /lib/ld-2.8.90.so
b8013000-b8014000 r-xp b8013000 00:00 0 [vdso]
b8014000-b8015000 r--p 0001a000 08:07 221196 /lib/ld-2.8.90.so
b8015000-b8016000 rw-p 0001b000 08:07 221196 /lib/ld-2.8.90.so
bfd00000-bfd15000 rw-p bffeb000 00:00 0 [stack]
Aborted
请解释以下内存映射的细节以及本报告中给出的各种细节的意义。
编辑:
代码只是简单地输入一个字符串。我故意输入的字符串的大小大于我定义的字符数组的长度,以产生堆栈粉碎。代码:
int main()
{
int a;
char s[10];
scanf("%s",s);
return 0;
}
谢谢。
最佳答案
编辑:只需重新阅读您的问题的标题。你想知道为什么它被称为 Stack Smash。当您调用在 C 中创建的数组的函数时,会为您的所有局部变量、函数的参数和函数的返回地址生成一个框架。这个框架是在堆栈上制作的,被称为堆栈框架;听起来很公平。这个栈帧应该只属于那个函数,并且应该与它周围的其他栈帧有边界;如果它可以改变其他堆栈框架,后果可能是可怕的。它会打破整个“功能有自己的范围”的想法。因此,因为你的数组是一个局部变量,它被放置在那个堆栈帧中,当你在其中放置太多信息时,你只是继续写入,直到到达堆栈帧的边界,然后你继续前进,C 将让你那样做。它设定了界限并让您随意打破它们。这种超出框架边界的行为被称为“粉碎”堆栈,因为您正好跑过其他重要数据。破坏堆栈就是在不应该写入的地方破坏堆栈数据。
首先我应该说它不会给你太多信息,除非你碰巧知道哪些 c 指令被放置在内存的哪个部分。
回溯会告诉您在失败之前正在运行的代码;即你的程序在你溢出的数组上调用了 libc 代码。
内存映射告诉您内存的哪些部分专用于什么,例如您的程序在哪里,它调用的库在哪里,堆在哪里以及堆栈在哪里。它还为您提供了那些内存位置 rwxp 的权限(读取、写入、可执行、PROC_STACK),尽管我不确定 PROC_STACK 位。
基本上,除非您知道您的程序在内存中的映射,否则这是无用的信息。您也可以使用更有用的调试器。这告诉你一些事情:
我假设您知道您的数组是在调用它的函数的堆栈帧中初始化的,因此,当您压入太多值时,您会离开帧并破坏堆栈。
希望对您有所帮助。如果您想了解更多,请询问。
关于有人可以协助解释具有术语 'stack smash' 的回溯输出吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/789900/
我需要将对象的引用传递给构造函数。我在构造函数中传递了一个引用,但它给出了这个错误:Member "Smash::smash"is not a type name. 粉碎.h: #pragma onc
我看到很多答案,比如 this , 和 this网上说要用otool命令检查 stack_chk_guard和 stack_chk_fail在项目上。 问题是,我不知道 otool 必须应用到哪个文件
我正在尝试像描述的那样进行缓冲区溢出 here ,直到我暴力强制它才找到返回指针的偏移量,我发现它是21。继此stackoverflow post ,我得到了以下内存转储: (gdb) r 21 Th
我正在尝试连接两个字符串,然后在 UNIX 环境中进行系统调用。该程序执行了我想要的操作,但终止并出现错误 *** 检测到堆栈粉碎 *** 为什么会发生这种情况? 这是我的代码: main(int a
请解释在运行程序后堆栈粉碎的以下结果,其中我提供的输入远远超过字符数组的容量。 *** stack smashing detected ***: ./a.out terminated
我写了一个非常简单的 C++ 程序来生成随机字符串。在执行以下代码时,它会给出“检测到堆栈粉碎”。 #include #define SIZE 30 using namespace std; int
我正在尝试从 Smashing the Stack for Fun and Profit 做一个例子在 C 中,但我有点卡在某个点上,以下是代码(我有一台 64 位机器和 Ubuntu 64 位):
我正在使用从单个文件读取并使用 sprintf 将该数据写入多个文件的 C 程序,我在某处出错了,但我真的不知道在哪里这会导致此错误: *** stack smashing detected ***
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
这个问题已经有答案了: 奥 git _a (10 个回答) 已关闭 9 年前。 我正在用 C 语言编程并使用 gcc 进行编译。每次编译时,我都会收到堆栈粉碎检测到的错误。这是什么意思以及如何解决它?
所以我允许一个人测试我的 Socket 程序,他们通过消息将其设置为段错误: *** 检测到堆栈粉碎 ***:./myProgram 已终止 据我所知,这是一个 gcc 编译器功能,可以检测堆栈何时变
下面是一个名为 scrabble.c 的程序的代码片段,该程序用于玩该游戏的简化版本。用户会收到 7 个随机字符,然后被告知使用这些字符输入一个单词。我在使用接受用户输入并将其存储在数组中的函数时遇到
#include #include int main() { char str[] = "my name is khan. and i am not a terrorist\n";
我对 C 语言有非常初步的了解(尽管我确实了解一般的编程概念)。我的任务是创建一个缓冲区溢出,它会产生一些东西(比如访问未授权区域、免费资金等),而不仅仅是让程序崩溃。 我已经尝试过不同大小的缓冲区,
我需要使用 malloc 分配一个数组,并且我必须从输入中读取一些数字。这是我的代码: #include #include void read(int **array, int *array_si
这是我的代码。 struct ar { char array[10]; }b; void func() { char array[10]; scanf("%s",b.array
考虑以下非常基本的程序,它已以多种形式出现在此处的其他问题上。 #include int main() { char message[8]; strcpy(message, "Hel
这个问题不太可能帮助任何 future 的访客;它仅与一个小地理区域、一个特定时刻或一个非常狭窄的情况相关,而这些情况通常不适用于互联网的全局受众。如需帮助使这个问题更广泛地适用,visit the
我需要知道在哪里可以更改咒语的范围 - THAIL SMASH 71077 关于这个咒语,我在 C++ 代码中唯一能看到的是: events.ScheduleEvent(EVENT_TAIL_SMAS
当执行下面的代码时,我得到一个Stack Smashing错误。 const uint size = 62; ... for (int i=0; i < 10; ++i){ // mask =
我是一名优秀的程序员,十分优秀!