3

我正在关注“为了乐趣和利润而粉碎堆栈” http://insecure.org/stf/smashstack.html

我想知道为什么我的代码可以正常工作,尽管我编写它是为了造成分段错误。

#include <stdio.h>
#include <string.h>

void function(char *str){
    char buffer[16];
    strcpy(buffer, str);
}

int main(void)
{
    char large_string[256];
    int i;

    for(i = 0; i < 255; i++)
        large_string[i];

    function(large_string);
    return 0;
}
4

4 回答 4

6

这只是因为您large_string的初始化不正确:它包含垃圾,并且它的长度(直到 的字节数'\0')很可能远小于 256(例如,在我的机器上,第四个字节large_string为零,因此strcpy仅复制 4 个字节)。

做了

for(i = 0; i < 254; i++)
    large_string[i] = 'A';
large_string[255] = '\0';

你会得到分段错误。

于 2013-07-14T13:38:18.943 回答
1

可能,实现恰好初始化large_string为零。并且strcpy实际上复制了一个空字符串。

for(i = 0; i < 255; i++)
    large_string[i] = 'a';

这将导致分段错误。

于 2013-07-14T13:40:59.600 回答
0

您正在初始化字符串,large_string[256];然后检查它的项目。你没有通过数组的限制,所以没有分段错误。

如果您将值放入数组中,则程序将崩溃,因为strcpy将超出范围

于 2013-07-14T13:36:16.297 回答
0

你没有large_string正确初始化。

在 for 循环之后,在数组末尾添加\0可能有帮助的空字符。

large_string[255] = '\0';

最好初始化数组,而不是像现在这样放置垃圾值。

 for(i = 0; i < 255; i++)
    large_string[i] = 'a';

编辑:

正如评论中所说,junix 说 - 更重要的是,\0至少 16 个字节没有比在 Byte 255 处有一个 \0 来引发堆栈粉碎 ;-)

于 2013-07-14T13:39:35.850 回答