#1 : http://redscreen.tistory.com/66

#2 : http://redscreen.tistory.com/67

#3 : http://redscreen.tistory.com/68

#4 : http://redscreen.tistory.com/71

 

------------------------------------------------------------------------------------------------------------------------------------------

13. DllMain이 직접 호출하는 윈도우 API 함수는 몇 개인가? (두번째 깊이에서)

------------------------------------------------------------------------------------------------------------------------------------------

DllMain이 호출하는 API를 알아보기 위해 DllMain에서 [Xrefs from] 기능을 실행했더니 어마어마한 결과가 나왔습니다.

그래서 문제에서 두번째 깊이에서 하라고 했구나..싶었습니다.

 

깊이를 설정하기 위해 [View-Graphs-User xrefs chart] 를 선택합니다.

이후에 아래와 같이 설정해줍니다. 깊이는 DllMain 자신을 제외하고 "1"로 설정합니다.

 

이후에 아래와 같은 결과를 얻을 수 있습니다.

예전에 막무가내로 분석할때는 막대한 차트량을 보고 그냥 꺼버렸는데,

책을 통해 차근차근 보니 배를 냅두고 수영했다는 생각이 드네요.

 

 

------------------------------------------------------------------------------------------------------------------------------------------

14. 0x10001358에서 Sleep 호출이 존재한다. (sleep까지 수밀리초 값을 파라미터로 갖는 API)

      코드 후반부를 보면 이 코드가 수행되려면 프로그램이 얼마동안 sleep하는가?

------------------------------------------------------------------------------------------------------------------------------------------

해당주소로 가보면 아래와 같은 코드가 나옵니다.

sleep함수를 실행하기 위해 eax 인자값을 받고있습니다.

eax값이 무엇인지 알아내기 위해 eax값에 관여하는 명령어들을 살펴보겠습니다.

10001341 mov eax, off_10019020 : 주소값 10019020에서 eax에 "[This is CTI]30" 문자열을 할당합니다.

10001346 add eax, 0Dh : eax의 값에 0Dh(13)을 더합니다. 앞에 있는 "[This...]" 값을 지나 30을 가리키게 합니다.

1000134A call ds:atoi : 문자열 30을 숫자로 바꿉니다.

10001350 imul eax, eE8h : eax에 저장된 30에 3E8h(1,000)을 곱합니다.

즉, 정리하면 30,000 밀리초 = 30초 를 기다리게합니다.

 

------------------------------------------------------------------------------------------------------------------------------------------

15. 0x10001701에서 소켓을 호출한다. 세 가지 파라미터는 무엇인가?

------------------------------------------------------------------------------------------------------------------------------------------

해당주소로 가보면 아래와 같은 코드가 나옵니다.

socket에 들어가는 값은 6, 2, 1 값입니다.

MSDN에 들어가 해당 상수값이 의미하는바를 찾아보려 했는데

문제의 출제 의도는 이 상수값을 확인하라는 것이 아닙니다.

다음 문제에서 나머지를 다룹니다.

 

 

------------------------------------------------------------------------------------------------------------------------------------------

16. 소켓과 IDA Pro에서 명명한 심볼 상수 기능을 이용해 이 파라미터를 좀 더 유용하게 가능?

      변경 후 파라미터는 무엇인가?

------------------------------------------------------------------------------------------------------------------------------------------

각 숫자를 오른쪽 클릭해서 Use Symbolic Constant를 선택하면 IDA Pro에서

특정 값을 갖는 모든 상수 리스트를 나열한 대화상자가 나타납니다.

해당값들에서 문자열을 입력하면 자동으로 검색이 됩니다.

값을 찾아 지정하면 아래와 같이 변경된 인자들을 확인할 수 있습니다.

조금더 유용해진건 사실이지만, 함수에 따라 상수값을 자동으로 넣어주는 기능이 있었으면 좋겠네요.

있는데 제가 모를 확률이 큽니다.

 

 

------------------------------------------------------------------------------------------------------------------------------------------

17. 명령어 옵코드 0xED의 사용법을 찾아보자. 이 명령어는 VMware 탐지를 수행하는 VMXh

      매직 문자열로 사용한다. 이 악성코드는 이를 이용하고 있는가?

      VMware를 탐지하는 다른 증거가 있는가?

