Practical Malware Analysis 9-2
실습 9-2
실습 환경 : Vmware (Windows 7 32 bit)
사용한 툴 : Ollydbg, IDA Free, Strings, NetCat, ApateDNS
프로그램을 분석하기 전에 Strings를 사용하여 문자열을 확인해 보면
눈에 띄는 문자열은 cmd 하나만 볼 수 있었다.
이제 IDA를 사용하여 프로그램을 열고 살펴보면
프로그램 main의 위치를 확인할 수 있다
main 함수의 위치를 확인했으니 Ollydbg로 프로그램을 살펴보면
00401626 주소에서 main 함수를 호출하는 것을 확인할 수 있고 이곳에 브레이크 포인트를 걸고 실행한 뒤 F7로 함수 내부에 들어가 main을 분석해보면
이렇게 스택에 무엇인가 값을 구성하고 있는 것을 확인할 수 있다. 어떠한 값이 저장되는지 알아보기 위해 00401133에 Follow in Dump -> Memory address 를 사용한 뒤에 프로그램 진행 후 살펴보면
위와 같이 1qaz2wsx3edc ocl.exe를 확인할 수 있었다.
분석을 진행해보면
특정 위치의 메로리를 0으로 초기화 시키고 그 구간에 GetModuleFileName 함수로 가져온 실행파일의 경로를 넣는 것을 확인할 수 있었다.
분석을 진행해보니 00401550함수를 호출하는 것을 볼 수 있었는데 이를 IDA로 살펴보니 strrchr 함수인 것을 알 수 있었다.
Ollydbg로 다시 돌아와 어떤 역할을 하는지 실행을 해보니 /(0x5c)와 GetModuleFileName 함수로 가져온 실행 파일경로를 파라미터로 받아 뒤에서 부터 /를 검색하여 실행 파일의 이름을 가져와 eax에 반환 하는 것을 확인할 수 있었다.
계속 진행해보면 004014C0 함수를 호출하는 것을 볼 수 있는데 IDA에서 이를 살펴보니 strcmp 함수인 것을 확인할 수 있었다.
이를 분석해보면 edx에 strrchr 함수를 통하여 얻은 /Lab09-02.exe 를 넣고 1을 더하여 Lab09-02.exe 값을 얻은 뒤 eax에 넣는다. 그리고 ecx에 ocl.exe를 넣고 strcmp 함수를 사용하여 값이 같으면 0을 반환하고 다르면 1을 반환하는데 1을 반환할 경우
004013D6으로 점프하여 함수를 종료한다. 정리하면 프로그램의 이름을 ocl.exe로 하고 실행해야 한다는 것 이다.
이제 프로그램의 이름을 ocl.exe로 변경한 뒤 다시 Ollydbg로 실행해보면 매끄럽게 진행되는 것을 확인할 수 있다.
00
분석을 진행하니 WSAStartup과 WSASocket 함수를 확인할 수 있는데 소켓을 생성하여 네트워크 기능을 하는 것을 알 수 있다.
그리고 00401089 함수를 확인할 수 있는데 이를 분석해보면
3F 만큼 edi 레지스터에 들어있던 주소의 데이터를 0으로 초기화 시키고 eax에 1qaz2wsx3edc 값을 넣은뒤 함수 00401440을 실행하는 것을 확인할 수 있는데 이를 IDA에서 찾아보면
strlen 함수인 것을 확인할 수 있고 Ollydbg로 실행을 해보면 eax에 1qaz2wsx3edc의 길이 값인 c가 들어있는 것을 확인할 수 있다. 계속해서 진행을해보면
local.65에 strlen 함수가 반환한 문자의 길이 값을 넣고 local.66을 0으로 초기화 한다. 그리고 004010E3으로 점프하여 20과 비교하는데 20보다 크거나 같으면 0040111D로 점프하여 반복문을 탈출하고 아니면 반복문을 계속 진행한다.
분석을 해보면 arg.2에 있는 주소에 난독화된 데이터를 1qaz2wsx3edc와 xor하여 디코딩해 eax+ebx-100 주소에 저장하는 것을 확인할 수 있는데 이는 문자열 www.practicalmalwareanalysis.com이다.
이제 메인함수로 돌아와 분석을 진행해보면
gethostbyname 함수를 사용하여 www.practicalmalwareanalysis.com 도메인의 IP주소를 가져오고 인자 0x270f(9999)를 주고 htons를 호출한다.
그 다음 connect를 사용하여 TCP포트 9999번에서 www.practicalmalwareanalysis.com으로 연결한다.
만약 실패할 경우 30000ms 동안 Sleep한 뒤에 0040124C로 되돌아간다.
프로그램이 정상적으로 동작할 수 있게 NetCat과 ApateDNS를 사용하여 인터넷 연결을 한 뒤 다시 Ollydbg로 진행해보면
ApateDNS에 도메인을 확인할 수 있고 프로그램이 정상적으로 0040137A로 진행된 것을 확인할 수 있다.
분석을 진행해보면 00401000 함수를 확인할 수 있는데 이를 분석해보면

