strcpy function null byte vulnerability
https://dreamhack.io/wargame/challenges/9
다음 문제를 풀면서 strcpy 에서 나올 수 있는 취약점에 대해 다룬다.
일단 항상 말하지만 함수에 대해 이럴때 그냥 man 이 사기이다.
man strcpy 하면
C
stpcpy(char *restrict dst, const char *restrict src)
{
char *p;
p = mempcpy(dst, src, strlen(src));
*p = '\0';
return p;
}
char *
strcpy(char *restrict dst, const char *restrict src)
{
stpcpy(dst, src);
return dst;
}
char *
strcat(char *restrict dst, const char *restrict src)
{
stpcpy(dst + strlen(dst), src);
return dst;
}다음과 같이 어떻게 작동하는지 코드를 보여준다. (진짜 사기 )
여기서 자세히 보면 strcpy 가 stpcpy 함수를 사용하다.
stpcpy는 mempcpy 를 사용한다. mempcpy 의 결과값은 복사를 끝낸 문자열의 다음 바이트이다.
C
p = mempcpy(dst, src, strlen(src));
*p = '\0';근데 자세히 보면 복사를 끝낸 문자열 다음에 '\0' 을 붙이는 것을 확인할 수 있는데
여기서 취약점이 발생할 수 있다.
C
int cpy()
{
char real_name[256];
strcpy(real_name, cp_name);
return 0;
}예를 들어 다음과 같은 코드일때 real_name 스택 버퍼 다음 1바이트를 0으로 바꿀 수 있다. 이를 통해 다양한 취약점으로 이어질 수 있다. 예를 들어 해당 문제에서는 FPO 취약점이다