반응형

C++ 코드를 작성하다보면 클래스나 함수를 사용할때 다양한 자료형을 처리해야하는 경우가 생긴다.

이럴 경우 템플릿(Template)을 이용하면 쉽게 작성이 가능하다.

이번 시간엔 템플릿에 대해 알아보겠다.


1. 템플릿(Template)?

템플릿이란 여러 자료 형으로 클래스나 함수를 사용할 수 있도록 만들어 놓은 '틀'이다.

아래 그림과 같이 어떠한 자료형이 들어왔을때 템플릿을 이용하면 재선언없이

클래스나 함수를 해당 자료형으로 사용할 수 있게된다.

템플릿은 함수 템플릿과 클래스 템플릿으로 나누어지며 차근차근 설명해보록 하겠다.

 

 

 

 

2. 함수 템플릿

함수 템플릿은 말그대로 여러 함수를 만들어낼 수있는 틀과 같다.

일반적으로 다른 자료형을 함수에 적용시키고자 할때 함수 오버로딩을 사용하여 해결한다.

그러나 사용자가 직접 정의한 타입을 해당 함수에 적용시키기 위해선 함수 오버로딩 사용은 제한적이다.

이럴때 함수 템플릿을 사용한다.

 

자료형이 정해지지않은 두 수를 더하고 반환하는 함수를 만들어보자. 형태는 다음과 같다.

#include <iostream>
using namespace std;

template<typename T>
T Sum(T a, T b) {
	T tmp;
	tmp = a + b;
	return tmp;
}

int main(void) {
	int a = 3, b = 2;
	double c = 3.3, d = 2.2;
	int res1 = Sum(a, b);
	double res2 = Sum(c, d);
	cout << "res1 = " << res1 << ", res2 = " << res2 << endl;
	return 0;
}

코드를 보면 int 형과 double 형의 자료형 데이터들을 하나의 함수에서 더하기를 처리하고 받아오는 것을 볼 수 있다.

우선 template<typename T> 형태로 템플릿 사용을 선언한다.

typename(class로 작성 가능)을 정하고 자료형 부분에 해당 타입이름인 T를 넣어준다.

여기서 T는 템플릿 매게변수이며 template<typename T1, typename T2> 형태와 같이 여러개 선언도 가능하다.

이제 들어오는 값의 자료형에 따라 알맞게 해당 함수에서 데이터를 처리하게 된다.

 

실행 결과는 다음과 같다.

 

 

 

3. 클래스 템플릿

클래스 템플릿여러 클래스를 만들어낼 수 있는 틀이다.

함수 템플릿과 차이점이 있는데 클래스 템플릿은 함수 템플릿과 달리 오버로드가 되지않는다.

또하나의 차이점은 함수 템플릿은 완전 특수화만 가능하고 부분 특수화는 오버로드를 통해서 구현하는 수밖에없고,

클래스 템플릿은 완전 특수화와 부분 특수화가 모두 가능하다는 특징이 있다.

*특수화 : 특정 타입에 대해서만 다르게 동작하도록 만드는 것

 

자료형이 정해지지않은 두 수를 더하고 출력하는 함수를 포함한 클래스를 만들어보자. 형태는 다음과 같다.

#include <iostream>
using namespace std;

template<typename T>
class Sum {
private:
	T res;
public:
	Sum(T a, T b) : res(a+b) {}
	void printSum() {
		cout << res << endl;
	}
};

int main(void) {
	int a = 3, b = 2;
	double c = 3.3, d = 2.2;
	Sum<int> isum(a, b);
	Sum<double> dsum(c, d);
	isum.printSum();
	dsum.printSum();
	return 0;
}

template<typename T>로 함수 템플릿과 같고 클래스를 선언한다.

이후 private으로 템플릿 매게변수로 res를 선언해주고 printSum()함수로 매게변수로 받아온 a와 b의 합을 출력한다.

참고로 Sum<int> isum(a, b)를 보면 알 수 있겠지만 클래스의 경우 함수 템플릿과 달리 자료형 정보를 담아줘야 한다.

 

실행 결과는 다음과 같다.

 

 

 

4. 장점과 단점

