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

tor*_*orr 3 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;
}
Run Code Online (Sandbox Code Playgroud)

nul*_*ptr 6

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

做了

for(i = 0; i < 254; i++)
    large_string[i] = 'A';
large_string[255] = '\0';
Run Code Online (Sandbox Code Playgroud)

你会得到分段错误.