모두의 dream

CNN을 이용한 악성코드 탐지 (졸업논문) 본문

Project

CNN을 이용한 악성코드 탐지 (졸업논문)

오리꽥이로 2023. 1. 3. 19:02
Contents 접기

PE Structure(.Text, .Data), API 를 Feature로 사용하는 부분을 맡아 실험을 진행했다.

나머지 팀원들은 Binary Data, Opcode 를 이용하여 실험을 진행했고, 최종적으로 앙상블 모델을 제작했다.

깊게 공부하고 진행하지는 못했기 때문에 각각의 실험결과에 대해서 자세한 이유를 파악하지 못한 경우도 존재한다.

사용된 데이터 셋은 정상 10000개, 비정상 10000개이다. (각각 8000개 학습, 2000개 test로 사용)

데이터 전처리 단계

CNN 모델은 이미지를 Input 값으로 받는 모델이므로 우선 각 Feature를 이미지화 시켜야한다.

 

Binary Data 의 경우 .Text, .Data, .Text + .Data 3가지 경우로 나누어 이미지화를 시켰다.

PE 구조

 

API의 경우 cuckoo sandbox를 이용하여 API 시퀀스를 추출한 후 치환을 이용하여 데이터를 단순하게 만들어줬다.

그리고 치환된 데이터를 이미지화 시켰다.

치환 예시

 

여기서 발생한 문제점이라면 cuckoo sandbox에서 분명 악성파일이지만 탐지를 하지 못하는 경우가 대부분이었다는 것이다.
cuckoo sandbox 화면

예상되는 이유는 다음과 같았다.

1. 악성파일 자체의 우회기법
2. 잘못된 cuckoo sandbox 환경 구성
해결하고자 노력했으나 실패했으며 결국 score가 5점 이상인 경우만 골라서 이미지화를 시키게 되었고, API 시퀀스 Feature를 가지는 이미지의 개수는 굉장히 부족한 상태로 학습 및 테스트를 진행하게 되었다.
 

추후 모델을 돌리기 위해서는 이미지의 크기가 모두 동일해야 하므로 아래의 조건에 맞춰 이미지를 제작한 후 resize를 통해 동일하게 만들었다.

 

이미지 제작 방법

예를 들어 데이터(샘플)의 길이가 64x64보다 작다면 64x64의 크기로, 데이터의 길이가 2048x2048보다 크지만 4096x4096보다 작다면 4096*4096의 크기로 이미지를 만들었다.

 

제작된 이미지

resize는 64x64로 진행했으며 위와 같이 이미지가 제작되었다.

모델 학습 단계

CNN 모델은 다음과 같이 구성되었다.

모델에 학습 데이터가 들어가기 전 정규화를 진행하여 정확도를 높이고자 하였다.

모델 구성

실험 결과

.Text 섹션 학습 결과

.Text를 Feature로 선택하여 학습시켰을 경우 학습 정확도는 80%,  test 데이터를 이용한 정답률은 97%를 기록했다.

다만 loss 값이 조금 더 낮게 나오지 않은 점이 아쉬웠다. (loss 값은 실제 정답과 모델이 예측한 값의 차이이다.)

.Data 섹션 학습 결과

.Data를 Feature로 선택하여 학습시켰을 경우 학습 정확도는 85%, test 데이터를 이용한 정답률은 64%가 나왔다.

학습 정확도가 높지만 정답률은 낮게 나온 상황인데 이유는 잘 모르겠다.

.Text에서 정확도가 낮은데 정답률은 높은 상황과 반대되므로 이 부분에 대한 이유는 추후 찾아내야 할 과제로 생각된다.

 

.Text + .Data 섹션 학습 결과

 

.Text + .Data를 Feature로 선택하여 학습시켰을 경우 학습 정확도는 80%,  test 데이터를 이용한 정답률은 98%를 기록했다.

train과 test의 Accuracy 및 Loss 비교 값

위 사진은 각 Feature에 대해 train, test 데이터의 accuracy와 loss값을 그래프로 표현한 것이다.

그래프를 봤을 때 train과 test의 결과값이 큰 차이 없이 거의 붙어 있으므로 오버피팅이 존재한다고 보기 힘들었다.

오버피팅은 학습 데이터를 외워버리는 현상이라고 보면 된다.

 

API 시퀀스를 이용한 학습 결과

API 시퀀스를 Feature로 선택하여 학습시켰을 경우 학습 정확도는 80%,  test 데이터를 이용한 정답률은 100%를 기록했다. 다만 이 결과는 학습 데이터 180개, test 데이터 20개로 이루어진 결과다. 따라서 높은 신뢰도를 가지지는 못하지만 이러한 컨셉으로 도전해 봤다는 정도로 알아주면 된다.

 

앙상블

내가 코드를 짠 부분은 아니지만 논문의 핵심이니까 작성해봤다.

앙상블은 여러 개의 모델을 결합하여 더 높은 성능을 가질 수 있도록 만들어주는 기법이다.

나는 PE Structure, 다른 팀원들은 Binary Data, Opcode를 Feature로 사용하여 실험했는데 이 3개의 모델을 앙상블을 이용하여 합쳐서 더 높은 성능을 가지는 모델을 구현해보고자 했다.

 

앙상블 모델 구성

위에서 사용했던 Feature들을 각각 좋은 퍼포먼스를 보여준 CNN Model에 학습시킨다. 이후 악성과 정상 중 한 개가 결정되어 모델별로 예측한 값이 3개가 나오게 되는데 그중 더 많은 표를 받은 쪽이 선택되어 악성, 정상을 가리게 된다. 예를 들어 파일1에 대한 결괏값이 정상, 악성, 악성이라면 이 파일에 관한 결과는 악성이 더 많으므로 악성 파일로 최종 판단하게 된다. 이러한 방식 말고 다른 방식의 앙상블 모델도 존재한다.

 

 

최종적으로 앙상블 모델 93%의 정답률을 가지게 되었다.

 

후기

딥러닝에 대한 베이스 지식이 거의 없는 상태에서 파이썬과 구글링으로 해결하려다 보니 깊게 공부를 해보지는 못했다. 딥러닝은 모르겠지만 적어도 머신러닝과 데이터 처리는 포렌식 분야에서도 사용될 가능성이 큰 만큼 다음에 기회가 된다면 머신러닝과 데이터 처리를 공부해볼 생각이다.

 

참고

[인공지능] Loss가 더 작다고 Accuracy가 더 높은 것은 아니다. (velog.io)

[딥러닝] 1. 오버피팅(과적합)이란? (tistory.com)

'Project' 카테고리의 다른 글

Install Cuckoo Sandbox  (2) 2022.01.28
유튜브 클론코딩 (HTML + CSS + node.js + MongoDB)  (0) 2022.01.22
Comments