作者:anhkgg
日期:2019年11月3日
很多時(shí)候暇韧,可能會(huì)對(duì)某個(gè)軟件進(jìn)行DLL劫持。
而這個(gè)軟件是否存在DLL劫持漏洞廊宪,需要去分析驗(yàn)證矾瘾。
比如通過IDA查看導(dǎo)入的DLL,或者LoadLibrary的DLL箭启,然后慢慢排除某些KnownDlls壕翩,排除某些絕對(duì)路徑加載的DLL...
或者通過Windbg分析。
雖然技術(shù)難度不高册烈,但是挺費(fèi)事的戈泼。
本篇文章分享我找DLL劫持的方法婿禽,不一定是最佳,不過很方便大猛。
1
首先扭倾,通過windbg啟動(dòng)軟件,設(shè)置(默認(rèn)開啟的):
Debug->Event Filters->Load module挽绩,勾選Output
然后go運(yùn)行膛壹。這樣我們可以看到運(yùn)行后,軟件導(dǎo)入表導(dǎo)入的DLL唉堪,以及LoadLibrary加載的DLL的所有文件模聋,如下所示:
ModLoad: 75090000 750cb000 C:\Windows\system32\rsaenh.dll
ModLoad: 757c0000 757cc000 C:\Windows\system32\CRYPTBASE.dll
ModLoad: 778b0000 778da000 C:\Windows\system32\imagehlp.dll
ModLoad: 77860000 778a5000 C:\Windows\system32\WLDAP32.dll
2
寫一個(gè)測試的DLL,只用下面的代碼:
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
char path[MAX_PATH] = { 0 };
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
OutputDebugStringA(path);
OutputDebugStringA("success!");
MessageBoxA(NULL, "success!", "Tips", MB_OK);
ExitProcess(0);
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
然后講DLL改名成劫持目標(biāo)DLL唠亚,放到軟件目錄下链方,運(yùn)行驗(yàn)證即可。
如果出現(xiàn)提示success
則表示該目標(biāo)DLL劫持成功灶搜。
3
如果DLL太多了祟蚀,一一驗(yàn)證排除肯定很麻煩,所以程序員又要寫代碼了割卖。
寫一個(gè)自動(dòng)批量驗(yàn)證的工具前酿,基本思路如下:
- 把windbg拿到的dll列表保存下來
- 準(zhǔn)備好測試DLL,DLL中加入寫log功能
- 分析dll列表鹏溯,一一把測試DLL拷貝為目標(biāo)dll罢维,啟動(dòng)軟件
- 然后把log提取出來,可以看到成功劫持的dll
工具界面如上丙挽,一鍵驗(yàn)證所有DLL肺孵,分分鐘拿到結(jié)果。
工具會(huì)分享到https://github.com/anhkgg/anhkgg-tools下取试,歡迎使用悬槽,如有bug,請(qǐng)聯(lián)系我瞬浓。