앙상블 학습
앙상블 분류는 여러 분류기를 생성하고 그 예측을 결합함으로써 보다 정확한 예측을 도달하는 기법

 

이미지, 영상, 음성 등의 비정형 데이터의 분류는 딥러닝이 뛰어난 성능을 보이고 있지만, 대부분의 정형 데이터 분류 시에는 앙상블이 뛰어난 성능을 나타내고 있다.

 

* 정형 데이터와 비정형 데이터

정형 데이터 : 데이터베이스와 같이 데이터 들의 특징을 분류할 수 있도록 규칙에 맞게 정리된 정보

비정형 데이터 : (이미지, 음성, 영상등) 데이터 모델이 없거나 미리 정의된 방식으로 정리되지 않은 정보(위키 백과)

 

앙상블 학습의 유형 : 보팅(Voting), 배깅(Baggin), 부스팅(Boosting) 이외에도 스태킹을 포함한 다양한 앙상블 방법이 있다.

보팅 : 다른 분류 알고리즘을 사용하여 투표를 통해 최종 예측 값을 선정

(다른 분류 알고리즘의 예 : 선형 회귀, KNN, 서포트 벡터 머신 등)


배깅 : 같은 분류 알고리즘을 사용하고 데이터 샘플링을 서로 다르게 가져가 투표를 통해 최종 예측 값을 선정

(예: 랜덤 포레스트)

보팅과 배깅에서 학습 데이터의 활용 방법이 다르다.

보팅은 학습 데이터를 공유하여 여러 알고리즘에서 사용하는 것이나, 배깅에서는 학습 데이터를 샘플링하여 각 각 알고리즘에 전달한다. 이렇게 데이터를 샘플링하여 추출하는 방식을 부트스트래핑(Bootstraping)분할 방식이라고 한다.

 

교차 검증에선 데이터 세트간의 중첩을 허용하지 않았지만, 배깅은 중첩을 허용한다.

즉 10,000개의 데이터를 10개의 분류기가 배깅 방식으로 나눈다면 각 1000개의 데이터 내에서는 중복된 데이터가 있다.

 

부스팅은 순차적으로 학습을 수행하는데, 다음 분류기에 가중치를 부여하며 학습과 예측을 진행한다.

대표적인 무스팅 모듈 : 그래디언트 부스트, XGBoost(eXtra Gradient Boost), LightGBM(Light Gradient Boost) 등


보팅에는 두가지 방법이 있다. (하드 보팅, 소프트 보팅)
하드 보팅 : 다수의 분류기가 결정한 예측값을 최종 보팅 결괏값으로 선정 (다수결)
소프트 보팅 : 레이블 값 결정 확률을 모두 더하고 이를 평균해서 이들 중 확률이 가장 높은 레이블 값을 최종 보팅 결과값으로 선정

일반적으로 하드 보팅보다 소프트보팅이 예측 성능이 좋아 더 많이 사용된다.

결정 트리
학습을 통해 데이터에 있는 규칙을 자동으로 찾아내 트리 기반의 분류 규칙을 만드는 것.
규칙노드 : 규칙 조건이 되는 것
리프노트 : 결정된 클래스(레이블) 값
새로운 규칙 조건마다 생성되는 '서브트리'

데이터세트에 피처가 있고 이러한 피처가 결합해 규칙 조건을 만들떄 마다 규칙 노드가 만들어진다.
많은 규칙이 있다는 것은 분류를 결정하는 방식이 더욱 복잡해지고, 트리의 깊이가 깊어져 과적합으로 이어지기 쉽다.

결정 노드는 정보 균일도가 높은 데이터 세트를 먼저 선택할 수 있도록 규칙 조건을 만든다

정보 이득 지수 = 1- 엔트로피
결정 트리는 정보 이득 지수로 분할 기준을 정한다.
엔트로피가 높은 수록 데이터가 혼잡하다.

지니 계수 = 0 가장 평등, 1 가장 불평등
지니계수가 낮을 수록 데이터 균일도가 높다.

결정 트리 장점
쉽다, 직관적이다, 피처의 스케일링이나 정규화 등의 사전 가공 영향도가 크지 않다.

결정 트리 단점
과적합으로 알고리즘 성능이 떨어진다. 이를 극복하기 위해 트리의 크기를 사전에 제한하는 튜닝 필요

분류(Classification)
명시적인 정답이 있는 데이터가 주어진 상태에서 학습하는 머신러닝 방식
1. 학습 데이터로 데이터의 피처와 레이블 값(결정 값, 클래스 값)을 머신 러닝 알고리즘으로 학습
2. 새로운 데이터 값이 주어졌을 때 메지의 레이블 값 예측

