2018. 4. 26. 10:15ㆍ악성코드 분석
1. DllMain의 주소는 무엇인가?
DLL을 로드하였을 때 실행되어지는 것이 DllMain함수이다
Ctrl+t => "DllMain"을 검색해서 찾을 수 있었다
2. Imports Window를 이용해 gethostbyname을 탐색해보자. 임포트 위치는 어디인가?
Imports 윈도우에는 임포트되는 모든 함수 목록이 존재한다
Ctrl+t => gethostbyname 검색해서 찾을 수 있다
임포트 되는 위치는 아래와 같다
3. gethostbyname을 호출은 몇번 이루어 지는가?
gethostbyname함수의 xref를 검사해보면 알 수 있다
call 명령어를 통해서 해당 함수의 호출이 9번 실행된다
4. 0x10001757에 위치한 gethostbyname호출을 보면 어떤 DNS요청이 이루어지는지 알 수 있는가?
=> gethostbyname( *name ) 함수가 실행된다
EAX레지스터에는 off_10019040이 가리키고 있는 값 + 0x0d 의 주소가 저장된다
=> gethostbyname( EAX Value ) 실행
off_10019040 : 0x10019194
0x10019094 + 0x0d = 0x100190A1
0x100190A1주소에 존재하고 있는 값은 아래와 같다
=> gethostbyname( *0x100190A1 )
=> gethostbyname ( "pics.practicalmalwareanalysis.com" )
5,6. 0x10011656에 있는 서브루틴에서 IDA Pro는 지역변수와 파라미터를 몇개나 인지하고 있는가?
음수값 -> 지역변수 ( 23개 )
양수값 -> 파라미터 ( 1개 )
7. Strings Window를 이용해 디스어셈블리 내의 \cmd.exe /c를 찾아보자. 어디에 있는가?
메모리에 "\command.exe /c" 와 "\cmd.exe /c" 문자열의 위치를 찾아냈다
8. \cmd.exe /c를 참조하는 코드 영역에서 무슨일이 발생하는가?
XREF ( Cross Referemce )를 통해서 코드 내 어디서 사용되고 있는지 찾을 수 있다
그래프 모드로 두 문자열의 실행 루틴을 살펴본 결과이다
* GetSystemDirectoryA
Retrieves the path of the system directory. The system directory contains system files such as dynamic-link libraries and drivers
시스템의 종류에 따라서 cmd or command 루틴을 타고 다음 코드가 실행된다
9. 0x100101C8에서 dword_1008E5C4는 경로를 지정하는 전역변수로 보인다 악성코드는 어떻게 dword_1008EC5C4를 설정하는지 xref를 참고해서 설명하여라
dword_1008E5C4 주소의 xref목록을 참조하자
Type : w(write), r(read) 중 write 에서 해당 주소의 값이 설정된다
해당 지점으로 이동하자
sub_10003695 위치의 함수의 결과값은 EAX레지스터에 저장된다
mov명령으로 0x1008E5C4 주소에 해당 값은 저장된다
* GetVersionExA() : return for the operating system version
리턴값은 OS의 버전이 되겟다
OS버전값은 dword_1008E5C4에 저장되고, 그 값에 따라서 \cmd.exe or \command.exe 가 실행된다
10. 0x1000FF58에서 서브루틴으로 수백 라인은 문자열을 비교하기 위한 일련의 memcmp비교다
robotwork와 문자열 비교가 성공적으로 이루어 지면 무슨 일이 일어나는가? ( memcmp가 0을 반환했을 때 )
memcmp( *pointer , "robotwork" )함수가 실행되고 결과에따라서 루틴이 갈린다
입력 문자열이 robotwork와 일치하는 경우 sub_100052A2주소에 위치한 함수 실행
* sub_100052A2 Function : 크게 5가지의 함수를 볼 수 있었다
* RegOpenKeyExA
SOFTWARE\Microsoft\Windows\CurrentVersion 레지스트리에 대한 키를 얻는다
* RegQueryValueExA
레지스트리 키에 대한 값을 가져옴
* atoi
ascii => int
* sprintf ( argv1 , argv2 )
argv1에 argv2를 입력
* send()
네트워크에서 socket통신시 데이터 전송시 사용하는 함수
11. PSLIST Export는 무슨 역할을 하는가 ?
Name Windows에서 PSLIST를 쉽게 찾을 수 있고 xref그래프를 살펴보자
sub_1000664C 함수에서 PSLIST를 사용하고 있다
sub_1000664C 함수에서 여러함수가 사용되고 있지만 Process32First & Process32Next & CreateToolhelp32Snapshot 세가지 함수를 눈여겨 보자
sub_1000664C로 이동해서 어떤 실행이 이루어지는지 살펴본다
제일 먼저 CreateToolhelp32Snapshot 함수가 실행
thread목록이나 process목록들을 가져온다
그 다음으로 Process32First함수가 실행되어서 제일 첫번째 프로세스를 얻어온다
Process32Next함수를 통해 다음 프로세스를 얻기 전 모듈에 대한 정보를 가져오는 모습을 확인할 수 있다
EnumProcessModules & GetModuleFileNameExA : 모듈에 대한 정보 획득
마지막으로 Process32Next함수를 통해서 다음 프로세스를 가져온다
프로세스를 모두 얻을 때까지 반복되어진다
12. 그래프모드를 이용해 sub_10004E79상호 참조 그래프를 그려보자
이 함수에 진입하기 위해서 호출하는 API함수는 무엇인가?
해당 API함수에만 기반을 두고 이 함수를 어떤 이름으로 변경하겠는가?
StartAddress는 IDA의 특징으로써, 스레드를 실행시킬 때 실행되는 함수이다
해당 주소로 들어가보자
StartAddress함수의 XREF를 통해 StatrtAddress함수가 사용되어지는 주소로 이동한다
StartAddress함수는 CreateThread함수의 인자로써 사용되어지는 것을 확인할 수 있다
즉, 사용되어지는 API함수는 CreateThread 함수이다 ( 함수 실행을 위한 Thread를 생성한다 )
StartAddress함수는 무슨일을 하는지 확인해보자
위 그림은 StartAddress의 루틴이다
sub_10004E79 함수 실행 이전에 참조 그래프에서 참조되어지는 sub_1000FF58 함수를 호출하고 있다
위 그림은 sub_1000FF58의 루틴을 그래프모드로 확인한 모습이다
백도어의 형태를 가지고 있다. ( 사용자의 입력 문자열을 비교하여 실행루틴 결정 )
sub_10004E79 함수는 입력문자열이 "language"와 일치하면 실행된다
13. DllMain이 직접 호출하는API함수는 몇개인가? 두번째 깊이에서의 API함수는 몇개인가?
아무런 조건이 없다면 DllMain이 직접 호출하거나, DllMain을 호출하는 API함수들은 너무 많다
조건을 정해서 상호참조 그래프를 그려보자
* Cross references from : DllMain이 호출하는 API 함수들을 보여주도록한다
* Recursion depth : 자기를 포함한 2번 이하로 다른 함수를 거쳐서 호출하는 함수만을 보여준다
14. 0x10001358에서 Sleep호출이 존재한다. 이 코드가 수행되려면 프로그램이 얼마동안 Sleep하는가?
Sleep함수 호출 시 인자로 입력되는 상수를 확인하면 문제를 해결할 수 있다
off_10019020 주소로 이동하자 ( 0x10019020은 상수값이 존재하는 주소를 가리킨다 )
즉, 0x100192AC주소에 상수값이 존재한다
상수 30이 존재하고 있고, Sleep함수 호출 부분을 살펴보면 atoi함수와 곱셈연산을 수행한다
Sleep ( 30 * 1000 ) => 30초간 Sleep한다
15. 소켓을 호출하고 있다. 세 가지 파라미터는 무엇인가 ? IDA Pro의 심볼 상수 기능을 이용하자
socket ( AF , TYPE , PROTOCOL ) 함수가 실행되는데 인자로 상수가 입력된다
상수로 보기에는 가독성이 떨어지기 때문에 Symbol Constant 기능을 이용한다
각 상수에 해당하는 적절한 문자열로 변환한다.
=> socket( AF_INET , SOCK_STREAM, IPPROTO_TCP )
'악성코드 분석' 카테고리의 다른 글
Wireshark Columns설정 (0) | 2018.05.01 |
---|---|
VirtualBox 가상머신 설치와 공유폴더 및 네트워크 설정 (0) | 2018.04.30 |
아이다 사용방법 ( IDA ) (0) | 2018.04.25 |
악성코드 기초 동적분석 ( Registry Modify ) (0) | 2018.04.23 |
악성코드 기초 정적분석 ( Dropper ) (0) | 2018.04.21 |