장점 : 타입별로 클래스나 함수를 일일히 만들 필요가 없어진다.

 

단점 : 실행파일 용량이 커질수도 있으며 컴파일 시간이 길어진다.

 

 

추가적으로 C++14부터 변수 템플릿이라는게 등장하는데 관심있는 독자분께선 추가로 찾아서 공부하시길 바란다.


여기까지 템플릿에 대한 공부를 마친다. 계속해서 사용해보며 익숙해지는 것이 우선인 것같다. 추후 포스팅은 해당 포스팅을 시작으로 STL에 대한 내용을 본격적으로 다뤄보려고 한다.

반응형
반응형

알고리즘을 평가할땐 수행시간과 메모리 사용량을 기준으로 두게되는데 시간복잡도가 수행시간에 해당하며, 공간 복잡도가 메모리 사용량에 해당된다. 본 포스팅에선 이 중 시간복잡도에 대해 알아보려고 한다.


1. 시간복잡도

시간복잡도란 '입력된 데이터가 출력될 때까지 걸리는 시간'이다. 곧 알고리즘이 수행되는 시간이다.

시간복잡도가 낮으면 말그대로 입력부터 출력까지의 속도가 빠르며, 시간복잡도가 높이면 속도가 느려지게 된다.

 

 

 

2. 점진적 표기법 3가지

시간복잡도를 표기할때 3가지 표기법이 존재한다.

 

(1) 오메가(Ω) 표기법 > 제일 좋은 경우

(2) 세타(Θ) 표기법 > 평균적인 경우

(3) 빅-오(O) 표기법 > 제일 나쁜 경우

 

이 중 알고리즘이 최악일 경우에 평균과 가까운 성능으로 예측이 가능하므로

일반적으로 빅-오 표기법을 많이 사용한다.

 

 

3. 시간복잡도 단계

출저 : https://www.bigocheatsheet.com/

시간복잡도 단계는 위 그래프와 같으며 이를 정리해보면 아래와 같다.

 

 

 

4. 시간복잡도 계산

만약 input으로 문자열을 2개 입력받아 2개의 문자열이 같은지 판단하는 함수를 짠다고 가정해보자.

대소문자는 구별하지 않을 것이다. 이 코드에서 시간복잡도는 얼마가 될까?

설명을 위하여 위와 같이 간단히 짜보았다. 빅-오로 표기할 것이기 때문에 최악의 경우를 판단해보자.

위 for문은 두 문자열의 길이만큼 n번씩 2번 돌며 실행이된다.

그럼 여기서 상수와 같은 부분은 모두 제외하고, 총 O(n^2)라는 시간 복잡도를 가지게 되는 것을 확인할 수 있다.


여기까지 시간복잡도에 대한 공부를 마쳤다. 과제를 드리자면 위의 코드의 복잡도를 O(nlogn) 복잡도 보다 낮게 만들 수 있다. 향후 함께 실습해보는 시간을 가지겠다.

반응형

반응형

어느덧 수료를 한지 한달이 되어간다.

작년 이맘때 지원서를 쓰고 있었는데 9기 모집공고를 보고있자니 마음이 새롭다.

오늘은 BoB 8기 보안제품개발트랙 수료 후기를 올리고자한다.

경연단계(TOP30)까지 운이 좋게 진출하게 되어 다양한 이야기를 풀 수 있을 것같다.


1. 공통교육

"이런 분야도 있구나"

 이번 8기에선 공통교육을 통해 200명의 교육생들이 모든 트랙의 수업을 듣고, 2주뒤 시험을 통해 트랙을 선택하는 형식으로 진행되었다. 이번에 처음에 시도되었다고 들었는데, 솔직히 본인은 너무 좋았다.

 포렌식, 보안 컨설팅 트랙과 같이 잘 모르고있던 분야에 대한 정보를 많이 얻게되었고, 매력도 느끼게 되었다.다양한 분야에 계시는 멘토님들에게 교육을 받는다는 것은 정말 소중한 경험이었다. 물론 본인은 보안제품개발트랙으로 지원하여 선택도 보안제품개발트랙으로 하였지만, 가끔 지원트랙과 다른 트랙으로 가는 인원도 몇몇 존재하였다.

