실전악성코드와멀웨어분석_Chater5정리

Download Report

Transcript 실전악성코드와멀웨어분석_Chater5정리

실전악성코드와 멀웨어 분석
- Chapter 5
http://www.iblue.kr
http://boanproject.com
II. 기본분석
□ 패킹정보
□ 바이러스검사
- Microsoft Visual C++ ver. 6/7
- 2013년 10월 19일 최초 업로드. 다수 백신(43/48) 에서 바이러스로 검출
https://www.virustotal.com/file/c989aea59682e8b04dce45a7fa4b1cc6ee9eac2cdb80f1d910c39a3daa501b88/analysis/1382098304/
II. 기본분석
□ 바이러스검사
- 다수 백신(43/48) 에서 바이러스로 검출
https://www.virustotal.com/file/eb1079bdd96bc9cc19c38b76342113a09666aad47518ff1a7536eebff8aadb4a/analysis/1387490592/
III. 상세분석
1. DLLMain 주소는 무었인가? 주소 : 0x1000D02E
DLL 파일은 DllMain는 DllEntryPoint로 모든 코드가 실행 된다.
III. 상세분석
2. Imports 윈도우를 이용해 gethostbyname 탐색 (Import 위치는 어디인가) : .idata섹션 0x100163CC
가) imports 함수에서 gethostbyname 함수 검색 확인
III. 상세분석
3. gethostbyname 상호 참조한 함수 개수 : 9개
가) gethostbyname 상호참조함수 개수 확인
나) 상호참조 9개 단축키 - CTRL+X
다) Xrefs to gethostname
- TYPE : p (호출 레퍼런스)
r (읽는 레퍼런스)
- 참조하는 함수 (5개)
sub_10001074
sub_10001365
sub_10001656
sub_1000208F
sub_10002CCE
III. 상세분석
4. 0x10001757 에 위치한 gethostbyname 호출의 DNS요청 확인 : pics.praticalmalwareanalys
가) 0x10019040 + 0x0Dh 값을 gethostbyname() 함수에 저장
나) 0x10019040 : [This is RDO]pics.praticalmalwareanalys
0x10019040+ 0x0Dh : pics.praticalmalwareanalys
III. 상세분석
5. 0x10001656 서브루틴 IDA Pro 지역변수 개수 : 23개 (var_*, 기타)
6 0x10001656 서브루틴 IDA Pro 파라미터 개수 : 1개 (arg_0)
III. 상세분석
7. Strings 윈도우 디스어셈블리 문자열 \cmd.exe /c 위치 : PE파일 xdoor_d 섹션, 0x10095B34
가) Strings 정보에서 확인 : \\cmd.exe /c
나) “\\cmd.exe /c “ 문자는 0x100101D0 영역에서만 사용하고 있음
상호참조에서 스택 1개만 참조하고 있음
III. 상세분석
8. \cmd.exe /c 참조하는 코드 영역 행위 : 원격 접근 백도어 프로그램으로 추정 (명령어 수행, Remote Shell Session 구문 등)
가) Memcmp 함수를 통해서 문자열을 다수의 비교하고 있음 : cd, enmagic, idle, uptime, language, robotnetwrk
III. 상세분석
9. 0x100101c8 dword_1008E5C4 경로 지정하는 전역변수에서, dword_1008e5c4 설정 (1) : 운영체제 버전 정보
가) 운영체제 버전 정보를 비교하여, cmd.exe /C, command.exe /C 식별하는 코드로 추정
III. 상세분석
9. 0x100101c8 dword_1008E5C4 경로 지정하는 전역변수에서, dword_1008e5c4 설정 (2)
- GetVersionExA 는 윈도우 운영체제 버전 정보확 인
- dwPlatformId가 숫자 2 이면(VER_PLATFORM_WIN32_NT) 이면 AL 설정
구조체 정보
typedef struct _OSVERSIONINFO {
DWORD dwOSVersionInfoSize; // 구조체 크기
DWORD dwMajorVersion; // OS 주버전 정보
DWORD dwMinorVersion; // OS 부버전 정보
DWORD dwBuildNumber; // OS 빌드 번호
DWORD dwPlatformId; // OS 플랫폼 (2008, 비스타, 2003, xp, 2000 (숫자 2)
TCHAR szCSDVersion[128]; // 서비스팩 설치 정보
} OSVERSIONINFO;
※ 출처 : http://anncc.tistory.com/m/post/view/id/36
[프로그램 예시]
#include <windows.h>
int main(int argc, char* argv[])
{
struct _OSVERSIONINFOA VersionInformation;
VersionInformation.dwOSVersionInfoSize = 148;
if (GetVersionExA(&VersionInformation)) {
printf("VersionInfoSize = %d \nMajorVersion = %d \nMinorVersion = %d \nBuildNumber = %d \nPlatformId
= %d \nCSDVersion = %s\n",\
VersionInformation.dwOSVersionInfoSize,\
VersionInformation.dwMajorVersion,\
VersionInformation.dwMinorVersion,\
VersionInformation.dwBuildNumber,\
VersionInformation.dwPlatformId,\
VersionInformation.szCSDVersion);
}
return 0;
}
III. 상세분석
10. 0x1000FF58 에서 서브루틴 수백라인 문자열 비교루틴, memcmp 에서 rotbotwork 문자열
성공에서 발생하는 이벤트
가) 문자열 robotwork
III. 상세분석
10. 0x1000FF58 에서 서브루틴 수백라인 문자열 비교루틴, memcmp 에서 rotbotwork 문자열 성공에서 발생하는 이벤트
나) 문자열 robotwork 일치시에 패턴
NO
YES
다) 레지스트리 질의, sub_100038EE 함수로 질의 값 반환
YES
III. 상세분석
11. PSLIST 익스포트 역할 : 프로세스 정보를 확인 및 반환하는 역할 수행
가) PSLIST 함수 (sub_10036C3 : 운영체제 버전 확인
III. 상세분석
11. PSLIST 익스포트 역할 :
나) sub_100664C 함수에서 CreateToolhelp32Snapshot() 함수로 프로세스 정보 확인
III. 상세분석
11. PSLIST 익스포트 역할 :
다) sub_1006518 함수에서 CreateToolhelp32Snapshot() 함수로 프로세스 정보 확인
III. 상세분석
12. 그래프 모드에서 sub_10004E79 상호 참조 그래프 확인, 이 함수에 진입하기 위해 호출하는 API 함수 :
해당 API 함수에만 기반을 두고 이 함수를 어떤 이름으로 변경하겠는가 :
가) 0x10004E79 주소검색
나) 상호참조 그래프 확인 : GetSystemDefaultLangID, send 함수 확인 => 정보확인 및 네트워크 통신 추정
III. 상세분석
12. 그래프 모드에서 sub_10004E79 상호 참조 그래프 확인, 이 함수에 진입하기 위해 호출하는 API 함수 :
해당 API 함수에만 기반을 두고 이 함수를 어떤 이름으로 변경하겠는가 :
다) 함수이름 변경 (가시적으로 확인할 수 있도록 함수 이름 변경)
III. 상세분석
13. DLLMain이 직접 호출하는 윈도우 API 함수 개수 : (4개) , 두 번째 깊이에서 개수 :
가) DLLMain 함수 진입
나) DLL 직접 호출 함수만 확인
Recursion Delth(반복깊이) : 1
Recursion Delth(반복깊이) : 2
III. 상세분석
14. 0x10001358의 Sleep 호출에서 대기 시간 : 30초
가) sleep 함수 위치 확인
나) 0x10001632 위치에서 Sleep 함수 사용
- 0X10019020 데이터 : [This is CTI]30
- 초변환 : 0x3E8h (8진수) => 1000(10진수)
=> 1000초 * 30 = 30,000 (30초)
III. 상세분석
15. 0x10001701 소켓에서 호출하는 파라미터 개수 및 내용 : 3개 (6, 1, 2)
16. 소켓과 IDA Pro에서 명명한 상수 기능을 이용해 파라미터를 유용하게 사용 여부 : MSDN 소켓 내용 반영
- 기능 [Use Symbolic Constant] 을 이용해서 상수 리스트 설정
※ 참조 : http://forum.falinux.com/zbxe/index.php?document_srl=429387&mid=C_LIB
MSDN: http://msdn.microsoft.com/en-us/library/windows/desktop/ms740506(v=vs.85).aspx
III. 상세분석
17. 명령어 옵코드 0XED 사용법 확인 :
VMWare 탐지를 수행하는 VMXh 매직 문자열 확인
가) ED 문자 검색 [Search] – [Text]-Sequence of Bytes
나) in eax, dx 문자 확인
다) VMxh 문자열 확인하는 키워드 확인
III. 상세분석
17. 명령어 옵코드 0XED 사용법 확인, VMWare 탐지를 수행하는 VMXh 매직 문자열 확인
다) 악성코드가 가상머신 탐지 함수를 사용하는, 위치에서 가상머신 탐지 알림 문자 출력 확인
III. 상세분석
18. 0x1001D988 함수 내용
19. IDA Python 스크립트 적용
20. 데이터를 ASCII 문자열 변환 방법
21. 문자 편집기로 스크립트 확인
다) xor 상태로 데이터 저장 상태
가) python script코드
- ScreenEA() : 커서의 현재 상태 저장
- 0x00~0x50 루프돌며 Byte 호출하여 값을 얻음
- XOR 수행 : 값 ^ 0x55
- PatchByte : IDA Pro 화면에 바로 패치 적용
라) XOR 수행결과 단축키 A (데이터 -> ASCII 문자열)
나) Python 스크립트 선택