粉碎堆栈:为什么这段代码有效?

时间:2013-07-14 13:32:48

标签: c stack buffer-overflow

我正在关注“粉碎堆栈以获取乐趣和利润”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 个答案:

答案 0 :(得分:6)

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

成功

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

你会得到分段错误。

答案 1 :(得分:1)

可能实施发生以将large_string初始化为全零。并且strcpy实际上复制了一个空字符串。

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

这会导致分段错误。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

您尚未正确初始化large_string

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

large_string[255] = '\0';

最好初始化数组,而不是现在它正在放置垃圾值。

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

修改:

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