# 레포트 준비하면서 조사한 내용 공유합니다.. 틀린 정보가 있을 수 있으니 댓글 달아주세요.


1. 서 론

컴퓨터를 이용한 작업이 많아지면서 그에 따른 정보를 보호하기 위한 그리고 그 정보를 가져오기 위한 보이지 않는 대립이 이루어지고 있다. 그중 대표적인 기술이 암호(Cryptography)이다. 암호는 정보를 제3자가 정보를 알 수 없게 하는 방식이다. 암호는 고대에서부터 계속 되어 왔으며, 오늘날에 개개인이 하나의 암호를 가지고 있을 정도로 발전되어왔다. 여태껏 암호화 기술이 정보보호에만 당연히 사용된다는 생각을 했다.

그래서 이 레포트에는 그 순진한 생각이 틀렸다는 것에 대해 조사해보려고 한다.

 

(1) 암호화 기술의 악의적인 이용

 

흔히 알고 있는 암호화기술은 개인의 정보를 ‘보호’ 하기위해서 사용되거나 특정 가치의 저작권을 ‘보호’하기위해서 또는 제품의 도용을 ‘보호’하기 위해서 사용된다고 알고 있다. 그러나 이러한 보호도 있다. 바로, 악성소프트웨어에 대한 ‘보호’ 이다. 물론 이것도 보호를 하지만, 그 보호하고자 하는 대상이 ‘보호’를 파훼하는 용도로 사용되는 것이기에 문제가 되는 것이다. 암호화 기술이 이런 용도로 사용될 줄은 생각도 못했기에 조금 더 알아보기로 한다.

 

 

 

2. Cryptovirology 개요

 

상대적이며 절대적인 지식의 백과사전은 아닐지라도 누구나 자유롭게 글을 쓸 수 있는 사용자 참여의 온라인 백과사전인 위키피디아에서 Cryptovirology를 정의하고 있었다. 간단히 말하면 Cryptovirology는 악성 소프트웨어에 사용되는 암호화기법의 응용프로그램의 연구이다. 조금더 쉽게 말하면 암호를 이용한 바이러스를 Cryptovirus라 부르며 이에 대한 연구를 Cryptovirology라 한다.

사실 Cryptovirology는 일반학계에서 시작되었지만, 최근에는 악성코드 개발자들의 암호화 알고리즘을 분석하는 부분으로 까지 확대되었다. 또한, 악성코드 개발자의 암호화 기반 기술의 연구도 포함되어 있다.

암호화는 전통적으로 방어적인 목적을 위해 사용되고 있다. 암호는 의식하지 못한 유출에 대항해 방어를 해준다. 공개키 암호방식은 의도적으로 하는 해커에 대항하기 위한 기초로 만들어 졌고, 디지털 서명 알고리즘은 위조자로부터 방어해준다. 이와 같이 Cryptovirology는 프로토콜의 오류 및 설계 취약점을 찾는 것을 넘어서, 공격보다는 방어에 사용할 수 있는 앞으로의 기술 분야이다.

3. Cryptovirus

 

Cryptovirus는 암호를 이용한 바이러스를 칭한다. Cryptovirus를 이용한 공격에는 블록 암호와 같은 비밀키 암호와 RSA 등의 공개키 암호가 사용된다. 비밀키 암호는 데이터의 고속 암호화에 사용되며 암호화와 복호화에 사용되는 키가 동일하며, 공개키 암호는 암호화에 사용되는 공개키와 복호화에 이용되는 개인키가 서로 다르다.

 

 

 

(1) Cryptoviral Extortion 기법

 

이전의 악성 코드 공격은 실패했을때 Cryptoviral Extortion은 성공했다. 이전 악성 코드로부터 Cryptovirus 구별되는 중요한 포인트는 Cryptovirus은 공개 키 암호화를 사용한다는 것이다. 트로이는 효과적으로 대칭 암호화를 사용하는 것이였다. 대칭 암호화 / 암호 해독 "키"와 호스트 시스템에 존재 쉽게 추출할 수 있습니다. 하지만, 바이러스는 공개 암호화 키가 아닌 해당 개인 암호 해독 키가 포함되어 있으므로, Cryptovirus의 경우는 해당되지 않는다.

