CodeEngn Malware06 풀이
Wargame | CTF/Reversing

CodeEngn Malware06 풀이

6번문제입니다. 악성코드의 Flow(디버거에서 볼 수 있는 graph) 의 일부분을 보고 이 프로그램의 Thread Mutex가 무엇인지 알아내는 문제입니다.

Thread Mutex란 무엇일까요? 쓰레드는 말그대로 쓰레드이고 MutexMutual Exclusion 의  합성어로써 번역하면 상호배제라는 뜻입니다. Critical Section을 가진 Thread들의 running time이 서로 겹치지 않게, 각각 단독으로 실행되게 하는 기술입니다.

 * Critical Section : 프로그램 상에서 동시에 실행될 경우 문제을 일으킬 수 있는 부분.

 

그럼 문제로 돌아와서 이 흐름그래프에서 여러 쓰레드가 공유자원을 접근하는 부분이 있을것이고, 그부분을 제어하는 Thread Mutex를 찾는문제 같은데요 일단 흐름그래프를 봐야지 정확하게 알 수 있을 것 같습니다.

플로우그래프 첫부분에 있는 CreateMutex 함수부터 알아보면 첫 파라메터인 lpMutexAttributes

SECURITY_ATTRIBUTES의 구조체 포인터로써 NULL 값을 지정할 경우, 자식프로세서로 상속이 불가능 하다고 합니다. 두번쨰 파라미터인 bInitialOwner가 가장 중요한데요이 값이 TRUE로 세팅됐을 경우 Mutex를 호출한 스레드가 소유권을 가지게 됩니다. 소유권을 가지게 된다는 말은 Mutex를 가지고 있을경우 해당 쓰레드가 실행된다는 뜻입니다. 이 값이 FALSE로 세팅 될 경우 Mutex를 가지지 않은채로 쓰레드가 생성이 되고 WaitForSingleObject와 같은 함수를 통하게 될 경우 해당 쓰레드가 소유권을 가지게 됩니다. 이 경우 해당 소유권은 ReleaseMutex를 호출 하거나 해당 스레드가 종료 될 때까지 유지됩니다. 세번째 파라미터는 Mutex Object의 이름을 지정할 수 있는 부분입니다.

인터넷에있는 CreateMutex 예제로 실습을 한번 해보았습니다.

Mutex를 이용하지 않을시 두개의 쓰레드를 통한 숫자 증가는 200000이 되지않습니다. 이유는 두 쓰레드가 같은 공유자원을 동시에 마구잡이로 접근하기 때문입니다. 이를 막기위해, Mutex라는 Lock Unlock 알고리즘을 통해 한 쓰레드씩 접근하도록 해주었습니다. Mutex를 생성하고 처음에는 아무도 소유권을 가지지않도록 하였습니다.

그리고 한 쓰레드가 쓰레드함수를 실행 시킬 때, Mutex소유권을 TRUE 로만들어 본인이외에는 해당 자원에 접근할 수 없도록 합니다. 그리고 숫자를 증가시킨후, Mutex소유권을 FALSE로 만듭니다.

이렇게 해주면 정상적으로 숫자 증가가 이루어져 의도한대로 200000이 찍히게 됩니다.


플로그래프를 보면 CreateMutex을 호출하고(이름이 bagla_super_downloader_1000) GetLasetError 함수를 사용하는데, 이름이 같은 뮤텍스커널오브젝트가 이미 생성되어있으면 0x0B7이 반환된다고 합니다.

밑의 flow를 보시면 CreateMutex 함수 이후로 0x0B7값을 비교해서 분기하는 구문이 있습니다.


정상적으로 Mutex가 만들어 졌다면, RegisterServiceProcess라는 함수주소를 얻어옵니다.

여기서 이 RegisterServiceProcess라는 함수는 구글에서 찾아본 결과 undocumented API로써 msdn에도 나와있지 않은 함수이며, 작업관리에서 프로그램을 숨길 수 있다고 한다. 첫번째파라미터로 핸들을 넘겨주고, 두번째 파라미터로 1을넘겨주면 숨길수있고, 0을넘겨주면 다시 보이게 할 수 있습니다.


쓰레드를 만들고, CreateMutex 함수를 사용하였습니다. (bInitialOwner = 1) 현재 이 함수를 실행한 쓰레드가 권한을 갖고 있습니다


Url를 파라미터로 받는 어떠한 함수를 수행한후, ReleaseMutex함수를 통하여 소유권을 반환해줍니다. 그리고 핸들도 닫아주었습니다.

 

다시 처음으로 돌아와서 , 이프로그램의 Thread Mutex가 무엇인지 묻고있습니다. 아마도 Mutex의 이름을 묻고있는 것 같네요. 쓰레드를 만들고, CreateMutex를 해주고 있는 부분을보면 인자로 smtp_bagla_1000 이라는 문자열을 넘겨주고 있습니다. 이문자열이 Mutex 이름입니다


'Wargame | CTF > Reversing' 카테고리의 다른 글

CodeEngn Malware08 풀이  (0) 2018.08.07
CodeEngn Malware07 풀이  (0) 2018.08.07
CodeEngn Malware05 풀이  (0) 2018.08.07
CodeEngn Malware04 풀이  (0) 2018.08.07
CodeEngn Malware03 풀이  (0) 2018.08.07