# Simple Reverse - 0x18(2023 Lab - WinMalware - sub_140001120)
## Description
> 分析 eductf-lab.exe 中的 function sub_140001120 在做什麼,並找出其所建立的 Mutex 的名稱。
> Flag format: FLAG{mutex_name}
## Background
* [CreateMutexA](https://learn.microsoft.com/zh-tw/windows/win32/api/synchapi/nf-synchapi-createmutexa)
* [GetLastError](https://learn.microsoft.com/zh-tw/windows/win32/api/errhandlingapi/nf-errhandlingapi-getlasterror)
* [使用 Mutex 物件](https://learn.microsoft.com/zh-tw/windows/win32/sync/using-mutex-objects)
> 可以使用 mutex 物件 來保護共用資源,避免多個執行緒或進程同時存取。 每個執行緒都必須等候 mutex 的擁有權,才能執行可存取共用資源的程式碼。 例如,如果數個執行緒共用資料庫的存取權,執行緒可以使用 mutex 物件一次只允許一個執行緒寫入資料庫。
* [系統錯誤碼 (0-499)](https://learn.microsoft.com/zh-tw/windows/win32/debug/system-error-codes--0-499-)
> ERROR_ALREADY_EXISTS
> 183 (0xB7)
> 無法建立檔案,該檔案已存在。
## Source code
* sub_140001120
:::spoiler IDA Source Code
```cpp
int sub_140001120()
{
HANDLE MutexA; // rax
int i; // [rsp+20h] [rbp-78h]
int v3[2]; // [rsp+30h] [rbp-68h]
CHAR Name[32]; // [rsp+38h] [rbp-60h] BYREF
char v5[32]; // [rsp+58h] [rbp-40h] BYREF
v3[0] = 1684234874;
qmemcpy(v5, &unk_140003348, 0x1Dui64);
for ( i = 0; i < 28; ++i )
Name[i] = *(v3 + i % 4) ^ v5[i];
MutexA = CreateMutexA(0i64, 1, Name);
if ( MutexA )
{
LODWORD(MutexA) = GetLastError();
if ( MutexA == 183 )
exit(0);
}
return MutexA;
}
```
:::
## Recon
這一題有個小地方要注意,雖然觀察過source code是非常簡單的建立mutex的操作,題目想要知道的mutex name也非常簡單,只是個xor就知道的東西,不過在實作上需要注意endian的問題,一開始我是直接按照`0x64, 0x63, 0x62, 0x7A`的順序,但結果輸出一些ascii的字元,其實他是從後面讀進來再開始操作xor
* Malware使用Mutex的用途
* 與一般程式相同,用於跨 process / thread 間的 synchronization
* 避免重複感染、勒索 (LockBit 3.0、RedLine Stealer)
## Exploit
```python
f = [0x0E, 0x0A, 0x52, 0x51, 0x25, 0x2B, 0x57, 0x3B, 0x4E, 0x3D, 0x0E, 0x11, 0x0E, 0x51, 0x1B, 0x3B, 0x11, 0x53, 0x2F, 0x28, 0x25, 0x31, 0x14, 0x0D, 0x0E, 0x01, 0x2B, 0x64]
# v3 = [0x64, 0x63, 0x62, 0x7A]
key = [0X7A, 0X62, 0X63, 0X64]
Name = []
for i in range(len(f)):
Name.append(chr(key[i % 4] ^ f[i]))
print("Flag: FLAG{" + "".join(Name) + "}")
```
Flag: `FLAG{th15_I4_4_mut3x_k1LL_SwitcH}`