안녕하세요. 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 값을 통하여 클라이언트를 관리할 수 있는 기능이 추가되었습니다.
':: 문제풀이 > Pracical Malware' 카테고리의 다른 글
실전 악성코드와 멀웨어 분석 실습 7-2 분석 (0) | 2016.09.11 |
---|---|
실전 악성코드와 멀웨어 분석 실습 7-1 분석 (0) | 2016.09.09 |
Red_Message :: 실전 악성코드와 멀웨어 분석 실습 6-3 분석 (0) | 2016.09.09 |
Red_Message :: 실전 악성코드와 멀웨어 분석 실습 6-2 분석 (0) | 2016.08.01 |
Red_Message :: 실전 악성코드와 멀웨어 분석 실습 6-1 분석 (0) | 2016.07.29 |