Security/System Hacking

[BOF] strcpy 와 strncpy 함수의 취약점

취약점을 공부하시는 분들 대다수는 Memory Corruption 취약점에대해 잘 알고 계실것입니다. 


길이(메모리 경계) 를 검사하지 않는 함수는 buffer overflow에 취약하여 Exploit당하기 쉽죠.

- BOF에 취약한 대표적인 함수 : strcpy , strcmp, gets, scanf, strcat, getwd, sprintf 등등


그래서 보통은 strncpy 같은 길이를 검사하는 함수를 쓰게되는데 .. 이함수도 bof에 안전한건 절대 아니였다.  나도 항상 길이를 검사하면 괜찮겠지 했는데 그게아니였다 ㅇㅅㅇ;; 


먼저 strcpy , strncpy 함수부터 알아봅시다. 


strcpy : NULL문자를 만나기 전까지의 문자열을 복사합니다.

strncpy : 문자열을 지정된 길이만큼 복사합니다. 


strcpy 함수는 길이를 검사하지 않는 함수이기 때문에 BOF 에 취약합니다. 비쥬얼스튜디오에서 컴파일을 시도하면 컴파일오류가 나더군요? 함수딴거쓰라고 ㅋㅋ...


strncpy 함수도 프로그래머의 부주의에 의해서 충분히 BOF가 발생할 수 있었습니다.


간단한 예제소스를 봅시다.


#include<stdio.h> #include<string.h> int main(int argc, char *argv[]){ char buffer[10]; int length; length = strlen(argv[1]); strncpy(buffer,argv[1],length); // 버퍼의 크기보다 큰값이 들어갈 수 있음. }


프로그래머의 부주의로 의해 BOF가 발생하는 경우 입니다. 버퍼의 크기보다 더 큰 문자열이 들어갈 경우 오버플로우가 발생합니다. 


정해진 자료형보다 큰 수를 저장할때 음수로 인식해 발생하는 경우도 있습니다. 이것도 역시 프로그래머의 부주의로 발생하는 경우입니다. 글자수를 측정해 조건문으로 실행함에도 취약점이 있네요.

#include<stdio.h> #include<string.h> int main(){ char length = 0; char buffer[20] = {0,}; length = strlen(argv[1]) // 128바이트 이상 입력시 음수로 인식됨 if(length>20){ printf("에러! 20바이트를 넘어섰습니다 !"); }else{ printf("글자수를 만족합니다. 함수를 실행합니다"); // 프로그래머 부주의 strcpy(buf,argv[1]); } }