6번문제입니다. 악성코드의 Flow(디버거에서 볼 수 있는 graph) 의 일부분을 보고 이 프로그램의 Thread Mutex가 무엇인지 알아내는 문제입니다.
Thread Mutex란 무엇일까요? 쓰레드는 말그대로 쓰레드이고 Mutex란 Mutual 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 |