분류 알고리즘
1. 베이즈(Bayes) 통계와 생성 모델에 기반한 나이브 베이즈(Naive Bayes)
2. 독립 변수와 종속 변수의 선형 관계성에 기반한 로지스틱 회귀(Logistic Regression)
3. 데이터 균일도에 따른 규칙 기반의 결정 트리(Decision Tree)
4. 개별 클래스 간의 최대 분류 마진을 효과적으로 찾아주는 서포트 벡터 머신(Support Vector Machine)
5. 근접 거리를 기준으로 하는 최소 근접(Nearest Neighbor) 알고리즘
6. 심층 연결 기반의 신경망(Neural Network)
7. 서로 다른(또는 같은)머신 러닝 알고리즘을 결합한 앙상블(Ensemble)

 

앙상블 분류는 가장 각광받는 분류 알고리즘 중 하나
정형 데이터 예측 분석 영역에서 앙상블은 매우 높은 예측 성능을 가진다.

앙상블 학습을 통한 분류
여러 개의 분류기를 생성하고 그 예측을 결합하여 보다 정확한 최종 예측을 도출하는 기법

이미지, 영상, 음성 등의 비정형 데이터 분류는 딥러닝이 뛰어난 성능을 보이고 있지만, 대부분의 정형 데이터 분류에서는 앙상블이 뛰어난 성능을 보이고 있다.


대표적인 앙상블 알고리즘으로 랜덤 포레스트, 그래디언트 부스팅이 있다. 

이들은 뛰어난 성능과 쉬운 사용, 다양한 활용도로 많이 애용된다.

Bof의 개념 자체는 정말 간단한다.

포너블의 기초라고 하는 이 취약점으로 포너블에 뛰어들게 되었지만 간단하지는 않았다. 버퍼, 메모리, 어셈블리어, 레지스터 등과 관련된 글은 한 번 읽었을 때 와 닿지 않았으며 성격 특성상 이해가 될 때까지 읽었다. 아직 많이 부족하지만 이번 포스팅을 통해 한 번 되짚어 보려고 한다.

 

BOF(Buffer OverFlow)

'버퍼'의 데이터가 흘러넘치는 것

 

심플하다. 근데 이게 왜, 뭐가 문제가 되는지에 대해 실습으로 알아보겠다.

(이를 이해하기 위해선 앞서 말했던 c언어, 버퍼, 메모리, 어셈블리어, 레지스터 등에 대한 사전 지식이 필요하다.)

 

 

메모리 보호 기법인 ASLR을 잠시 꺼두도록 합니다.

sudo sysctcl w kernel.randomize_va_space=0

 

basic_bof.c

 

컴파일

gcc를 이용해 컴파일할 때 메모리 보호 기능들을 사용하지 않도록 컴파일한다.

 

 

<basic_bof> 스택 프레임

코드가 간단한 만큼 스택 프레임도 간단하다. 위의 코드에서의 문제점은 'strcpy' 함수를 사용함에 있다. strcpy함수는 문자열을 복사하여 넣는 기능을 하는데 이때 복사되는 문자열의 길이를 검증하지 않는다. 그렇기에 buf의 길이인 100보다 긴 문자열 입력 시 EBP를 지나 RET를 조작할 수 있다. 이때 buf에 쉘을 실행시킬 수 있는 쉘 코드를 넣고 RET가 buf의 주소를 가리킨다면 쉘을 실행시킬 수 있을 것이다.

<basic_bof> disas main

disas 결과를 통해 ebp-0x64 지점부터 buf [100] 주소가 시작됨을 알 수 있으므로 ebp-0x64를 구하기 위해 strcpy 함수가 실행된 직후에 BP를 걸고 ebp를 확인해 보겠다.

 

 

BP설정 후 인자로 AAAA 전달

 

EBP 확인

ebp는 0xbffff2e8 임을 확인할 수 있고 ebp-0x64에 AAAA가 들어있다면 우리의 예상은 들어맞게 된다.

0xbffff2e8 - 0x64 = 0xbffff284

 

 

ebp-0x64(0xbffff284)의 값 확인

 

buf의 주소가 0xbffff284 임을 알아내었고 이를 바탕으로 페이로드를 작성할 수 있다.

 

쉘 코드를 포함한 buf(100) + EBP(4) + RET(4) = NOP(30) + shellcode(25) + NOP+EBP(49) + RET(4)

이때 RET는 buf의 주소가 들어가야 한다.

 

하지만 이렇게 실행하면 Segmentation fault 오류가 발생한다. 

잘못된 buf의 주소로 인한 Segmentation fault

 

그 이유는 buf의 주소가 잘못되었기 때문이다. buf의 주소가 잘못된 이유는 프로그램이 실행될 땐 해당 프로그램뿐만이 아닌 환경변수, 프로그램에 전달하는 인자, 프로그램 지역 변수들이 자리 잡는데 gdb는 gdb가 자체적으로 사용하는 환경변수들이 있기 때문에 주소가 달라지게 되는 것이다.

 

그렇기에 buf의 주소를 출력하는 구문을 넣어주고 아까 썼던 페이로드를 넘겨준다.

수정 코드

 

 

코드 수정 후 컴파일, buf의 주소 = 0xbffff254
쉘 획득 모습

 

  

 

 

+ Recent posts