Cryptoviral Extortion 은 공격자와 피해자 사이에 실시되는 3개의 프로토콜이다. Cryptoviral Extortion 프로토콜은 다른 데이터 파일의 유지를 위한 데이터 파일의 추출로 설명된다. 그 프로토콜에 포함되는 암호화 체크섬은 바이러스가 공격한 이후 시간으로 부터 그 요구되는 데이타는 변하지 않음을 확인한다. 공격은 데이터를 암호화하고 그 데이터 값을 위해 보유한다. 그 프로토콜은 다음과 같다.

0단계 - (공격자 설치 단계)는 두 개의 비대칭 키는 공격자에 의해 생성된다. 이것은 스마트 카드를 사용하여 수행할 수 있다(FIg. 1 참조). 실험에 MS CAPI와 개인 키로 두 개의 키를 만들고 텍스트 파일에 기록된 대칭 암호화 기록에 저장된다. 연습에서 해당 공개키는 Cryptovirus 로 hard-coded 되어있다.

 

1단계 - (공격자->피해자) 공격자가 Cryptovirus를 보낸다. 후에 바이러스는 많은 호스트 컴퓨터에 활성화되고, 한 컴퓨터로의 공격을 고려한다. 바이러스가 활성화하면, 무작위 비트 생성기(3-Key triple DES key)를 사용하고, 임의의 8바이트로 벡터를 초기화한다. 그 데이터 파일에 사용된 바이러스 암호화는 cipher block chaining 암호모드이다. 그 바이러스모드는 평문을 이진 텍스트 파일로 암호문을 만든다. 바이러스가 공격자의 공개 키를 사용하여 대칭 키를 암호화 한다.그 결과 비대칭 암호문 뭉치는 피해자의 시스템에서 텍스트 파일에 기록된다. 그 평문과 대칭키는 없어진다.

그 텍스트 파일은 데이터의 반환협상에 사용하기 위해 피해자에게 보내진다. 실제로도 바이러스는 공격자의 디지털 가명을 보낼 수 있고 피해자가 혼합 네트워크를 통해 대칭 키에 대한 지불을 종용한다.

 

2단계 - (피해자->공격자) 만약 피해자가 몸값을 지불하고 바이러스제작자에게 텍스트파일로 된 비대칭 암호문을 전송한 경우, 개인 암호 해독 키를 사용하는 바이러스 제작자가 그 암호뭉치를 해독해서 그것에 접속 한다. 대칭키를 보인다.

 

3단계 - (공격자-> 피해자) 바이러스 제작자가 피해자에게 대칭키등을 보냅니다. 이들은 값을 지불한 데이터를 해독합니다.

 

다형성 바이러스의 경우도 암호를 이용하여 악성 코드 스스로를 암호화하지만 복호화에 필요한 정보가 바이러스 내에 포함되어 있다. 그러나, Cryptovirus의 경우는 복호화에 필요한 정보를 공격자만 가지고 있게 된다. 실제로 2006년 3월 사용자의 파일을 암호화하고 복호에 필요한 정보제공에 300달러를 요구하는 랜섬웨어[1]가 발견되었다. 트로이 목마 프로그램으로 Cryptovirus를 이용한 제작인지는 밝혀지지 않았다. 비록 아직까지 크게 전파되지는 않았으나 향후 이와 유사한 악성 코드에 의한 사용자 데이터의 악의적인 암호화에 대한 우려가 현실화될 가능성이 충분하다고 예상한다.

 

 

 

(2) Ransomware

 

