본문 바로가기

분류 전체보기

(33)
[CERT C/선언과 초기화] (3) 기억클래스 취약성 의미 기억클래스란 변수의 값이 어떤 종류의 메모리에 저장되는지를 지정하는 것을 의미한다. auto, register, static으로 구성되어있다. auto 변수 함수, 블록 내부에서 사용되고 흔희 local 변수라고 불린다. 기억 클래스가 명시되지 않고 선언된 변수는 모두 자동 변수이다. 스택 공간을 사용하며, 함수나 블록에서 기억 영역이 확보되고, 벗어나면 소거됩니다. ** return 문에서 return 되는 값은 외부에서 기억영역을 호가보하게된다. register 변수 CPU가 연산 시 데이터를 임시로 저장하는데 사용하는 작고 빠른 기억장소이다. 2개까지만 선언 가능하고, 초과된 변수는 AUTO 변수로 지정된다. 레지스터에는 주소가 없으므로 참조가 불가능하다. static 변수 프로그램이 종료될 ..
[CERT C/선언과 초기화] (2) 가변인자 함수 사용 시 주의할 점 의미 가변인자 함수는 인자의 개수가 정해지지 않은 함수를 의미한다. 예를들면 printf, scanf 함수가 가변인자 함수이다. int printf(const char*, ...); int scanf(const char*, ...); 동작 방식 상황에 따라 들어오는 인자의 개수가 다르므로 에 정의 되어있는 함수를 이용해서 다룬다. 1. va_list args 가변 인자 목록, 가변 인자의 메모리 주소를 저장하는 포인터이다. va_list : char *형 args : argument를 가리키는 포인터 2. va_start(args, 마지막 고정인수) 가변 인자를 가져올 수 있도록 포인터를 설정한다. 3. va_arg(args, type) 가변 인자 포인터에서 특정 자료형 크기만큼을 가져온다. 4. va_..
[CERT C/선언과 초기화] (1) 코드의 가독성을 높이기 위해 타입 정의를 사용하라 의미 C 언어 같은 경우, 함수 포인터를 이용한 함수들은 타입을 읽을 때 가독성이 떨어지는 경우가 많다. 아래 signal 함수로 예를 들어본다. void(*signal(int signum, void (*handler)(int)))(int) signal 함수를 반환하는 부분과 매개변수 부분으로 나누어보면 (1) signal 함수는 두 개의 파라미터를 가진다. signal(int signum, void (*handler)(int)) (2) signal 함수가 반환하는 값은 void (*)(int); -> 함수 포인터 형이며 반환 값이 없고 int 매개변수를 받는 함수를 가르리키는 포인터이다. 문제 코드 1. 함수의 선언이 읽기도 어렵고 이해하기 힘들다. #include int (*getFunction(in..
[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 . . . 등이 있습니다. 전처리기에 의해서 처리되는 구문들이 어떠한 취약성을 ..
What is CERT C 의미 CERT C Coding Standard는 SW 개발자들을 한 가이드라인의 집합이자 C 언어의 보안 취약성 및 노출 등을 방지하기 위한 가이드라인입니다. Why do CERT C? C 언어는 컴퓨터 공학을 이수하고자 할 때 반드시 거쳐야 하는 언어입니다. 그래서 처음 컴퓨터 공학을 시작할 때 배우게 되는 이 언어는 습관처럼 코드를 작성하게 되고 프로그램의 동작 관점에서 프로그래밍을 하게 되는 사람이 많습니다. 물론, 저 또한 오랫동안 그래 왔다고 생각합니다. 또한 직접 메모리에 접근하고 바로 컴파일이 되는 언어이고 링킹 과정을 생각하고 프로그램을 만들어야 하는 언어이기 때문에 메모리 누수 이외에도 많은 취약성을 알고 프로그래밍을 해야 합니다. 저는 사실 이러한 취약성들을 알아가는 과정에 "빠르게 변..