악성코드/악성코드 분석

세계 최초 컴퓨터바이러스 중 하나인 Elk Cloner 바이러스 분석

쿨캣7 2017. 4. 1. 22:41
728x90
반응형


* 세계 최초 컴퓨터 바이러스 중 하나

세계최초 컴퓨터 바이러스 얘기 중에 빠지지 않는 바이러스가 Richard Screnta 의 Elk Cloner 바이러스입니다. 1981년 8비트 애플2 컴퓨터용으로 제작되어 1982년 퍼집니다. 1986년 제작된 브레인 바이러스보다 5년 정도 빠릅니다. 하지만, 애플2는 8 비트 컴퓨터로 현재 흔히 PC라 불리는 IBM PC와는 다릅니다. 따라서, 기준에 따라 최초의 컴퓨터 바이러스는 Elk Cloner 혹은 브레인 바이러스가 되기도 합니다.

1990년 제작자가 직접 글을 남기기도 했습니다.

http://www.skrenta.com/cloner/clone-post.html


* 감염 디스크와 소스코드

제작자는 자신의 홈페이지에 감염 디스크와 소스코드를 올려두었습니다.

* 소스코드 : http://www.skrenta.com/cloner/clone-src.txt

설명하나 없는 어셈블리 코드를 보면 사실 막막합니다. 인텔 어셈블리는 알지만 6502 어셈블리는 모르니 명령어를 보고 이게 어떤 의미일까 대충 예상만 했죠. 

감염 디스크 이미지도 올라와 있어 애플 에뮬레이터에서 실행해 봤지만 다른 디스크로 감염이 안되더군요. 그렇게 지난 몇년 동안 디스크 이미지를 가지고만 있었습니다.


Elk Cloner 소스코드Elk Cloner Source Code



* 분석

어느날...
이 애플2 컴퓨터 바이러스가 생각났고 주말에 시간이 좀 나서 한번 볼까 합니다.
그렇게 토요일 오후와 일요일 동안 소스코드를 하나하나 따라가며 주석도 달기 시작합니다.
덕분에 기본적인 6502 어셈블리, 애플 2 메모리 구조, CALL-151 명령, DOS 3.3 구조도 조금씩 알게되었습니다.

Elk Cloner virus analysis Elk Cloner virus analysis




* 변조된 DOS 3.3 = 바이러스 코드

많은 자료에 이 바이러스는 부트 바이러스라고 합니다. 그래서 MS-DOS에서 부트 바이러스와 비슷한 구조가 아닐까 생각했는데 다르더군요. 제 생각에 부트 바이러스 보다 MS-DOS의 시절 도스 커널을 감염 시키는 바이러스나 요즘의 부트킷(Bootkit)의 선조격이라고 해야하지 않을까 합니다.

애플 DOS 3.3에서 INIT 명령으로 디스크를 포맷할 때 DOS 3.3도 같이 설치됩니다. MS-DOS 시절 포맷 명령에 /S를 해서 부팅 디스크를 만드는 것과 동일하다고 생각하면 됩니다.

감염 전과 감염 후 디스크 이미지를 비교하면 부트 레코드는 변한게 없습니다. 다만 DOS 3.3 코드 일부분이 패치되어 있습니다. (4C 00 9B는 JMP 9B00입니다.)



실제 바이러스 메인 코드는 DOS 3.3에서 사용하지 않는 디스크 영역에 보관된다고 합니다.

감염 전과 감염 후를 비교하면 빈영역에 바이러스 코드가 존재하는걸 알 수 있습니다.



부팅한 DOS 3.3 자체가 바이러스이기 때문에 별도의 메모리 상주를 할 필요는 없습니다.

바이러스 감염 여부는 CALL-151로 모드를 변경하고 9000L로 9000 주소를 디스어셈블해보면 됩니다.

깨끗한 DOS 3.3으로 부팅하면 9000 번지에 별다른 내용이 없습니다.
- 시스템에 따라 다를 수 있습니다.

정상 DOS 3.3


하지만, 감염된 디스크로 부팅하면 02 (바이러스 버전)과 [004C]주소에 0xFF 값을 넣는 바이러스 초반부 코드를 볼 수 있습니다.

바이러스 감염 디스크로 부팅



* DOS 3.3 메모리 변조

바이러스는 베이직 코드를 실행하는 RUN 코드를 패치하고 베이직 로드 (LOAD), 기계어 로드(BLOAD), 파일 목록보기(CATALOG)를 후킹합니다.

이외 사용자 정의 코드도 가집니다. 사용자 정의 코드를 어떻게 실행하는지는 아직 잘 모르겠네요.

CATALOG 후킹 방식을 살펴보겠습니다

우선 DOS 3.30에서 CATALOG 명령 입력 하면 0xA56E 주소 코드가 실행된다고 합니다. 바이러스는 해당 주소에 바이러스로 점프하는 코드를 넣습니다.

메모리 변조 코드를 보면 0xA56E 부터 0xA570에 0x4C, 0xB6, 0x90 코드를 넣는걸 볼 수 있습니다.


정상적인 DOS 3.3의 0xA56E 코드는 아래와 같습니다.


하지만, 감염된 시스템은 CATALOG 명령을 입력하면 0x90B6으로 점프 합니다.