미국에서 발견된 스파이웨어 등의 신종 악성 프로그램. 컴퓨터 사용자의 문서를 볼모로 잡고 돈을 요구한다고 해서‘랜섬(ransom)’이란 수식어가 붙었다. 인터넷 사용자의 컴퓨터에 잠입해 내부 문서나 스프레이시트, 그림 파일 등을 제멋대로 암호화해 열지 못하도록 만들거나 첨부된 이메일 주소로 접촉해 돈을 보내 주면 해독용 열쇠 프로그램을 전송해 준다며 금품을 요구하기도 한다.

 

 

① 공격자는 공개키 암호에 사용되는 공개키 y와 개인키 x를 생성하고, 공개키 y를 저 장하고 있는 바이러스를 배포한다.

② 바이러스가 활성화되면 블록 암호에 사용될 랜덤한 비밀키 k를 생성하고 사용자의 데이터를 비밀키 k를 세션키로 사용하여 블록 암호로 암호화 한다.

③ 비밀키 k를 공개키 y로 암호화한 값 c를 저장하고 비밀키 k를 삭제한다.

④ 공격자는 비밀키 k를 알려주는 대가를 사용자에게 요구하여 받아들여지는 경우 c를 개인키 x로 복호화하여 원래 비밀키 k를 구한후 사용자에게 전달한다.

⑤ 사용자는 비밀키 k를 세션키로 사용하여 블록 암호로 복호화하여 자신의 데이터를 복구한다.

 

위와 같이 동작하는 Cryptovirus 는 랜섬웨어(Ransomeware)의 일종이며 공개키 암호를 사용하기 때문에 바이러스의 분석으로는 데이터를 복구할 방법이 전혀 없다는 특징이 있다.

 

그렇다면 이러한 악성 소프트웨어로부터 대비를 해야한다. 1차적으로 Preventive control로 access control을 해야 한다. 2차적으로 데이터를 백업해서 그 데이터를 다시 복구할 수 있는 경우에는 그 공격은 효력이 없어진다. 3차적으로 이런 일을 대비해 “사고 대응 계획”을 미리 구축해 놓아야겠다.

 

 

 

4. 결 론

 

20년간 악성 프로그램은 전파속도나 기능면에서 눈부신 진화를 하는 것 같다. 디지털 컨버전스와 유비쿼터스화에 따른 환경 변화에 따라 악성 코드의 제작에도 새로운 기수로가 개념이 도입되며, 피해 범위도 컴퓨터 시스템에서 PDA,휴대폰, RFID태그 등 네트워크로 상호 연동되는 스마트 기기 절반으로 확장되고 있다. 이미 이동 단말기에 대한 모바일 바이러스의 증가속도는 PC용 악성 프로그램을 추월하였으며, PC와 PDA를 동시에 감염시키는 바이러스인 Crossover 유형도 발견되었다. 사실 이번 레포트를 하면서 Cryptovirology를 조사하지 않았다면 이런 유형의 바이러스는 알지도 못하고 언젠가 당했을 지도 모를 일이다. 인터넷에도 자료가 얼마 없을 정도로 정보가 얼마 없었다. 당연히 암호는 보호용으로 사용되지 바이러스로 사용될지 알았을까? 더군다나 그와 함께 데이터 몸값을 요구하는 사례가 늘고 있으니, 이제부터라도 이을 생각하고 개발자의 입장에서 언제나 대비를 해야겠다.

   

 

5. 참고문헌

 

Wiki Pedia, 「Cryptovirology」, http://en.wikipedia.org/wiki/Cryptovirology, 2010.11.08

네이버, 「Cryptovirology」, http://blog.naver.com/juno72?Redirect=Log&logNo=120024061827, 2010.11.08

구글, 「Cryptovirology」, www.cryptovirology.com, 2010.11.08

네이트, 「Cryptoviral Extortion」, http://blog.paran.com/tjdgns915/14587152, 2010.11.08

다음, 「Ransomware」, http://coinz.tistory.com/410, 2010.11.08

 

# 레포트 준비하면서 조사한 내용 공유합니다.. 틀린 정보가 있을 수 있으니 댓글 달아주세요.

신입 개발자를 위한 조언
효율적으로 MSDN을 보는 방법
출처 : 신영진 codewiz@gmail.com http://www.jiniya.net 