그만큼 다양한 분야에 대한 매력을 맛볼 수 있는 기간이었다.



2. 1차 교육

"이런 기술도 있구나"

 1차 교육기간엔 각 트랙에 대한 교육을 받게 된다. 참고로 이 2달동안 주말이 없다.

주 7일동안 교육이 진행되며, 많은 수업과 과제로 보통 교육생들은 이 기간에 하나둘 자신을 내려놓기 시작한다.

본인도 역시 4일은 센터에서 자고 거의 살다싶이했다. 물론 그만큼 배운것은 많다. 1차 교육기간엔 정말 다양한 정보들을 많이 접한 것같다. 네트워크 프로그래밍, 화이트박스암호, AI 등 여러 분야에 대한 지식을 얻었다.

 이뿐 아니라 개발, 프로젝트 방법론부터 협업에 필요한 기술들까지 배웠다. 이외에도 정말 많은 수업이 있지만 하나하나 말하기엔 너무 길다. 일단 이 기간에 느낀건 한 분야에 대해서 0부터 10까지 알려주는 것이 아니라, 다양한 분야에 대해서 맛보기처럼 알려주고 본인이 이 중에 맛있는 것을 직접 찾아 공부해나가라는 느낌이었다. 그래서 BoB 교육을 들으면 성장하는 것이라기보단 교육받은 주제에 대해 직접 공부를 하고 주변 교육생들과 이야기를 하는 과정에서 성장해나가는 것이라 느꼈다.

'아직도 난 화이트박스 암호 수업이 끝나고 2시간동안 토론을 하던 우리 보안제품개발트랙 친구들을 잊지못한다.'



3. 2차 프로젝트

"모든 고통을 느껴라!"

 드디어 2차 프로젝트 기간이다. 4달간 프로젝트를 진행하며 아주 많은 경험을 할 수 있게 된다.

1차 교육기간부터 프로젝트를 위해 미리 팀구성을 하는 팀도 있는데 부질없다고 생각한다.

사실 본인 팀이 그랬는데 7월부터 팀구성부터 주제선정까지 끝내놓았으나 막상 팀빌딩날에 담당 멘토님을 구하지 못해 팀이 해체될뻔했고, 주제를 계속해서 바꿔가며 새벽 3시에야 팀이 만들어지게 되었다.

 

 본인은 팀에서 PM(Project Manager)을 맡게 되었으며 주제는 클라우드 관련 주제였다. 하지만 구체화되지 않아 사실상 미정인 상태와 같았다(그래서 팀명도 '미정이'었다). 다른 팀들이 1달동안 프로젝트를 진행할때, 우리 팀은 1달동안 주제선정을 했다.

고통을 겪던 와중 한 팀원이 '데이터 조각 자동 분류 모델 설계 및 모듈 개발'이란 좋은 주제를 던져주었고, 모든 팀원들의 관심 분야가 포함된 주제였기 때문에 해당 주제로 프로젝트를 진행하게 되었다. 이후 팀이름은 '미정이'에서 '확정이'로 바뀌게 되었고, 모든 팀원은 그동안 한을 풀듯이 엄청난 속도로 프로젝트를 진행해 나갔다. 팀원 중 아무도 AI를 공부해본 경험이 없었으나 팀원 모두 책과 논문을 통해 딥러닝, CNN에 대한 공부를 밤을 새어가며 진행했다.

 결국 우린 프로젝트 목표인 데이터 조각 자동 분류 모델 설계 및 모듈 개발을 마쳤고, 운이 좋게 공모전 수상과 논문 구두발표와 같은 소중한 경험도 하게되었다.

 

 그런데 이렇게 산전수전 다겪어도 다른팀 이야기를 들어보면 우린 팀이 겪은 고통은 아무것도 아니더라. 2차 프로젝트는 이러한 기간이다. 이글에 모두 담지못할 정도로 다양한 일이 일어나며 그만큼 느끼는 것이 많은 기간이다. 개인적으로 이 2차 프로젝트 기간이 BoB의 꽃이라 생각한다. 본인도 프로젝트 관리, 협업, 대화, 기술과 같이 여러 방면에 있어서 배운 것이 많았다.



