IDA Pro만을 이용해 Lab05-01.dll 내의 악성코드를 분석하라. 이 실습의 목적은 IDA Pro를 직접 다루는 데 있다. 이미 IDA Pro를 사용해 본 적이 있으면 다음 문제를 무시하고 악성코드 리버싱에 초점을 맞춰도 좋다.
1. DllMain의 주소는 무엇인가?
1000D02E이다. Function 윈도우에서 찾고싶은 함수 이름을 타이핑하면 위와 같이 검색이 된다.
2. Imports 윈도우를 이용해 gethostbyname을 탐색해보자. 임포트 위치는 어디인가?
문제 1번에서 했던 방식과 같이 Imports 윈도우에서 검색하여 100163CC라는 것을 알아냈다.
3. gethostbyname에 함수는 몇 개인가?
gethostbyname 함수의 xrefs 윈도우를 통해 9번의 호출이 있다는 것을 확인할 수 있다.
4. 0x10001757에 위치한 gethostbyname 호출을 보면 어떤 DNS 요청이 이뤄지는지 알 수 있는가?
gethostbyname 함수는 도메인 이름으로 부터 실제 IP를 얻어오는 함수이다.
eax를 push하므로 eax가 인자라는 것을 알 수 있다.
push eax 하기 전에 eax에 10019040가 가리키는 값을 넣어주고, D만큼 더해주는 것을 알 수 있는데, 이 과정에 대해서 자세히 확인해 보자.
10019040에는 10019194라는 값이 들어있다. 따라서 10019194의 값을 확인 해 보아야 한다.
10019194에는 [This is RDO]pics.practicalmalwareanalysis.com이라는 문자열이 있다.
여기서 D만큼 더한 위치는 pics.practicalmalwareanalysis.com 문자열이다.
정리하면, gethostbyname의 인자인 eax는 pics.practicalmalwareanalysis.com 문자열을 가리키고 있다. 따라서 해당 도메인의 IP 주소를 얻기 위한 DNS 요청을 한다.
5. 0x10001656에 있는 서브루틴에서 IDA Pro는 지역 변수 몇 개를 인지하고 있는가?
6. 0x10001656에 있는 서브루틴에서 IDA Pro는 파라미터 몇 개를 인지하고 있는가?
(IDA Pro Free 기준) 20개의 지역 변수를 인지하고 있고, 1개의 파라미터를 인지하고 있다.
지역 변수는 음의 오프셋에 대응하고, 파라미터는 양의 오프셋으로 참조한다.
7. Strings 윈도우를 이용해 디스어셈블리 내의 문자열 \cmd.exe /c를 찾아보자. 어디에 있는가?
10095B34에 있다.
8. \cmd.exe /c를 참조하는 코드 영역에서 무슨 일이 발생하는가?
cmd상에서 cmd.exe /c notepad.exe 명령과 notepad.exe 명령의 차이점
cmd.exe /c notepad.exe 명령은 notepad.exe가 종료되기 전에는 프롬프트로 제어권이 돌아오지 않는다.
반면에 notepad.exe 명령은 notepad.exe를 실행시키고 바로 프롬프트로 제어권이 돌아온다.
따라서 이 문제에서는 cmd.exe /c를 통해 어떠한 동기화를 위해 대기하는 작업을 한다고 추측할 수 있다.
\cmd.exe /c의 xrefs를 확인하여 해당 위치로 이동한다.
GetSystemDirectory를 통해 현재 환경에 대한 정보를 얻어서 환경에 따라 cmd.exe를 실행시킬지, command.exe를 실행시킬지 나뉜다.
그 후 memcmp함수를 통해 cmd로 들어온 명령어와 cd, exit, uptime 등의 문자열과의 비교를 통해 계속해서 분기해 나간다.
이러한 계단식의 분기 구조는 백도어에서 흔히 볼 수 있는 구조이기도 하다.
또한 Encrypt Magic Number For This Remote Sheel Session이라는 문자열이 존재하는데, 이는 원격 셸 세션이라고 추측할 수 있다.
9. 같은 영역 0x100101C8에서 dword_1008E5C4는 경로를 지정하는 전역 변수로 보인다. 악성코드는 어떻게 dword_1008E5C4를 설정하는가?(힌트: dword_1008E5C4의 상호 참조를 이용하라)
dword_1008E5C4의 상호 참조이다. 여기서 첫 번째 참조만이 값에 영향을 주고있으므로 해당 참조를 확인해야 한다.
첫 번째 참조 영역이다. mov 명령으로 1008E5C4에 eax 값을 넣고있다.
여기서 eax 값은 위의 call 명령의 반환 값이므로 어떤 반환 값인지 확인해야 한다.
따라서 sub_10003695 영역으로 이동한다.
이 함수 내에서는 GetVersionExA 함수를 호출한다. 이 함수는 현재 운영체제 정보를 얻는 함수이다.
dwPlatformId와 2를 비교해서 al 값을 세팅하려고 한다. 2는 VER_PLATFORM_WIN32_NT이므로,
VER_PLATFORM_WIN32_NT일 경우에 AL이 설정된다.
위 과정을 통해 dword_1008E5C4에는 운영체제 버전이 저장된다.
10. 0x1000FF58에서 서브루틴으로 수 백 라인은 문자열을 비교하기 위한 일련의 memcmp 비교다. robotwork와 문자열 비교가 성공적으로 이뤄지면 무슨 일이 일어나는가?(memcmp가 0을 반환)
robotwork와 문자열 비교가 성공적으로 이루어지면(memcmp가 0을 반환하면) eax에 0이 저장되고, test eax, eax를 통해 ZF를 1로 세팅하여 jnz명령을 건너뛰고, sub_100052A2 함수를 호출한다.
sub_100052A2 함수의 영역이다.
RegOpenKeyExA 함수는 현재 운영체제 정보에 대한 레지스트리의 핸들을 성공적으로 반환하면 ERROR_SUCCESS(0x00) 값이 반환되므로 ZF가 1로 세팅되어 jz 명령에 의해 loc_10005309로 점프한다.
loc_10005309 영역이다.
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion 중에서 WorkTime의 레지스트리 값을 가져온다.
그 후 정수형 데이터로 변환하여 [Robot_WorkTime: ] %d로 값을 출력해 준다.
그리고, sub_100038EE 함수를 호출한다.
sub_100038EE 함수 영역이다.
얻은 레지스트리 값을 소켓 통신으로 전송해주는 작업을 한다.
문제의 답은 HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WorkTime 레지스트리 값을 전송한다.
함수 호출 관계를 그래프로 한 눈에 볼 수 있다. 이 그래프로 이 함수가 어떤 역할을 하는지 어느정도 기능 파악이 가능하다.
'악성코드분석 > 실전 악성코드와 멀웨어 분석' 카테고리의 다른 글
실전 악성코드와 멀웨어 분석 실습 6-1 (0) | 2021.11.18 |
---|---|
실전 악성코드와 멀웨어 분석 실습 5-1 (11~21) (0) | 2021.11.16 |
실전 악성코드와 멀웨어 분석 실습 3-3 (0) | 2021.11.13 |
실전 악성코드와 멀웨어 분석 실습 3-2 (0) | 2021.11.12 |
실전 악성코드와 멀웨어 분석 실습 3-1 (0) | 2021.11.12 |