[CodeEngn] Malware L06
# 문제
문제 링크 | https://dreamhack.io/wargame/challenges/373
[CodeEngn] Malware L06
다음은 악성코드 Flow의 일부분이다. 이 프로그램의 Thread Mutex는 무엇인가
dreamhack.io
다음은 악성코드 Flow의 일부분이다.
이 프로그램의 Thread Mutex는 무엇인가
1. Thread Mutex란 무엇인가?
여러 스레드가 동시에 자원에 접근하는 것을 막기 위한 잠금 장치. 한 스레드가 자원을 사용 중일 때 다른 스레드는 기다리게 하여, 자원이 동시에 수정되거나 손상되지 않도록 보호하는 원리. (워게임에 필요한 지식은 아니지만.. 정의를 알면 무엇을 찾아야 하는 지 알 수 있으니까..)
아래는 절대적인 Thread Mutex 구현 순서는 아니지만, 이런식의 흐름을 생각해볼 수 있다. 이를 참고하여 워게임 파일의 흐름을 살펴보자.
1. 스레드 생성 → 2. Mutex 생성 → 3. Mutex 잠금 → 4. 자원 사용 → 5. Mutex 잠금 해제 → 6. 스레드 종료
2. 실행 흐름 살펴보기(Thread와 관련한)
2.1 Start()
HANDLE CreateMutexA(
[in, optional] LPSECURITY_ATTRIBUTES lpMutexAttributes,
[in] BOOL bInitialOwner,
[in, optional] LPCSTR lpName
);
createMutexA 함수를 호출하여, 새로운 뮤텍스를 생성하는데, 위의 CreakMutexA의 매개변수 값을 push로 call 전에 넣어주는 것을 확인할 수 있다. bInitialOwner 값이 True 임으로, 생성되자마자 잠겨진 것을 확인할 수 있다.(문제는 thread mutex니까...) 함수가 성공적으로 실행되면 이에 대한 반환 값은 새로 만든 뮤텍스 개체에 대한 핸들러이다. 이 핸들러 반환값을(eax에 저장된) [ebp+h0bject] 위치에 저장하고, GetLastError를 다시 호출한다. 이후 GetLastError의 반환값과 0B7h(183)을 비교해서 false와 true로 분기하는 것이 흐름이다.
그럼 분기하는 조건, 0B7h는 무슨 값일까? 10진수로 변환 시 183, (ERROR_ALREADY_EXISTS)를 뜻하는데, 벌써 존재하는 오브젝트의 핸들을 돌려줄 때 발생하는 오류라고 한다.
2.2 loc_401911()
HANDLE CreateThread(
[in, optional] LPSECURITY_ATTRIBUTES lpThreadAttributes,
[in] SIZE_T dwStackSize,
[in] LPTHREAD_START_ROUTINE lpStartAddress,
[in, optional] __drv_aliasesMem LPVOID lpParameter,
[in] DWORD dwCreationFlags,
[out, optional] LPDWORD lpThreadId
);
thread의 ID 매개변수를 flag로 입력하면...?
# 출처
https://learn.microsoft.com/ko-kr/
Microsoft Learn: 커리어의 문을 여는 기술 구축
대화형 수업과 기술 설명서를 통해 학습하고, 전문 개발 시간과 인증을 취득하고, 커뮤니티에서 소통합니다.
learn.microsoft.com