4. 경연단계

"끝난줄알았지?"

 2차 프로젝트 기간이 끝나면 경연단계 진출자들이 발표나고 이들은 TOP10 선별과정에 들어가게된다.

본인은 많이 부족하다고 생각하였으나 운이 좋게 TOP30에 진출하게 되었다. 덕분에 수료시험을 보지않게 되었고 질높은 수업을 들을 수 있게 되었다(TOP30이 아니여도 3차 교육은 들을 수 있다).

경연단계에선 1차 교육보다 심화된 수업을 진행하며 과제가 더 어려워지고 다양해지게 된다. 본인도 여기까지 온거 더 열심히하자는 마음으로 과제를 열심히 수행하려고 노력했던 것같다.

 경연단계에선 공통된 주제로 각자 개인 프로젝트를 진행하게 된다. 올해 주제는 리버스 오델로를 두는 AI를 개발하는 것이었다. GUI, 다양한 알고리즘 그리고 네트워크에 대해 공부를 진행하며 해당 프로젝트를 완성나가고 각 교육생은 자신이 만든 알고리즘으로 서로 대결한다. 여기서 이긴 횟수는 경연단계 점수에 반영되게 된다.

 이외에도 HWP 악성코드를 탐지하는 백신을 개발하는 과제부터 다양한 과제를 만나게 되는데 과제 하나하나 주옥같아 열심히 수행했다. 덕분에 이 기간엔 전공지식에 대한 정보를 많이 쌓을 수 있었던 것같다.

 

 이렇게 경연단계가 끝나면 1, 2, 3차 교육 점수를 계산하여 TOP10을 선정하게 된다. 참고로 본인은 TOP10 진출에는 실패했다. 지나고보니 정말 아쉽다ㅎㅎ,,



5. 수료

"코로나..."

 위와 같은 9개월을 견디고 본인은 마침내 수료생 타이틀을 얻게되었다.

근데 수료식이 취소되었다. 그렇다... 코로나 때문이다...

정말 아쉽고 아쉬웠지만 집으로 날아온 수료증과 메달을 보며 아쉬움을 달랬다.



6. 후기

"정말 힘들었고, 그만큼 정말 보람있었다."

 정신적으로나 신체적으로나 정말 쉽지않았던 9개월이었다.

그래도 그만큼 스스로 성장을 할 수 있었고,

보안에 대한 지식도 하루하루 다르게 쌓여가는것을 느낄 수 있던 시간이었다.

이뿐 아니라 다양한 사람들과 동거동락하며 좋은 관계를 만들어나갈 수 있는 소중한 시간이었다.

모두들 이 좋은 경험을 꼭 누려봤으면 좋겠다.


 이렇게 본인의 BoB 여정은 끝나게 되었다!

BoB는 끝났지만 같이 동거동락하며 공부했던 친구들과 여전히 연락을 하며 지낸다.

서로 궁금한 것을 물어보고 혹은 좋은 기회를 제공해주기도 한다. 이렇게 쌓인 네트워크는 어떠한 지식보다 소중하다고 생각한다.

다른 BoB 수료생들 역시 그렇게 느낄것이라 생각한다.

이처럼 독자분들 중에 혹시 BoB 지원생이 있다면 꼭 합격해서 본인과 같이 위에서 설명한 많은 것들을 얻어가셨으면 좋겠다.

반응형
반응형

데이터베이스를 사용하다보면 여러 테이블이 나눠진 상황에서 2개 이상의 테이블을 조합하여 원하는 결과를 도출해야되는 경우가 있다. 이를 위해서 JOIN을 사용할 수 있는데 MYSQL의 JOIN에 대해 자세히 들여다보자.


JOIN을 실습하기 위해 Mysql과 PhpMyAdmin을 이용해 다음과 같이 테이블을 구성하였다.

 

TABLE A - test_information

문제이름(Mission) 출제자(Maker)
국어문제 김선생
영어문제 이선생
수학문제 조선생
과학문제 구선생
일본어문제 나가사끼선생

TABLE B - test_result

문제이름(Mission) 푼인원수(Solver)
국어문제 30
영어문제 25
수학문제 16
과학문제 10
중국어문제 3

