・実行後の指しているところを誤認識している
・コピーされる側に十分な領域がない
・NULLはヌルポインタの為にあるのであって、NUL文字の為にあるわけではない

char *my_strcpy(char *s1, char *s2){
char *p = s1;
while(*s2){
*s1 = *s2;
s1++;
s2++;
}
*s1 = '\0';
return p;
}
という感じで。
while(*s1++ = *s2++) ; とするのが多いと思うけれど、それはもう少し理解が進んでから。