촉촉한초코칩
[CodeEngn] Malware L06 본문
먼저 Thread Mutex가 무엇인지 찾아보았다.
Thread Mutex
- Mutex는 여러 스레드가 동시에 공유 자원에 접근하는 것을 방지하기 위해 사용되는 동기화 메커니즘
- 동시에 하나의 스레드만 특정 자원에 접근할 수 있도록 보장한다.
흐름을 살펴보면서 분석해본다.
먼저 CreateMutexA를 통해 mutex를 생성한다.
만약 조건문에서 false가 되면, push eax를 통해 hMutex를 스택에 넣고 ReleaseMutex를 실행한다.
만약 조건문에서 true → true로 이어진다면,
Thread를 실행하고, CreateMutexA를 실행한다.
여기서도 ReleaseMutex를 실행한다.
Mutex 작동 원리는 다음과 같다.
- Lock (잠금): 스레드가 공유 자원에 접근하기 전에 뮤텍스를 잠근다.
- Critical Section (임계 영역): 잠긴 상태에서 해당 스레드는 안전하게 공유 자원에 접근한다.
- Unlock (잠금 해제): 스레드가 작업을 마치면 뮤텍스를 해제하여 다른 스레드가 자원에 접근할 수 있게 한다.
즉 ReleaseMutex가 실행된 다음에, Thread가 실행되어야 한다.
그리고 처음에 thread가 생성되기 전에 CreateMutex가 실행되었다.
이후에 false로 판단되면 004018BA로 이동하는데, hMutex를 스택에 넣고 ReleaseMutex를 실행하여 뮤텍스를 잠근다.
여기서 실행되는 함수들이 문제인줄 알았는데 감을 못잡겠어서.. 검색찬스를..썼다..
해당 Flow의 문제점은
여러개의 스레드가 동시에 자원에 접근하게 될 때 하나 이상의 스레드의 작업이 제대로 적용되지 않는 것이다. (lock을 걸지 않아서 생기는 문제..?)
flow에는 CreateMutexA로 먼저 첫번째 뮤텍스를 생성한다. 이후에 loc_401911에서 두번째 뮤텍스를 생성한다.
CreateMutexA 함수는 세번째 인자로 뮤텍스 객체 이름을 받고 있다. 이 이름이 Thread Mutex의 정답..?
참고 : https://hobak-gamja.tistory.com/40
문제점에 대해 더 분석해보자면 CreateMutexA는 두번 호출되었다.
CreateMutexA는 뮤텍스 객체를 생성하는 함수로, 기본적으로 뮤텍스 이름을 사용하여 뮤텍스를 생성한다.
여러번 호출하게 되면 두번째 호출은 기존에 생성된 뮤텍스를 반환하게 된다.
이름이 동일하면 새로 뮤텍스를 생성하지 않으므로 시스템 자원을 낭비하지 않는다.
만약 이름이 다르면 각각 다른 뮤텍스 객체가 생성된다.
악성코드에서는 뮤텍스를 두번 호출하여 의도치 않게 경쟁 상태나 데드락을 유발 할 수 있다.
위 흐름대로 두번째 뮤텍스를 생성하게된다면, 뮤텍스가 잠겨있지 않은 상태에서 호출되는 것이다. 이렇게 된다면 다중 스레드에서 뮤텍스를 경쟁하거나, 의도된 동기화가 이루어지지 않게 된다.
→ 이러한 흐름을 유도한 것 같다..
'Study > MISC' 카테고리의 다른 글
[Dreamhack] set-int (0) | 2025.01.14 |
---|---|
[Dreamhack] Just read flag (0) | 2024.11.13 |
[Dreamhack] 산타 할아버지도 힘들어요 (0) | 2024.10.29 |
[Dreamhack] whatsdifferent (1) | 2024.10.02 |
[Dreamhack] file-special-bit (0) | 2024.09.29 |