Dreamhack/Dreamhack Wargame (Challenge)

[112] IT 비전공자 [dreamhack][CodeEngn] Malware L06문제 풀기

imaginefuture-1 2024. 12. 31. 08:58

Thread Mutex?

 

 

 

 

Thread Mutex란?

Thread Mutex(Mutual Exclusion, 상호 배제)는 멀티스레드 프로그래밍에서 공유 자원의 동시 접근 문제를 해결하기 위한 동기화 메커니즘입니다.


왜 Mutex가 필요한가?

멀티스레드 환경에서는 여러 스레드가 동시에 실행되며, 공유 자원(예: 메모리, 파일, 데이터베이스 등)에 접근하는 경우 데이터가 손상될 수 있습니다. 이를 **Race Condition(경쟁 상태)**라고 합니다.
Mutex는 공유 자원에 대한 접근을 하나의 스레드로 제한하여 이러한 문제를 방지합니다.


Mutex의 작동 방식

  1. 잠금(Lock):
    • 스레드가 공유 자원에 접근하기 전에 Mutex를 잠급니다.
    • 다른 스레드들은 Mutex가 해제될 때까지 대기해야 합니다.
  2. 해제(Unlock):
    • 작업이 완료되면 Mutex를 해제합니다.
    • 대기 중인 다른 스레드 중 하나가 Mutex를 얻고 공유 자원에 접근할 수 있습니다.

Mutex의 주요 특징

  • 상호 배제(Mutual Exclusion): 한 번에 하나의 스레드만 공유 자원에 접근할 수 있습니다.
  • Thread-safe: 공유 자원을 안전하게 보호할 수 있습니다.
  • Deadlock 위험: 올바르게 사용하지 않으면 여러 스레드가 무기한 대기 상태에 빠질 수 있습니다.

Mutex의 간단한 예제 (C++)

#include <iostream>
#include <thread>
#include <mutex>

std::mutex mtx;  // Mutex 객체 생성
int shared_data = 0;

void thread_function(int id) {
    mtx.lock();  // Mutex 잠금
    std::cout << "Thread " << id << " is accessing the shared data.\n";
    shared_data += 1;
    std::cout << "Shared data: " << shared_data << "\n";
    mtx.unlock();  // Mutex 해제
}

int main() {
    std::thread t1(thread_function, 1);
    std::thread t2(thread_function, 2);

    t1.join();
    t2.join();

    return 0;
}

결과:

Thread 1 is accessing the shared data.
Shared data: 1
Thread 2 is accessing the shared data.
Shared data: 2

Mutex의 장점

  • 데이터 보호: Race Condition 방지.
  • Thread-safe: 멀티스레드 프로그램에서 안정성 보장.

Mutex의 단점

  • Deadlock: 스레드가 서로의 Mutex를 기다리다가 교착 상태에 빠질 수 있습니다.
  • 성능 저하: 스레드가 Mutex를 기다리며 대기하는 동안 자원을 낭비할 수 있습니다.

Mutex와 관련된 개념

  1. Recursive Mutex:
    • 같은 스레드에서 여러 번 잠글 수 있는 Mutex.
    • 반드시 잠근 횟수만큼 해제해야 함.
  2. Spinlock:
    • 스레드가 Mutex를 얻을 때까지 반복적으로 확인하며 기다림.
    • 간단하지만 CPU 자원을 더 많이 소비.
  3. Deadlock 방지 방법:
    • 항상 Mutex를 얻는 순서를 일정하게 유지.
    • try_lock()과 같은 함수를 사용하여 대기 시간을 제한.

결론

Thread Mutex는 멀티스레드 환경에서 공유 자원을 안전하게 관리하기 위한 중요한 도구입니다. 올바른 설계와 사용법으로 Mutex를 활용하면 프로그램의 안정성과 데이터 일관성을 보장할 수 있습니다.

 

 

 

밥(메모리) 먹을려면 차례대로 기다려야 이넘들아st ㅋㅋㅋㅋㅋㅋㅋ
공유자원은 늘 소중하지...!

 

 

 

flow 보러가보자

 

 

 

 

 

createMutex()함수가 보인다

 

 

createMutex()함수가 보인다




살펴보면 CreateMutex함수로 Mutex를 생성하는 것을 볼 수 있는데 어떻게 구성되어 있는지 살펴보면 아래와 같다.
HANDLE CreateMutexA(  
LPSECURITY_ATTRIBUTES lpMutexAttributes,
  BOOL                  bInitialOwner,
  LPCSTR                lpName );
IpMutexAttributes 매개변수는 SECURITY_ATTRIBUTES구조에 대한 포인터이고
이 매개변수 값이 NULL이면 자식 프로세스가 핸들을 상속할 수 없다.  
bIntialOwner 매개변수는 이 값이 TRUE(1)이고 호출자가 Mutex를 만든 경우
호출 스레드는 Mutex 개체의 초기 소유권을 얻는다.
즉 Mutex를 생성한 스레드가 첫 번째 소유권을 가지는지 여부를 판단한다.  

IpName 매개변수는 Mutex 개체의 이름을 지정한다.
이름의 길이는 MAX_PATH characters 만큼 제한되고 이름 비교는 대소문자를 구분한다.
이미 사용하고 있는 이름으로 호출하면 MUTEX_ALL_ACCESS 액세스 권한을 요청한다.
이 경우 bInitialOwner 매개변수는 생성 프로세스에서 이미 설정되었기 때문에 무시한다.  
CreateMutex함수에 대하여 공부를 하였으니 다시 위로 돌아가서 분석을 해보면 중간에서
CreateThread함수를 호출하고 난 뒤 CreateMutex함수를 호출하는 것을 볼 수 있었고
이 구간이 Thread Mutex임을 확인할 수 있다.
Thread Mutex가 무엇인지 구하는 문제였으므로
답은 CreateMutex함수의 IpName 매개변수의 값인 smtp_bagla_1000임을 확인할 수 있다.


출처:https://surw.tistory.com/35
[화이팅:티스토리]

 

캬 ㅋㅋㅋㅋ설명 너무 완벽하고...멋있다 멋있어...

 

Thread Mutex 구하는거니까, createthread함수 호출하고 createmutex 함수 호출했으니

그 사이에있는매개변수의 값이 정답이 되는거다..!