【发布时间】:2009-04-25 23:01:11
【问题描述】:
请解释运行程序后堆栈粉碎的以下结果,其中我提供的输入远大于字符数组的容量。
*** 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;
}
谢谢。
【问题讨论】:
-
你贴的没用,贴出你的源码吧。
-
我可以从回溯中唯一知道的是您没有使用兼容 VDSO(这与这个问题完全无关)。除此之外,如果没有代码的链接(或发布),输出将毫无用处。但是,请不要投票结束这个问题,这是一个有效的问题,只有 17 小时,有些人需要几天时间根据提供的答案更新他们的问题。
-
我还想到您可能正在使用、返回和修改静态分配的数组..但是我的答案应该足够通用,让您可以在自己的代码中找到相同的模式..但是 functionb( ) 可能会破坏 functiona() 的堆栈,如果这确实是你在做的。
-
考虑打开一个关于如何读取内存映射的新问题,可能链接到这个问题。或者,考虑更改此问题的标题。