- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当运行以下故意堆栈粉碎代码时,strcat 将 source 的值复制十次。
#include <stdio.h>
#include <stdlib.h>
int main() {
char a[16];
char b[16];
char c[32];
strcpy(a, "abcdefghijklmnop");
printf("a = %s\nb = %s\nc = %s\n\n", a, b, c);
strcpy(b, "ABCDEFGHIJKLMNOP");
printf("a = %s\nb = %s\nc = %s\n\n", a, b, c);
strcpy(c, b);
printf("a = %s\nb = %s\nc = %s\n\n", a, b, c);
strcat(c, b);
printf("a = %s\nb = %s\nc = %s\n\n", a, b, c);
return 0;
}
输出:
a = abcdefghijklmnop b = c =
a = abcdefghijklmnopABCDEFGHIJKLMNOP b = ABCDEFGHIJKLMNOP c =
a = abcdefghijklmnopABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP b = ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP c = ABCDEFGHIJKLMNOP
a = abcdefghijklmnopABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP b = ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP c = ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP
** stack smashing detected *: ./strcpytest terminated
构建参数:
gcc -O0 -g3 -Wall -c -fmessage-length=0
代码在 x86_64 架构上运行。
为什么只连接十次?
最佳答案
对于重叠字符串,strcpy() 和 strcat() 的行为未定义。因此,您对 c[] 的两次写入都是可疑的,您不仅仅是测试破坏堆栈,还测试编译器对这种未定义行为的处理。
我预计 strcpy(c, b) 行会失败,但实现必须以某种方式获取 b 的长度,然后才能覆盖 c 开头的尾随零。例如,如果它从最后一个字节复制到第一个字节,则可能会发生这种情况。
strcat(c, b) 可以以更直接的方式实现。也许十倍的数据足以达到终止它的某个限制。
如果您只想测试是否损坏堆栈,请不要使用这些方法。相反,只需使用一个数组,并用循环写入其末尾,例如“for (i = 0; i < 1000000; i++) c[i] = 'h';”
关于c - Strcat 堆栈粉碎行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23554887/
Video explaining for those who does not understand 此答案未正确回答,请尝试使用其他解决方案来回答(100 Bounty 已过期) 同样的问题,但解释
我有一个使用线程来从文件中读取一些内容的 Activity 。 问题是,如果用户决定在线程运行时旋转屏幕,应用程序就会崩溃。 我知道我可以使用以下方法阻止屏幕旋转: android:screenOri
我正在上计算机安全课并且正在阅读 http://phrack.org/issues/56/8.html .在 bo3.cpp 中,作者创建了他自己的 VTABLE,并覆盖 VPTR 以指向他的 VTA
我们在 Mesos 0.17 上针对 CDH5 运行 Spark 0.9.1。到目前为止,我们继续使用 CDH 系列的“mr1”版本,以便我们可以运行 filecrush。项目在我们的小文件上。由于各
我知道如何删除文件以使它们无法恢复。但是,如何以导致相同结果的方式从 POSIX 环境中的 MySQL 表中删除行?在继续删除该行之前,我目前正在使用与原始数据长度相同的无效字符串重写所有数据。它有效
我有一个如下所示的 XML 文件:
我正在尝试使用 Tween 和平面几何在 Three.js 中创建玻璃 splinter 效果,但有点迷失。网格/几何体不会随补间更新,如果我在第一次渲染之前调用 shatter(),您可以看到补间正
我正在尝试使用我在 XML 中接收的一些日志数据。 在清理数据以使其成为有效的 XML 之后,我在 SQL Server 中获得了 XML 数据包。 (并从 JSON 包装器等中获取其他属性) 但是现
当我将 slim-rails 添加到 Gemfile 并启动我的应用程序时,它崩溃并出现以下错误: /Users/rado/.rbenv/versions/2.3.1/gemsets/project/
我是一名优秀的程序员,十分优秀!