0x90B6으로 가면 원래 감염 여부 확인을 하고(JSR $9074) 원래 CATALOG 명령 (LDA #$06, JSR $A2AA ...)을 그대로 수행합니다.


후킹이라고 생각한 부분에서 원본 코드 백업을 안해서 의아했는데 원래 DOS 3.3 의 코드를 아예 가지고 있더군요.
당시에는 DOS 3.3을 대부분 사용했으니 큰 무리가 없었겠죠.
 
MS-DOS 시절 특정 버전에서만 동작하는 Tenbytes 바이러스와 유사하다고 볼 수 있겠죠. 따라서, 이 바이러스는 DOS 3.3 에서만 활동하고 다른 버전이나 변형된 DOS 3.3에서는 오동작 할 수 있을 겁니다.


* 감염

소스코드를 보면 CATALOG 명령 등으로 디스크를 읽을 때 바이러스가 감염되어야 합니다. 하지만, 어떤 이유에서인지 제대로 감염되지 않네요.

아직 제가 애플 디버깅에 익숙하지 않아서 원인을 파악하지 못했습니다.

강제로 감염 시키려면 CALL-151 후 감염 시킬 디스크를 넣고 90DAG 하면 감염 루틴이 실행되고 디스크는 바이러스에 감염됩니다.

이부분을 성공했을 때 정말 눈물(?) 나더군요.
감염 디스크를 만들기 위해 몇년을 기다렸던가 !!!!!!!

* 증상

많은 분석 내용을 보면 50 번 부팅 때 마다 메시지를 출력한다고 되어 있습니다.
하지만, 분석해보면 감염된 디스크로 부팅 횟수에 따라 다른 증상이 존재합니다.

  10 회 (0x0A) : [03F2.03F3] = 0x69FF  저장
  15 회 (0x0F) : [0032] = 3F - INVERSE Mode
  20 회 (0x14) : LDA $C030 3회 - beep 음
  25 회 (0x19) : [0032] = 7F - 반짝 반짝 모드
  30 회 (0x1E) : CATALOG 명령 수행 할 때 파일 종류 (I, T, B, A) 순서 변경해 타입이 이상하게 나옴
  35 회 (0x23) : [AAB2] = 0x85
  40 회 (0x28) : AUTOSTART ROM RESET routine address 내용 변경
  45 회 (0x2D) : [00D6] = 0x80
  50 회 (0x32) : 메시지 출력
  55 회 (0x37) : [BD03] = FF RWTS main entry
  60 회 (0x3C) : [BD03] = 0x20
  65 회 (0x41) : [A180.A182] = 4C 69 FF (JMP FF69)
  70 회 (0x46) : [BD03] = 0x10
  75 회 (0x4B) : JMP $C600 (재부팅 됨)
  76 회 (0x4C) : JMP $C600 (재부팅 됨)
  77 회 (0x4D)  : JMP $C600 (재부팅 됨)
  78 회 (0x4E)  : JMP $C600 (재부팅 됨)
  79 회 (0x4F) : [B3BF] = 00 ... [B3BF]는 부팅 횟수로 이 값이 초기화됨

헉... 정말 많습니다.

주소에 데이터 넣는건 애플 레퍼런스를 참조하면 될텐데 아직 정확한 의미는 못 찾았습니다.
- 귀찮기도 하고...

15번 째 부팅하면 INVERSE MODE가 됩니다.



79번째 부팅하면 부팅 횟수 카운터가 0 이되기 때문에 80 번째 부팅하면 감염 초기와 같습니다. 따라서 95 회 때 INVERSE Mode, 대략 130 번째 부팅 때 메시지가 출력 됩니다. 50 번 부팅 할 때 마다 메시지 출력은 잘못된 분석입니다.

그런데 감염 디스크로 이런 저런 증상을 확인했는데 50번째 부팅 했을 때 메시지는 안나타나더군요.
- 어떤 행위가 있을 때 증상이 나타난다고 하는데 다음에 시간되면 한번 분석해 봐야겠습니다.
결국 CALL-151로 들어가서 92FFG로 강제 실행해서 그렇게 보고 싶었던 메시지를 봅니다.

ELK CLONERELK CLONER message



* 미해결 사항

언제 시간이 될 때 다음 사항을 확인해 보고 싶습니다.


 1. 변경되는 나머지 주소의 목적
 2. 자세한 디스크 감염 알고리즘
 3. CATALOG 명령 등으로는 감염 안되는 원인 
 4. 50 번 째 부팅 때 메시지가 출력 안되는 원인
 5. 바이러스가 만든 유저 명령 수행

- 혹시 아시는 분은 연락주셔도 됩니다 ^^


* 맺음말

1980년대 초 제작된 바이러스를 분석해 봤습니다.
오랫만에 정말 재미있게 분석해 봤네요. 역시 90년대 이전 샘플 분석이 재미있습니다.

바이러스 분석 덕분에 간단하지만 6502 어셈블리와 애플2 컴퓨터 내부도 공부했습니다.
(추가 : 최초 글 쓰고 5년 지난 2017년 현재... 명령 거의 잊어버렸네요 TT)

컴퓨터 바이러스라는 개념이 존재하기도 전에 이런 코드가 만들어 졌다니 신기하면서도 현재 악성코드에서 사용되는 기법이 이때도 사용되고 있다는걸 알 수 있었습니다.


728x90
반응형