004013E0 함수를 2번 호출하는 것을 볼 수 있는데 이를 IDA에서 살펴보면
memset 함수 인 것을 확인할 수 있다. 계속해서 진행해 가면
위와 같이 어떠한 값을 설정하는 것을 확인할 수 있는데 이를 IDA를 이용하여 살펴보면
STARTUPINFO 구조체의 값을 설정하는 것을 확인할 수 있다. 일단 처음에 플래그 값을 설정하여 wshowwindow와 hstdinput, hstdouput, hstderror 파라미터를 사용하게 한 뒤 wshowindow 값을 0으로 설정하여 윈도우 창을 볼 수 없게 하고 STARTUPINFO 구조체 내의 표준 스트림 (input, output, error)를 소켓으로 구성하는 것을 볼 수 있다.
그 뒤 CreateProcess 함수를 사용하여 cmd를 여는데 윈도우 창을 볼 수 없게 설정 하였으므로 사용자가 볼 수 없고 표준 스트림을 소켓으로 구성하였으므로 소켓으로 들어오는 모든 데이터를 cmd.exe로 전송하고 cmd.exe가 생성한 모든 결과 값을 소켓으로 전달한다. 즉 리버스 쉘임을 알 수 있다.
요약하면 악성코드는 실행하기전에 ocl.exe란 이름으로 변경한 뒤 실행해야 하며 난독화 되어 있던 도메인 www.practicalmalwareanalysis.com으로 포트 9999번을 사용하여 cmd.exe로 리버스 쉘을 연결 하는데 사용자는 이를 볼 수 없다.
[01] 바이너리에서 정적으로 어떤 문자열을 볼 수 있는가?
cmd 문자열 하나만 볼 수 있다.
[02] 이 바이너리를 실행했을 때 어떤 일이 발생하는가?
별다른 행위 없이 바로 종료한다.
[03] 이 샘플이 악의적인 패이로드(payload)를 실행하게 하기 위해서는 어떻게 해야 하는가?
프로그램 이름을 ocl.exe로 변경하고 실행한다.
[04] 0x00401133에서 어떤 일이 발생하는가?
스택에 문자열을 구성한다. 문자열을 난독화 하기 위해 공격자들이 사용한다.
[05] 하위 루틴 0x00401089에 어떤 파라미터가 전달됐는가?
문자열 1qaz2wsx3edc와 0으로 초기화 시킨 버퍼에 대한 포인터를 전달한다.
[06] 이 악성코드는 어떤 도메인을 사용하는가?
practicalmalwareanalysis.com 도메인을 사용한다.
[07] 어떤 인코딩 루틴을 사용해 도메인 이름을 난독화했는가?
악성코드는 인코딩된 도메인 문자와 1qaz2wsx3edc를 xor하여 디코딩 한다.
[08] 0x0040106E에서 CreateProcessA 호출은 어떤 의미를 가지고 있는가?
표준 스트림을 소켓에 설정하고 wshowwindow를 0으로 설정하여 사용자에겐 보이지 않는 cmd.exe 창을 띄우고 리버스 쉘을 생성한다.
Ollydbg가 심볼이 부족하기 때문에 IDA를 같이 사용하여 인식이 되지 않던 함수들을 찾아 분석을 진행했습니다.