윈도우 개발자를 위한 가장 기초적인, 동시에 가장 방대한 레퍼런스가 있다면 바로 MSDN일 것이다. 상당수의 고급 개발자들은 MSDN만 주어진다면 거의 모든 정보를 다 얻을 수 있다고 말하기도 한다. 하지만 아직도 초보 개발자들은 MSDN은 설치해두었지만 그 속에서 정보를 얻고 있지는 못하다. 게시판에 올린 질문에 냉소적으로 올라오는 MSDN을 참고하라는 말에 상처를 받기도 한다. 왜냐하면 정작 본인은 MSDN을 보았으나 정보를 얻지 못했기 때문이다. 이 글에서는 이러한 MSDN을 효율적으로 보는 방법에 대해서 다룰 것이다. 각 함수에 대한 정보를 보고 이해하는 방법에서부터 방대한 MSDN에서 자신이 원하는 정보를 찾기 위한 방법까지 언급할 것이다. 물론 이 과정에서 기본적인 영어 독해 실력은 필수사항이다. 

MSDN에서 얻을 수 있는 가장 기초적인 정보는 개별 윈도우 API의 사용방법이다. 여러분이 OpenProcess의 정보를 얻고 싶다면 MSDN을 켜고 색인에서 OpenProcess를 입력하면 된다. 하지만 고민은 이 과정부터 시작된다. 검색된 OpenProcess가 너무 많기 때문이다. 일반적으로 PC에 설치되는 윈도우 운영체제에서 사용되는 OpenProcess 정보를 보고 싶다면 옆에 base라고 붙은 것을 클릭하면 된다. 

이렇게 정보를 찾아 왔다면 MSDN은 여러분에게 OpenProcess에 대한 모든 정보를 보여줄 것이다. MSDN의 함수 설명은 총 여섯 개의 카테고리로 이루어진다. 인자 정보(Parameters), 리턴 값(Return Values), 주의 사항(Remarks), 예제 코드(Example Code), 요구 사항(Requirements), 관련 함수(See Also)가 그것이다.  

인자 정보에서 여러분이 이해해야 할 가장 큰 정보는 각 인자의 종류다. 종류는 크게 입력(in), 출력(out), 입출력(in, out)으로 나뉜다. 입력 정보의 대표적인 형태는 OpenProcess의 첫 번째 인자와 같은 것이다. OpenProcess의 첫 번째 인자는 열고자하는 프로세스 핸들의 권한을 설정하는 값으로 설명에 있는 process access rights라고 된 부분을 클릭해서 나오는 정보를 조합해서 넘기면 된다. 출력 정보의 대표적인 형태는 GetWindowText 함수에서 찾을 수 있다. GetWindowText의 두 번째 인자는 윈도우 캡션명을 저장할 문자열 포인터다. 이 공간은 출력용 포인터로 세 번째 인자인(nMaxCount)를 저장할 수 있을 만큼의 공간을 가진 버퍼를 넘겨야 한다. 끝으로 입출력 정보의 대표적인 형태는 GetVersionEx 함수에서 찾을 수 있다. GetVersionEx 함수의 유일한 인자인 lpVersionInfo는 넘기기 전에 dwOSVersionInfoSize에 구조체 크기를 지정해 주어야 한다. 이 후 함수를 호출하면 GetVersionEx 함수는 윈도우 버전 정보를 lpVersionInfo에 담아준다. 

리턴 값에서 인지해야 할 가장 중요한 두 가지 정보는 성공한 경우의 리턴 값과 실패한 경우의 리턴 값이다. 또한 실패한 경우에 추가적으로 실패한 원인을 찾을 수 있는 방법에 대해서도 알아두어야 한다. 대부분의 윈도우 API의 경우 GetVersionEx 함수와 같이 성공한 경우에 0이 아닌 값을, 실패한 경우에 0을 반환한다. 또한 실패한 경우에는 추가적인 실패 원인을 GetLastError를 통해서 조회할 수 있다. 종종 GetCurrentProcess와 같이 절대 실패하지 않는 함수들도 있다. 동시에 실패하지만 MSDN에는 실패에 대한 언급이 없는 GetWindowThreadProcessId와 같은 함수도 있다. GetWindowThreadPorcessId 함수는 잘못된 윈도우 핸들이 전달되면 실패하며, 실패여부는 GetLastError를 통해서 알 수 있다. 