한테이블엔 문제이름과 출제자가 적혀있고, 나머지 한테이블엔 문제이름과 푼 인원수가 적혀있다.

본인은 두 테이블에 들어있는 정보를 이용하여 하나의 출력결과를 만들어 내고 싶다.

이를 위해 JOIN을 하나씩 사용해보자.

 

0. (INNER) JOIN

> 두개 이상의 관련 키가 존재하는 테이블에서 컬럼값을 비교하여 조건에 맞는 행을 검색

> 입력 예제

SELECT test_information.Maker, test_result.Solver : 출제자와 푼 사람수를 출력

FROM test_information : 테이블 A 기준(문제이름, 출제자)

INNER JOIN test_result : 테이블 B로 JOIN(문제이름, 푼 사람수)

ON test_information.Mission = test_result.Mission : 조건은 A의 문제이름과 B의 문제이름이 같은 행만

 

> 결과

 

1. OUTER JOIN

> LEFT 또는 RIGHT, FULL OUTER JOIN이 존재하며, 두 테이블에서 지정된 쪽인 LEFT 또는 RIGHT 방향의 모든 결과를 보여준 후 반대쪽에 대해는 매칭값이 없어도 표시

1-1. LEFT OUTER JOIN

> JOIN문의 LEFT에 있는 테이블 결과를 모두 가져온 후 RIGHT에 있는 테이블 데이터를 매칭하여 매칭되는 데이터가 없을땐 NULL을 표시

> 입력 예제

SELECT test_information.Maker, test_result.Solver : 출제자와 푼 사람수를 출력

FROM test_information : 테이블 A 기준(문제이름, 출제자)

LEFT JOIN test_result : 테이블 B로 LEFT JOIN(문제이름, 푼 사람수)

ON test_information.Mission = test_result.Mission : 조건은 A의 문제이름과 B의 문제이름이 같은 행만

 

> 결과 : A엔 나가사끼선생(일본어문제)이 있지만,  B엔 일본어문제가 존재하지않는다. 그래도 NULL로 넣어 출력한다.

1-2. RIGHT OUTER JOIN

> JOIN문의 RIGHT에 있는 테이블 결과를 모두 가져온 후 LEFT에 있는 테이블 데이터를 매칭하여 매칭되는 데이터가 없을땐 NULL을 표시

> 입력 예제

SELECT test_information.Maker, test_result.Solver : 출제자와 푼 사람수를 출력

FROM test_information : 테이블 A 기준(문제이름, 출제자)

RIGHT JOIN test_result : 테이블 B로 RIGHT JOIN(문제이름, 푼 사람수)

ON test_information.Mission = test_result.Mission : 조건은 A의 문제이름과 B의 문제이름이 같은 행만

 

> 결과 : B엔 3명(중국어문제) 행이 있지만, A엔 중국어문제가 존재하지않는다. 그래도 NULL로 넣어 출력한다.

2. CARTESIAN(CROSS) JOIN

> 연관 테이블(두개 이상)에서 가능한 모든 조합을 찾음

> 입력 예제

SELECT test_information.Maker, test_result.Solver : 출제자와 푼 사람수를 출력

FROM test_information : 테이블 A 기준(문제이름, 출제자)

CROSS JOIN test_result : 테이블 B로 CROSS JOIN(문제이름, 푼 사람수)

 

> 결과 : 출제자와 푼 사람의 수의 모든 조합 경우의 수를 보여준다 행의 갯수는 A x B개이다.

3. SELF JOIN

> 자기 자신과 JOIN

> 입력 예제

SELECT info1.Mission, info2.Maker : 문제이름과 출제자를 출력

FROM test_information info1 : 테이블 A 기준(문제이름, 출제자)

JOIN test_information info2 : 테이블 A로 JOIN(본인에게)

ON info1.Mission = info2.Mission : 문제 이름이 같은경우

 

> 결과 : 당연히 같은 테이블에서 문제이름끼리 비교하면 모두 같으므로, 문제이름과 출제자의 모든 결과를 출력한다.


