웹 공부 중에 리액트, 스프링을 접하게 되었는데 프레임워크와 라이브러리의 차이가 궁금해서 찾아보았다. 프레임워크 (Framework) 쉽게 말해 웹이나 앱 등을 개발할 때 도와주는 역할을 하는 것. 기본적인 기능이 있어 소프트웨어에 필요한 기능을 넣는 것에만 집중하면 된다. 예컨대, 샤브샤브를 만들 때 밀키트를 사용하는 것과 사용하지 않는 것을 비교하면 당연히 밀키트를 사용하는 것이 훨씬 편하고 시간을 단축할 수 있다. 즉, 샤브샤브를 만들기 전에 갖가지 재료를 구매해서 손질하는 등의 여러 과정을 무시하고 만드는데만 집중할 수 있다. 왜? 개발하는 과정에서 중복되는 작업들을 미리 짜놓는 과정에서 프레임워크가 탄생했다. 우리도 비슷하거나 같은 일을 반복할 때 미리 틀을 짜놓고 쓰기만 하면 여러 번..
전체 글
* SQL injection : 기존 SQL에 악의적인 구문을 삽입해 공격하는 방법 * Command injection : 쉘을 실행시키는 로직을 이요한 공격으로 시스템의 권한을 탈취하는 방법 * File Upload Attack : 공격 스크립트가 담긴 파일을 서버로 업로드하는 공격 * CSRF(Cross-site Request Forgery) : 공격자가 서비스를 사용하는 사람을 이용해 요청을 보내는 공격 * XSS(Cross-Site Script) : 웹 페이지에 악성 자바스크립트를 삽입하는 공격 ...
유형 RCE(remote code execution) CWE-119 exploit-db https://www.exploit-db.com/exploits/44294 Firefox 44.0.2 - ASM.JS JIT-Spray Remote Code Execution Firefox 44.0.2 - ASM.JS JIT-Spray Remote Code Execution EDB-ID: 44294 CVE: 2017-5375 2016-1960 Date: 2018-03-16 www.exploit-db.com 분석 - ASM.JS & JIT SPRAY & ASLR and DEP 우회방식을 사용함. - 환경 : Firefox 44.0.2 32bit Windows 10 1709 - exploit 성공 시 cale.exe 실행..
1) 배너를 통한 정보 수집 - 배너 그래빙(banner grabbing) : 웹 서버에 대한 정보를 서버의 응답을 통해 수집하는 방법 - 개발자 도구를 이용해 응답헤더를 확인하거나 버프 스위트의 프록시 히스토리 기능으로 확인 가능 - burp suite의 [proxy] - [history] 2) 기본 설치 파일을 통한 시스템 정보 수집 - 웹 서버, 웹 프레임워크, 기타 구성 요소 등이 노출되는 경우가 있음 - 예를 들어 PHP 언어로 개발된 경우 phpinfo.php 를 통해 호스트 관련 정보를 알아낼 수 있음 - firefox 주소칸에 192.168.56.102/bWAPP/phpinfo.php 입력 3) 웹 취약점 스캐닝 - 자동화 프로그램을 이용해 웹사이트의 여러 정보를 수집해 취약점을 알아내는 ..
1) C언어 - 컴파일러 언어 - low level - 절차 지향 언어 - 자원 관리(임베디드 시스템, 메모리 설계 등)에 사용됨 - 직접 메모리 관리를 해주어야 함 - 정적 언어 2) Java - 컴파일러 언어 - high level - 객체 지향 언어 - 보안에 강함 - 메모리 관리는 Gabage Collector이 직접 담당 - 정적 언어 3) JavaScript - 인터프리터 언어 - 객체 지향 언어 - 보안에 취약함 - 동적 언어 * 인터프리터 언어 : 소스 코드를 한 줄씩 읽어들여 실행 * 컴파일러 언어 : 컴파일러를 통해 전체 소스코드를 한 번에 기계어로 변환 * 정적언어 : 변수 선언 시 자료형을 지정해줘야 함 * 동적언어 : 변수 선언 시 자료형 지정이 필요치 않음
1. 노드의 개수 구하기 // recursive int get_node_cnt(TreeNode* p) { int cnt = 0; if (p != NULL) { cnt = 1 + get_node_cnt(p->left) + get_node_cnt(p->right); } return cnt; } 2. 리프 노드 개수 구하기 int get_leafnode_cnt(TreeNode* p) { int cnt = 0; if (p != NULL) { if (p->right == NULL && p->left == NULL) return 1; else cnt = get_leafnode_cnt(p->left) + get_leafnode_cnt(p->right); } return cnt; } 3. 높이 구하기 int get_h..
이진 트리는 순환적으로 트리 전체를 방문한다. 순환 횟수는 트리의 높이에 비례하기 때문에 반복보다 비효율적이다. 스레드 이진트리는 일반적인 이진 트리의 순회 방법과 달리 효율적이고 스택을 사용하지 않는 순회 방법이다. 일반적으로, 이진 트리에서 노드의 개수가 n일 때 루트 노드를 제외한 n-1개 링크는 다른 노드를 가리키고 n+1개의 링크는 NULL임을 알 수 있다. 이것을 이용해서 NULL 링크에 중위 후속자(successor)를 저장해놓고 순회할 수 있게 만들 것이다. 더보기 이진 트리의 정의 1) 공집합 2) 루트와 왼쪽, 오른쪽 서브 트리로 구성된 노드들의 유한집합 3) 서브 트리 또한 이진 트리여야 한다. 이제 함수를 정의해보자. 1. 트리 노드 구조체 typedef struct TreeNode..
정적(static) 변수 : 컴파일 시 메모리가 할당되고 프로그램이 종료되면 메모리가 삭제된다. 동적(dynamic) 변수 : 변수 선언과 동시에 메모리가 할당되며 변수 사용이 종료되면 메모리가 사라진다.
hanoi(int n, char from, char tmp, char to) hanoi(n-1, from, to, tmp); prinf("%c->%c", from, tmp); hanoi(n-1, tmp, from, to); -> h(n) = 2h(n-1) + 1 fibonacci(int n) -> f(n) = f(n-1) + f(n-2)
2 + 1 * 3 을 트리로 계산하고자 한다. 먼저, 수식을 트리로 표현하면 다음과 같다. 트리를 중위 순회한 결과가 2 + 1 * 3이다. 이 수식을 계산하기 위해서는 중위 순회로 표현된 것을 후위 순회로 바꾸어 주어야 한다. 1. 중위 수식에서 후위 수식으로 먼저, 중위 수식에서 후위 수식으로 바꾸기 위해서 스택을 사용할 것이다. 규칙은 다음과 같다. 피연산자라면 배열에 저장한다. 연산자라면 우선순위를 비교해 스택에 넣는다. 스택에 있는 연산자의 우선순위가 높은 경우 : 우선순위가 높은 연산자를 꺼내어 배열에 저장하고 우선순위가 낮은 연산자를 스택에 넣는다. 스택에 있는 연산자의 우선순위가 낮은 경우 : 스택에 넣는다. 예시는 다음과 같다. 1) 초기 상태의 모습이다. 2) 2는 피연산자이므로 배열에..