끝으로 각 함수에 첨부되어 있는 요구 사항 표를 살펴보는 방법에 대해서 알아보자. 요구 사항 표에는 각 함수를 호출할 수 있는 운영체제가 나와 있다. 여기서는 여러분의 제품이 지원하는 운영체제의 하한선이 존재하는 가만 확인하면 된다. Windows 98을 지원해야 하는 제품이라면 VerifyVersion 함수를 정적으로 사용하는 것은 피해야 한다. 이 함수는 Windows 2000 이상부터 사용가능하기 때문이다. 굳이 이 함수를 사용해야 한다면 GetProcAddress로 동적으로 함수 주소를 구해서 사용하는 방법을 택해야 한다. 

이제 한 함수의 정보를 알아내는 방법에 대해서 살펴보았다. 하지만 망망대해 같은 MSDN을 탐색하는데에는 이런 방법으로는 한계가 있다. 좀더 효과적으로 다양한 정보를 한번에 살펴볼 수 있는 방법이 필요한 것이다. 이런 방법 중에 하나가 마법과 같은 버튼인 목차 동기화(Sync Contents) 버튼에 있다. OpenProcess 설명 부분에서 이 버튼을 눌러 보자. 그러면 OpenPorcess 설명이 있는 목차로 이동하게 된다. 여기서 여러 분들은 세 가지 중요한 사항을 인지해야 한다. 하나는 OpenProcess가 있는 목차의 위치다. 두 번째는 OpenProcess와 같은 단계에있는 다른 함수들에 대한 정보다. 마지막 정보는 OpenProcess 목차 부위에 있는 기술 문서(Technical Article)이다.



출처 : 신영진 codewiz@gmail.com http://www.jiniya.net 

1. 자바 설치하기. (잘모르시겠으면 jdk 로 설치)
http://java.sun.com/javase/downloads/widget/jdk6.jsp


2. 이클립스 설치하기. (호환성등의 문제로 헬리오스보다 갈릴레오를 추천하더군요)
http://www.eclipse.org/downloads/
* 이클립스는 설치파일이 따로 존재하지 않습니다. 압축풀고 실행하면 끝!




3. 안드로이드 SDK 설치하기.
http://developer.android.com/sdk/index.html




eclipse 실행후 Help -> Install New Software... 를 클릭한다.



Add 를 누른후 다음 내용을 기입한다.
Name : Android (다른걸로 해도 상관없다. 기억만 하면됌)
Location : https://dl-ssl.google.com/android/eclipse/  (안돼면 http://dl-ssl.google.com/android/eclipse/ )
기입한후 OK 버튼 클릭.



Next 눌러 플러그인 설치 완료. (이클립스가 다시 꺼졌다가 다시 실행됩니다.)

*설치가 완료되었다면, 안드로이드 SDK의 폴더를 지정해줘야합니다.
Window -> Preference 클릭

Android -> Browse 버튼을 눌러 SDK의 폴더 위츠를 지정해줍니다.


이클립스에 새로생긴 안드로이드 버튼을 클릭.


Available Packages 에서 필요한 설치항목을 찾아서 설치한다.
잘모른다 싶으면 모두 설치.!

.

동의를 눌러준후 설치.




설치가 다 되었다면 이클립스를 재시동합니다.

재설치후 안드로이드를 실행할 애뮬레이터를 만들어봅니다.

Name 은 기억할수 있는 애뮬레이터 이름. (프로젝트 만들때 필요)
target 은 개발하고자 하는 버전 보통 최신버전으로 함.


