본문 바로가기

전체 글

(30)
[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 언어는 컴퓨터 공학을 이수하고자 할 때 반드시 거쳐야 하는 언어입니다. 그래서 처음 컴퓨터 공학을 시작할 때 배우게 되는 이 언어는 습관처럼 코드를 작성하게 되고 프로그램의 동작 관점에서 프로그래밍을 하게 되는 사람이 많습니다. 물론, 저 또한 오랫동안 그래 왔다고 생각합니다. 또한 직접 메모리에 접근하고 바로 컴파일이 되는 언어이고 링킹 과정을 생각하고 프로그램을 만들어야 하는 언어이기 때문에 메모리 누수 이외에도 많은 취약성을 알고 프로그래밍을 해야 합니다. 저는 사실 이러한 취약성들을 알아가는 과정에 "빠르게 변..
[백준] 4963번 섬의 개수 문제 위치 : https://www.acmicpc.net/problem/4963 1. Approach (1) BFS 탐색으로 접근한다. -> 플러드필 알고리즘을 응용한다면 풀 수 있다. 그래프 이론, 영상 처리에서 많이 사용하는 알고리즘이기 때문에 짚고 넘어가는 것을 권장한다. - 아이디어는 시작 좌표부터 끝 좌표까지 조건에 충족하는 좌표에서 부터 BFS를 실행한다. - 방문한 곳들은 전부 check한다. - BFS를 한 번 실행시킬 때 마다 섬의 개수를 1 증가시킨다. 2. Source Code #include #include #include #define MAX 51 using namespace std; int map[MAX][MAX]; bool check[MAX][MAX]; int dx[] = { ..
[백준] 2306번 유전자 문제 위치 : https://www.acmicpc.net/problem/2306 1. Approach (1) 다이나믹 프로그래밍으로 접근한다. -> KOI 유전자가 될 수 있는 최대 길이를 문자열의 처음, 끝부터 분할해나가면서 확인한다. (2) DP 배열 정의 -> DP[s][e] : start 부터 end 까지 KOI의 최대 길이 (3) 후기 1. 문자열의 특정 패턴, 조건 등으로 길이를 구할 때 사용할 수 있다. 2. Source Code #include #include #include #include #define MAX 500 #define START0 'a' #define END0 't' #define START1 'g' #define END1 'c' using namespace std; /* ..
[백준] 1949번 우수 마을 문제 위치 : https://www.acmicpc.net/problem/1949 1. Approach (1) 트리를 이용한 다이나믹 프로그래밍으로 접근한다. - 모든 마을 간 연결을 한 후에 문제에 나와 있듯이 Tree 구조로 만든다. - 현재 마을이 우수 마을로 선정되었다면 이어져있는 다음 마을들은 우수 마을이 되면 안된다. - 현재 마을이 우수 마을로 선정되지 않았다면 이어져있는 다음 마을들은 우수 마을이 되거나, 아니어도 된다. - 경우의 수는 다음 마을이 우수 마을이 되지 않는 경우 1가지 - 현재 마을이 우수 마을이 아닐 경우에는 다음 마을이 우수 마을이 되는 경우 2가지가 있다. (2) DP 배열 정의 -> DP[idx][2] : idx 마을이 선정되거나 안되었을 경우 (0 or 1) 까지의 ..