IDA 실습예제

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 주소에 해당 값은 저장된다


sub_10003695주소의 함수가 무엇인지 확인하자

* 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"와 일치하면 실행된다

Language id를 획득하는 것을 볼 수 있다



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 )