만들었으면 애뮬레이터를 선택후 Start 클릭.




로딩하는데 조금 시간이 걸립니다.


실행된화면. 실제 안드로이드폰과 구조가 같으니 놀아보자.

자바 환경변수 설정하기

자바의 CLASSPATH 설정하는 방법
JDK를 설치하면 java파일을 컴파일 할 수 있겠죠. 다만 JDK설치 폴더내 bin폴더 안에 있는 javac.exe라는 자바 컴파일용 파일이 있는 위치에서만 됩니다. 이것을 어느곳에서든지 컴파일이 가능하도록 설정해보도록 합니다.

먼저 내컴퓨터 등록정보 - 고급 - 환경변수를 클릭합니다. 그럼 다음과 같은 창이 하나 뜹니다.
여기서 시스템 변수를 변경합니다.

먼저 JAVA_HOME을 설정합니다. 새로만들기를 클릭해서 변수이름에 JAVA_HOME이라고 입력하고 변수 값에는 JDK가 설치된 경로를 입력합니다.
주의할 점은 C:\jdk1.5.0_06까지만 입력하고 뒤에 \;이나 ;을 붙이지 않도록 합니다.

그다음 Path를 설정합니다. 변경을 눌러서 추가를 합니다.
앞에 이미 지정되어 있는 Path뒤에 연결하여 입력합니다. 구분은 ;(세미콜론)으로 합니다.
;%JAVA_HOME%\bin;을 입력합니다.

CLASSPATH를 설정합니다. 시스템 변수에 CLASSPATH가 이미 있으면 추가를 하고 없다면 새로 만드시면 됩니다.
변수값에는 .;를 입력합니다.

확인 버튼을 눌러서 설정을 완료합니다.


시스템 변수가 제대로 지정이 되었는지 확인합니다.
윈도우시작 - 실행 - cmd를 입력하여 커맨드창을 엽니다.
확인은 echo %변수이름% 으로 합니다.

입력한대로 변수값이 제대로 나오는지 확인합니다.
Path부분의 밑줄은 환경변수에서 %JAVA_HOME%\bin;이라고 입력한 부분입니다.
만약 JAVA_HOME에서 JDK의 경로를 C:\jdk1.5.0_06를 C:\jdk1.5.0_06\; 이나 C:\jdk1.5.0_06; 이라고 입력했으면 저 밑줄친 부분은 C:\jdk1.5.0_06\;bin; 이나 C:\jdk1.5.0_06;bin; 이라고 나타날껍니다.
컴파일도 당연히 안되겠지요.
다음에 JDK를 다른곳에 재설치하게 되면 JAVA_HOME의 JDK의 설치경로만 바꿔주시면 간단해집니다.

제대로 실행이 되는지 확인해봅니다. javac를 입력합니다.
위와 같은 화면이 나오면 설정 완료~

- 확인 할때 java를 입력하지 않고 왜 javac를 입력하는이유?
JDK가 설치될때 java.exe는 경로등이 자동으로 등록이 됩니다. 설치직 후에 커맨드창을 열어서 java라고 입력하면 잘 실행됩니다. 그게 잘 되잖아~ 가 아닙니다. -_-;;
javac는 자동으로 등록되지 않기 때문에 환경변수를 설정하고 javac로 확인합니다.

출처 : http://deuxism.tistory.com/6
JSP를 공부해보자.!

일단 교재는 <자바 웹 프로그래밍>이다




1. Java 설치
http://java.sun.com/javase/downloads/widget/jdk6.jsp
 
2. Tomcat 설치
32-bit/64-bit Windows Service Installer (pgp, md5
포트번호 8080
설치후 시작-프로그램-Apach tomcat-Monitor tomcat을 구동하여 start
웹브라우저로 http://localhost:8080/을 접속하여 정상 동작하는지 확인

3. Eclipse 설치
[Korea, Republic Of] Amazon AWS (http)


위와같이 모두 설치하였다면 준비끝.
천천히 공부해봅시다.~

+ Recent posts