동일한 IP 대역에서는 ARP를 통해 원하는 목적지에 주소를 찾을 수 있지만, 다른 대역의 IP 경로를 찾아가고자 한다면 경로를 찾아가기 위한 라우팅(Routing)이 필요하다. 라우팅은 어떤 방식으로 이루어지는지 이해한다면, 어떤 방식으로 네트워크를 통해 목적지에 도달할 수 있는지 이해할 수 있다. 스위치 vs 라우터 `스위치`는 같은 네트워크. 즉 동일한 IP 대역대를 가지는 네트워크의 데이터를 전송할 수 있도록 하는 장비이다. 그럼 이와 달리 `라우터`는 어떤 기능을 수행할까? `라우터`는 서론에서 말하였듯이 다른 IP 대역으로 갈 수 있도록 경로를 안내해주는 역할을 하게 되며 이를 `Routing`이라고 한다. 짧게 한 줄로 요약한다면, 스위치는 동일한 IP 대역(네트워크)에 속한 장비들끼리의 네..

리눅스에서 내가 원하는 프로세스를 할당하기 위해, 유저 레벨에서 fork()를 활용하여 나의 실행 프로그램을 부모로 하는 자식 프로세스를 생성할 수 있다. fork()가 어떤 식으로 동작하는지 정확히 이해하지 못한다면, 원치 않는 결과를 만들 수 있으므로 정리해보고자 한다. fork 살펴보기 리눅스에서 위와 같이 `man fork`를 입력하면 `fork()`에 대한 설명이 나온다. 간단히 설명하자면, `fork()`를 호출하는 프로세스, 즉 부모 프로세스를 그대로 복제한 새로운 프로세스를 생성한다. 또한, 실행 결과에 따라 반환 결과도 상이하다. 새로운 프로세스를 할당할 수 없는 경우는 `-1`을 반환한다. 부모 프로세스의 경우 생성한 자식 프로세스의 `pid`를 반환하며, 자식 프로세스의 경우 `0`을..
기본이 되는 배경지식들 Punycode 다양한 언어의 hostname을 표현하기 위해 ASCII로 변경하는 포맷 https://en.wikipedia.org/Punycode HSTS HTTP Strict Transport Security 다음과 같은 공격을 방지하기 위함 main-in-the-middle attacks protocol downgrade attacks cookie hijacking HTTPS를 사용할 경우, 강제적으로 https로 접속하도록 함 http를 통해 접속한 후 https로 리다이렉션 할 경우 위의 공격에 노출되게 됨 DNS DNS로 요청 정보를 보내기 전에 캐시를 확인 브라우저 내의 캐시 OS 내의 캐시 라우터 내의 캐시 ISP(Internet Service Provider) 내..

렉토피아 정혜경 강사님의 Secure & Generic C 강의를 듣고, 정리한 내용입니다. 해당 내용의 저작권은 정혜경 강사님에게 있습니다. 동적 할당 user level에서 사용할 수 있는 동적 할당으로는 대표적으로 `malloc`과 `calloc`이 있다. `malloc`은 사용하고자 하는 메모리 공간을 할당 후 별도의 초기화가 없어 쓰레기 값을 같는다. 이와 달리 `calloc`은 메모리 공간 할당 후에 할당된 공간을 모두 0으로 초기화 한다. malloc malloc은 parameter로 할당하고자 하는 크기를 받는다. 보통은 할당하고자 하는 공간의 데이터 타입에 따라 `sizeof(데이터 타입)` 연산을 통해 할당한다. 만약 malloc을 사용하여 크기가 5인 int 1차원 배열을 할당한다면 ..
렉토피아 정혜경 강사님의 Secure & Generic C 강의를 듣고, 정리한 내용입니다. 해당 내용의 저작권은 정혜경 강사님에게 있습니다. C의 Generic 데이터 타입에 상관없이 하나의 함수로 동일한 동작을 수행하도록 하는 방식이다. 예를 들어 정렬을 하고자 할 때, 데이터 타입 (int, double ...)에 따라 별도로 함수를 구성한다면 유지보수 측면에서 상당히 비효율적일 것이다. 따라서 c++의 STL과 유사한 기능을 C로도 만들 수 있다. 어떻게 하면 generic하게 코드를 구현할 수 있을까? 이는 앞서 다룬 다양한 포인터에서 `함수 포인터`, `void 포인터`와 같은 응용 포인터를 활용하면 데이터 타입에 상관없이 기능을 수행하는 함수들을 구현할 수 있다. Generic for-eac..
렉토피아 정혜경 강사님의 Secure & Generic C 강의를 듣고, 정리한 내용입니다. 해당 내용의 저작권은 정혜경 강사님에게 있습니다. 1차원 포인터 int *p, *pp; int arr[5] = {10, 20, 30, 40 ,50}, num = 10; p = arr; //p는 배열명을 받으므로, p[1]과 같이 배열처럼 사용가능. *(p++)도 가능. // index 3의 주소는 &arr[2], &p[2], (p + 2), (arr + 2), &*&*(arr + 2) pp = # 1차원 포인터는 특정한 주소를 포인트 할 수 있다. `배열 명`, `함수 명`, `&변수명`은 주소를 나타낸다. 따라서 위의 예시 코드와 같이 포인터 변수를 선언하고 배열명을 대입 연산하게 되면 포인터 p는 배열..
렉토피아 정혜경 강사님의 Secure & Generic C 강의를 듣고, 정리한 내용입니다. 해당 내용의 저작권은 정혜경 강사님에게 있습니다. 시스템에 따른 데이터 타입의 차이 사용하는 시스템(ARM, POSIX)에 따라 같은 데이터 타입이라고 하더라도 크기가 다를 수 있다. 이를 인지하지 못하고 코드를 작성한다면 원치 않는 결과를 초래한다. 예를 들어 64bit 리눅스 시스템에서 정상 동작하던 코드가 윈도우 32bit에서는 동작하지 않을 수 있다. #include int main() { unsigned int a, b; unsigned long c; a = 100000000; b = 1001; c = (unsigned long)a * b; printf("c = %lu\n", c); return 0; }..
렉토피아 정혜경 강사님의 Secure & Generic C 강의를 듣고, 정리한 내용입니다. 해당 내용의 저작권은 정혜경 강사님에게 있습니다. 연산자 우선순위 연산자 우선순위를 알지 못하고, 적절히 활용하지 못한다면 원치 않는 결과를 초래할 수 있다. 포인터를 사용하더라도 `()`에 따라 다른 결과를 만들게 된다. #include int main() { int *p; int num[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}; p = num; *p++; (*p)++; *++p; ++*p; return 0; } 간단한 코드이지만 연산자의 우선순위를 모른다면, 위의 코드가 어떤 결과를 반환하게 되는지 알 수 없을 것이다. `*p++` 포인터가 가르키는 위치를 1 증가시킨다. 이는 `*` 보..