------------------------------------------------------------------------------------------------------------------------------------------

먼저 OPCODE중의 하나인 0xED의 사용법에 대해 찾아보았습니다.

검색에서 명확한 답을 찾기 힘들어서, 가지고 있는 어셈블리언어 책을 참고하였습니다.

-------------------------------------------------------------------------------------------------

IN : Input from Port

- 포트에서 한 바이트나 워드를 AL 또는 AX로 입력한다.

- 소스 피연산자는 포트 주소로서 8비트 상수나 DX내에 16비트 주소로 표현된다.

- IA-32에서는 더블워드가 포트를 통해 EAX에 입력될 수 있다.

- 명령어 형식 : IN accum, imm 또는 IN accum, DX

-------------------------------------------------------------------------------------------------

사실 읽고도 이해가 잘 안갔습니다.

갑자기 포트 얘기가 나오면서 첫번째 멘붕이었고

이것이 VMware 탐지를 수행하는 매직문자열 VMXh 문자열과 무슨 상관이 있는건지...

이해가 안되자 계속 IN명령어와 0xED에 대해 검색했지만, 명쾌한 답을 찾지 못하여 생각을 달리하였습니다.

VMware 탐지 우회에 대한 내용으로 검색하자 관련 내용이 나오더군요

내용에 대해 알고싶으신 분들을 위해 블로그 URL을 남깁니다. (URL : http://goo.gl/BvFjJF)

 

간단히 정리하자면, "VMXh" 문자열은 VM을 탐지하기 위한 다양한 방법들중 하나입니다.

원리는 가상머신 환경에서 Guest와 Host 간의 통신채널 확인입니다.

Intel x86 환경에서 I/O 작업을 수행하기 위해서는 IN OUT 명령어를 사용하며

"VMHx" 문자열은 가상머신 환경에서 IN 명령어에 의해 생성되는 Host와 Guest간의 고유한 통신 채널을 의미합니다.

 

이제 왜 IN명령어를 쓰고, "Vmxh" 문자열을 사용하는지 알았으니,

해당 명령어와 문자열이 있는지 검색해보겠습니다.

[Search-text] 를 선택하여 문자열 0xED를 검색합니다.

 

생각보다 결과값이 많이나옵니다. 문자열을 입력하면 바로 검색기능이 활성화 되므로

"in"을 입력하면 아래와 같이 우리가 원하는 라인을 찾을 수 있습니다.

 

더블클릭하면 아래와 같은 프로시져가 나오게 되며, 100061C7부터

아랫부분 In명령어를 이용한 Vmware 환경 탐지 부분이 나옵니다.

 

 

------------------------------------------------------------------------------------------------------------------------------------------

18. 0x1001D988로 점프해보자. 무엇을 찾을 수 있는가?

------------------------------------------------------------------------------------------------------------------------------------------

해당주소로 가보면 아래와 같은 무작위 문자열이 나옵니다.

 

------------------------------------------------------------------------------------------------------------------------------------------

19. IDA 파이썬 플러그인을 설치했다면 Lab05-01.py를 실행해보자.

      IDA 파이썬 스크립트는 이 책의 악성코드와 함께 제공한다.

      (커서가 0x1001D988에 위치해야 함) 스크립트 실행 후 무슨 일이 일어났는가?

21. 문자 편집기로 스크립트를 열어보자. 어떻게 동작하는가?

------------------------------------------------------------------------------------------------------------------------------------------

파이썬 코드는 문제 폴더에 Lab-01.py 이름으로 포함되어 있습니다.

커서의 현재 위치를 sea 변수에 저장한뒤, 0x00 ~ 0x50 까지 루프를 돌며 XOR 연산을 수행합니다.

 

0x1001D988에 커서를 두고 [File-Script File]을 선택하면 아래와 같이 문자열이 변경됩니다.

  

 

------------------------------------------------------------------------------------------------------------------------------------------

20. 동일한 위치에 커서를 두고 이 데이터를 ASCII 문자열로 어떻게 변환할 수 있는가?

------------------------------------------------------------------------------------------------------------------------------------------

문자열이 시작하는 주소에 커서를 두고 단축키 "A" 를 누르면 아래와 같이 아스키 문자열로 변환됩니다.

 

 

 

posted by Red_Message