8

以下のコードの出力は「Overflow」ですが、関数を明示的に呼び出していませんfunc。それはどのように機能しますか?

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

int copy(char *input)
{
    char var[20];
    strcpy(var, input);
    return 0;
}

int func(void)
{
    printf("Overflow\n");
    return 0;
}

int main(int argc, char *argv[])
{
    char str[] = "AAAABBBBCCCCDDDDEEEEFFFFGGGG";
    int *p = (int *)&str[24];
    *p = (int)func;

    copy(str);
    return 0;
}
4

1 に答える 1

11

関数は関数内のバッファをcopyオーバーフローさせ、戻りアドレスを関数のアドレスで上書きします。varcopymainfunc

関数が戻るとき、関数呼び出しの後copyに戻るのではなく、関数に戻ります。maincopyfunc

于 2012-11-13T13:27:06.373 に答える