안녕하세요. Message입니다.

<실전 악성코드와 멀웨어 분석> 책의 실습 문제 6-4을 분석합니다.

분석환경은 Windows 7 Ultimate 64x / Vmwre 12.1.0 build 입니다.

 

 

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

1. 실습 6-3과 6-4의 main 함수에서 호출한 함수 간의 차이점은 무엇인가?

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

 

[Flow Chart]를 이용하여 main의 구조를 살펴보면,

지난 문제들과는 구조가 약간 상이함을 알 수 있습니다.

기존의 0x401000(인터넷 연결 확인 함수), 0x401040(HTML파싱), 0x4012B5(printf) 등은 동일합니다.

 

Tip. 주석 남기기

기존에 분석한 함수의 기능을 빨리 파악하기 위해 주석을 남기는게 좋습니다.

- 명령어 옆에 코멘트 : 단축키 [ : ]

- 라인추가 : 단축키 [ INS ], [ Shift+INS ] (코드 위 아래로)

 

 

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

2. 어떤 새로운 코드 구조가 main 함수에 추가됐는가?

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

 

그래프상에서 아래에서 위로 향하는 굵고 파란 화살표가 눈에 띕니다.

바로 반복문을 뜻하는 화살표입니다.

 

어떤 반복문이 추가되었는지 hex-ray 기능을 이용하여 살펴보면

아래와 같이 for문이 추가된것을 알 수 있습니다.

 

어셈블리코드에서 살펴보면,

main 초반에 인터넷 연결을 확인한 이후에 바로 반복문에 진입합니다.

만약 인터넷 연결이 되어있지 않다면,

XOR EAX, EAX 명령어로 Overflow Carry 플래그를 청소한 뒤 loc_4012B1 으로 분기합니다.

 

이후부터 [ebp+var_C]에 0을 할당하게 되는데, 여기서 var_C 변수는 반복 카운터에 사용됩니다.

초기에 0 으로 설정된 이후에, 바로 아래에 있는 loc_401251 에서 add 명령어를 통해 +1씩 증가합니다.

for문이 종료되는 시점은 loc_40125A 에서 cmp [ebp+var_C], 5a0h(1440) 명령어의 결과값이 (op1 - op2)

0 이상이면 jge(greater or equal, <=) 명령어에 의하여 loc_4012AF 주소로 분기하게 됩니다.

 

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

3. 이 실습의 HTML 함수 파싱이 기존 실습과 어떤 차이점이 있는가?

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

기존 HTML 파싱을 수행했던 0x401040 서브루틴의 경우 인자값이 없었습니다.

하지만 지금 실습중인 악성코드는 for 문의 var_C 변수를 인자값으로 받습니다.

해당 인자값이 어떻게 사용되는지 살펴보면 아래와 같이 sub_401040의 매개변수 a1으로 선언되어

sprintf 함수의 3번째 인자로 사용됩니다.

 

sprintf 함수로 인하여 Dest 변수에 입력된 "Internet Ex..../Pma%d" 문자열은 다시

InternetOpenA API의 첫번째 인자인 User-Agent 값에 들어가게 됩니다.

결국 0x401040에 넣어주는 인자값은, 서버에 접속할때마다 Uger-Agent 값을 +1 씩 변경할 것이고

서버측에서는 클라이언트의 Uger-Agent 값을 통해 얼마나 오래 감염된 PC인지 추정할 수 있는 근거가 될것입니다.

 

 

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

4. 프로그램이 얼마나 오래 동작하는가? (인터넷에 연결돼 있다고 가정)

5. 이 악성코드에서 네트워크 기반의 행위가 존재하는가?

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

얼마나 동작하는지 알아내기 위해, Sleep 함수가 있는곳으로 가보겠습니다.

Sleep 함수에 입력되는 인자값은 0EA60h(60,000) = 60초 입니다.

push되는 "0EA60" 값이 문자열스럽지만, 계산기로 16진수 계산하시면 정확합니다.

for문은 1440번 반복되므로, 60이 곱해지면 자연스럽게 1440분이 됩니다.

1440분 = 24시간 이므로, 하루동안 동작하는 프로그램입니다.

 

네트워크 기반의 행위는 매번 변경되는 User-Agent 값이 되겠습니다.

 

 

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

6. 이 악성코드의 목적은 무엇인가?

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

전 문제와 동일하게 인터넷 연결 여부, HTML 파싱등을 수행하나,

증가되는 User-Agent 값을 통하여 클라이언트를 관리할 수 있는 기능이 추가되었습니다.

 

posted by Red_Message