여기까지 JOIN 공부를 마쳤다. 소스코드 삽입부터 계속해서 포스팅을 수정해나갈 예정이다.

반응형
반응형

최근 Frida를 이용한 안드로이드 앱 후킹에 대해 공부를 하게되었다.

NOX를 사용하여 안드로이드 에뮬레이터 환경을 구성하여 앱을 후킹하였다.

과정 중심적으로 포스팅을 진행해보겠다.


상대방의 허락을 받지않고 앱을 후킹하는 행위는 범죄입니다. 해당 포스팅은 공부 목적으로 안전한 환경에서 진행하였으며 본 실습을 따라하여 일어나는 행동에 책임을 지지않습니다.


1. 환경 구성

0. 환경 : Windows 10, Frida, NOX 6.3, Cmder, Python3.5(혹은 3.7)


1. Cmder 설치 : https://cmder.net/

  • 파이썬 3.5버전이 Frida 호환성 가장 좋음(python -V)


2. NOX 설치 : https://kr.bignox.com/



3. Frida-server 다운 : https://github.com/frida/frida/releases

  • frida-server로 시작하며 armhf, x86등 버전 잘확인하고 받을것
  • NOX론 기본상태면 [frida-server-12.7.5-android-x86.xz] 다운하면 됨


4. NOX 루팅환경 세팅

  • 시스템 설정 - 기본 설정 - ROOT 켜기



5. 개발자 모드 활성화

  • 모바일 기기 - 설정 - 태블릿(핸드폰) 정보 - 빌드번호 7번정도 탭



6. USB 디버깅 활성화

  • 설정 - 개발자 옵션(추가됨) - 디버깅탭 - USB 디버깅 ON



7. Cmder에서 Frida 설치

  • pip install frida-tools



8. 가상장치 연결

  • adb connect 127.0.0.1:62001
  • adb devices로 연결 확인 가능



9. Firda-server 다운로드 및 이름 변경

  • frida-server-12.7.4-android-x86.xz 압축풀고 이름 frida-server로 변경(편리 목적)



10. Frida-server 모바일기기에 넣기

  • Cmder에서 adb push [frida-server파일경로]\frida-server /data/local/tmp
  • 연결된 장치의 tmp폴더에 서버파일을 넣어줌


11. Frida-server 실행

  • 이어서 adb shell로 모바일기기로 접속
  • cd /data/local/tmp 이동
  • chmod 755 frida-server로 실행권한 부여
  • ./frida-server & 로 서버 백그라운드 실행
  • ps | grep server로 구동 확인 (./frida-server 존재하면 OK)



12.연결된 장치의 프로세스 목록 확인 (오류시 파이썬버전 확인 - 3.6은 안되었음)

  • Ctrl+C 통해 shell 빠져나오고 frida-ps -U



13. NOX에서 앱실행해보고 frida-ps로 PID 확인



2. 실습

1. 앱 정적 후킹 가능

  • frida -U [PID]
  • frida -U -f [File Name] -l java_hook.js --no-pause
  • frida-trace 등
  • 다양한 방법, 명령어로 후킹 가능 > 분석먼저하기



2. 분석

  • 테스트할 apk 다운
  • dex2jar로 jar로 변환
  • jdx와 같은 툴로 동적분석
  • 후킹시도할 클래스, 함수 확인



3. 파이썬으로 frida를 import해 코딩

코드는 자바스크립트로 작성되게 된다. 큰 기본 형태는 위와 같고 코드에 대해 간단히 설명하도록 하겠다.

(1) frida와 sys 모듈을 불러온다.

(2) process = frida.get_usb_device().attach("attach할 PID 명") 로 원하는 앱에 붙어 프로세스를 지정한다.

(3) script = process.create_script(test)로 프로세스에 test 스크립트를 생성한다.

(4) script.load()로 스크립트를 동작한다.

(5) 스크립트는 Java.perform() 인자로 넘겨준다.

(6) Java.use("후킹할 Class의 Method")

(7) 후킹할 함수.implementation 해주고 안에 함수 몸체를 작성해준다.

 

 

4. python [파일명].py로 API 후킹 가능


*포스팅을 계속해서 보완해 나갈 예정이다.

반응형

+ Recent posts