본문 바로가기

CERT C/전처리기

(4)
[CERT C/전처리기] (3) 복수 구문의 매크로 취약성 의미 매크로를 복수 구문으로 사용할 때는 "\" 문자를 이용해서 작성할 수 있다. #define SWAT(X,Y) \ tmp = x; \ x = y;\ y = tmp; 동작 방식 간단한 한 가지 구문보다 많은 구문을 매크로로 사용할 수 있다. 문제 코드 1. 헤더 파일에 항상 인클루전 가드를 둬라 출력을 예상해보기 #define SWAP(x,y) \ tmp = x; \ x = y;\ y = tmp; int main() { int x = 3, y = 3; if(x != 2) SWAP(x,y); return 0; } if 문에서 원하는 동작을 하지 않고 오류가 나게 됩니다. 취약점 분석 및 해결 코드 1 분석 : if 문에서 tmp = x; 구문만 실행이 되고 ( 물론, tmp에서 오류가 나게 됩니다. ) ..
[CERT C/전처리기] (2) 인클루전 가드 미처리의 취약성 의미 인클루전 가드란, 여러 개의 같은 헤더파일이 include 되지 않도록 조건을 통해 발생할 수 있는 에러를 막아주는 기능이다. 동작 방식 이미 존재하는 헤더 파일을 추가시키려고 할 때, 인클루전 가드에 의해서 걸러지므로 헤더 파일 충돌이 일어나지 않는다. 문제 코드 1. 헤더 파일에 항상 인클루전 가드를 둬라 main 함수에서 빌드를 할 경우 출력을 예상해보기 // person.h struct Person { /* contents */ } // student.h #include Person stdudent1; /* contents */ // student.h #include Person stdudent1; /* contents */ 정답은 위에서 말했다시피 헤더파일 충돌로 오류가 나게 됩니다. 취약..
[CERT C/전처리기] (1) 매크로 함수의 취약성 의미 매크로 함수란, #define 지시문에 인수로 함수의 정의를 전달하여서 함수처럼 동작하는 매크로이다. 동작 방식 매크로 함수는 인수를 컴파일 이전에 미리 치환하는 동작 방식이다. 문제 코드 1. 인자에 대한 연산이 발생시키는 오류 출력을 예상해보기 #include #define CALC(x) ((x) * (x)) int main() { int a = 2; int b = CALC(++a); printf("%d\n", b); return 0; } 정답은 "전처리기에 따라 달라진다" 입니다. 취약점 분석 및 해결 코드 1 분석 : 사용자가 a를 ++로 3인 상태를 넘겨서 3 * 3 = 9인 값을 원했다면 원하는 답이 나오지 않을 가능성이 높습니다. 3 * 4 = 12가 나올 수도 있고 4 * 4 = 16..
[CERT C] 전처리기 의미 전처리기란, 프로그램이 컴파일이 되기 이전에 프로그램의 조건에 맞추기 위해 수행하는 사전 처리 프로그램입니다. 문제 코드 다음 코드가 전처리기에 의해서 어떻게 바뀔지 생각해보시길 바랍니다. (문제가 있는 코드가 아닌 그냥 생각해보는 문제입니다) #include int main() { printf("Hello World!"); return 0; } 위 문제의 정답은 stdio.h 헤더 파일에 있는 소스가 그대로 치환되어서 실행이 됩니다. 즉, 매크로 입니다. #이 들어가는 지시어를 전처리기가 처리하는 것을 모르시는 분들도 많았을 겁니다. 전처리기가 처리하는 지시어들은 #define, #include, #undef, #if . . . 등이 있습니다. 전처리기에 의해서 처리되는 구문들이 어떠한 취약성을 ..